дОБРОЕ ВРЕМЯ СУТОК) ребята нужна ваша помощь.. в avr studio есть программа но сделана не до конца помогите дописать
Використання інтерфейсу І2С.
Мета: Освоїти програмні методи реалізації інтерфейсу І2С та взаємодію контролера з інтегральним датчиком температури та годинником реального часу.
Хід роботи.
1. В середовищі AVR Studio скласти та відлагодити підпрограми необхідні для програмної реалізації інтерфейсу І2С:
1.1. генератора синхроімпульсів та запису байту;
1.2. генератора синхроімпульсів та читання байту;
1.3. формування умови «старт» та «рестарт» ;
1.4. формування умови прийому та передачі імпульсу підтвердження;
1.5. формування умови «стоп» .
2. Скласти програму читання коду температури з цифрового датчика DS1621, апаратний адрес 0х90. Записати програму в пам'ять ЕОМ, та перевірити її роботу на лабораторному макеті. Цифровий код перетворити в 0С та відобразити на екрані, в разі потреби удосконалити програму.
3. Скласти програму котра зчитує поточну дату та час з годинника реального часу DS 1302 та відображає результат на дисплеї. Записати програму в пам'ять ЕОМ та перевірити роботу на макеті.
4. Доповнити програму п. 3 можливістю корекції дати та часу; вводу нових значень дати та часу. Для наглядності роботи використати РК – дисплей, текстові пояснення та мигаючий курсор.
ReStart: ; Перевірка можливості старту
SCL_Dwn ;перевести шину SCL в лог. 0
nop
SDA_Hi ; Шину SDA в 1
nop
rcall wait5us ; Цикл затримкики
nop
SCL_Up ; Наростаючий фронт SCL->1
RS1: sbis PinB,SCL ; Стан очікування відомого пристрою?
rjmp RS1
rcall wait5us ; Цикл затримки
Start:
SDA_Lo ; SDA = 0: умова старту
rcall wait4us ; Цикл затримки
Підпрограма запису байта в відомий пристрій:
WriteByte:
sec ; Прапорець переносу C = 1
rol dbyt ; Зсув вліво C->LSB, MSB->C
rjmp bit1 ; Особлива обробка для розряду 1
WriteBit:
lsl dbyt ; Якщо dbyt пустий, ..
bit1: breq GetAck ; ...то передача завершена
SCL_Dwn ; Спадаючий фронт SCL
brcc WriteLow ; Перехід, якщо прапорець C = 0
nop ; Щоб урівняти час виконання
SDA_Hi ; Встановити SDA в 1
rjmp SCL_High
WriteLow:
SDA_Lo ; Встановити SDA в 0
rjmp SCL_High ; Щоб зрівняти тривалість такту
SCL_High:
rcall wait4us ; Цикл затримки
SCL_Up ; Спадаючий фронт SCL
WB1:sbis PinB,SCL ; Стан очікування відомого пристрою?
rjmp WB1
rcall wait5us ; Цикл затримки
rjmp WriteBit
Підпрограма читання біта підтвердження:
GetAck:
SCL_Dwn ; Спадаючий фронт SCL
SDA_Hi ; SDA – високоомний стан
rcall wait5us ; Цикл затримки
SCL_Up ; Наростаючий фронт SCL
GA1:sbis PinB,SCL ; Стан очікування відомого пристрою
rjmp GA1
cbr Flg,1<
ReStart: ; Перевірка можливості старту
SCL_Dwn ;перевести шину SCL в лог. 0
nop
SDA_Hi ; Шину SDA в 1
nop
rcall wait5us ; Цикл затримкики
nop
SCL_Up ; Наростаючий фронт SCL->1
RS1: sbis PinB,SCL ; Стан очікування відомого пристрою?
rjmp RS1
rcall wait5us ; Цикл затримки
Start:
SDA_Lo ; SDA = 0: умова старту
rcall wait4us ; Цикл затримки
Підпрограма запису байта в відомий пристрій:
WriteByte:
sec ; Прапорець переносу C = 1
rol dbyt ; Зсув вліво C->LSB, MSB->C
rjmp bit1 ; Особлива обробка для розряду 1
WriteBit:
lsl dbyt ; Якщо dbyt пустий, ..
bit1: breq GetAck ; ...то передача завершена
SCL_Dwn ; Спадаючий фронт SCL
brcc WriteLow ; Перехід, якщо прапорець C = 0
nop ; Щоб урівняти час виконання
SDA_Hi ; Встановити SDA в 1
rjmp SCL_High
WriteLow:
SDA_Lo ; Встановити SDA в 0
rjmp SCL_High ; Щоб зрівняти тривалість такту
SCL_High:
rcall wait4us ; Цикл затримки
SCL_Up ; Спадаючий фронт SCL
WB1:sbis PinB,SCL ; Стан очікування відомого пристрою?
rjmp WB1
rcall wait5us ; Цикл затримки
rjmp WriteBit
Підпрограма читання біта підтвердження:
GetAck:
SCL_Dwn ; Спадаючий фронт SCL
SDA_Hi ; SDA – високоомний стан
rcall wait5us ; Цикл затримки
SCL_Up ; Наростаючий фронт SCL
GA1:sbis PinB,SCL ; Стан очікування відомого пристрою
rjmp GA1
cbr Flg,1<
Підпрограма читання біта підтвердження:
GetAck:
SCL_Dwn ; Спадаючий фронт SCL
SDA_Hi ; SDA – високоомний стан
rcall wait5us ; Цикл затримки
SCL_Up ; Наростаючий фронт SCL
GA1:sbis PinB,SCL ; Стан очікування відомого пристрою
rjmp GA1
cbr Flg,1<