out ADCSRA,temp
;установка таймера
ldi temp,0b00000010
out TCCR0,temp
;Timer0 on div 1:8 управление разрядами 2000 Гц
;прерывания
ldi temp,(1< ;разр. прер. Timer 0
out TIMSK,temp
ldi temp,255 ;сбросить все прерывательные флаги
out TIFR,temp
out GIFR,temp
;начальная установка переменных
ldi r29,1 ;YH=1, пишем в RAM, начиная с 01:00
clr count
clr countCyk
clr cRazr
clr Flag
sbr Flag,0x01 ; сначала измеряем температуру
;обнуление рабочих ячеек
clr temp
ldi r28,Tram ;Tempr
st Y+,temp
st Y,temp
ldi r2 8,Pram ;Prs
st Y+,temp
st Y,temp
;запись коэффициентов
ldi r28,tZH ;начальный адрес
;Z Tempr=471
ldi temp,High(471) ;ст.
st Y+,temp
ldi temp,Low(471) ;мл.
st Y+,temp
;К Tempr=1020
ldi temp,High(1020) ;ст.
st Y+,temp
ldi temp,Low(1020) ;мл.
st Y+,temp
;Z prs=12
ldi temp,High(12) ;ст. на самом деле = 0
st Y+,temp
ldi temp,Low(12) ;мл.
st Y+,temp
;К prs=916
ldi temp,High(916) ;ст.
st Y+,temp
ldi temp,Low(916) ;мл.
st Y,temp
sei ;разрешаем прерывания
G_cykle: ;основной цикл
rjmp G_cykle
Процедуры обмена по интерфейсу I 2С
Протокол обмена I 2С и пример его использования описан в главе 16 . Процедуры составлены для передачи со скоростью около 100 кГц при тактовой частоте контроллера 4 МГц. При другой частоте контроллера или иной скорости передачи число циклов в процедуре delay, равное 6, следует пропорционально изменить. Например, для частоты кварца, равной 16 МГц и скорости передачи, пониженной до 30 кГц, команду ldi cnt,6следует заменить на команду ldi cnt,75(приблизительно). Ошибка в ±50 % в скорости передачи обычно роли не играет. При наличии сбоев увеличивайте число циклов до тех пор, пока связь не установится.
Программа содержит процедуры для двух конкретных устройств: энергонезависимой памяти с интерфейсом I 2С (типа АТ24) и часов реального времени (RTC) с таким же интерфейсом (например, DS1307). Процедуры Write-Flash/ReadFlash предназначены для обмена с памятью, процедуры write_i2c/read_i2c для обмена с часами. Примеры их использования см. в главе 16 . Для других устройств легко построить собственную процедуру по аналогии, если использовать универсальные процедуры формирования протокола (start, write, read и stop), находящиеся в данном тексте. Исключите ненужные процедуры перед компиляцией программы, чтобы не загромождать память МК.
Текст листинга П5.3 целесообразно скопировать в отдельный файл, и назвать его, например, i2c.prg. Готовый файл i2c.prg также доступен в архиве по адресу http://revich.lib.ru/AVR/ctp.zip, где еще содержится программа для измерителя температуры и давления, обсуждаемая в главе 16 . При необходимости использовать эти процедуры в другом устройстве следует отредактировать начальные строки, которые задают выводы МК, задействованные в процессе обмена. В данном случае это биты порта D номер 4 (SCL) и 6 (SDA). Кроме этого, конечно, следует изменить регистры для переменных, если это требуется (и при необходимости число циклов, если частота тактового генератора другая). Файл подключается к вашей программе с помощью директивы . include "i2c.prg" после таблицы векторов прерываний ( см. главу 16 ).
Листинг П5.3
;файл I2С.рrg
;Процедуры чтения и записи по интерфейсу I2C
;+----------- порт D ---------+
.equ pSCL = 4
.equ pSDA = 6
;-------------------------------
.def DATA = r17
.def ClkA = r18
.def cnt = r23
.def AddrL = r24 ;адреса EEPROM
.def AddrH = r25
;---------------- запись EEPROM ------------
WriteFlash: ;в AddrL,AddrH — адрес, данные в DATA
;на выходе если бит с = 1 в регистре флагов, то ошибка
cbi PORTD,pSDA
cbi PORTD,pSCL
ldi cnt,120 ;120 попыток прописать
loop120f:
push DATA
rcall start
ldi DATA,0xA0 ;addr device=0,r/w=0
rcall write
brcs rt_writef ;C=1 ERROR
mov DATA,AddrH ;set HI address
rcall write
brcs rt_writef ;C=1 ERROR
mov DATA,AddrL ;set LO address
rcall write
brcs rt_writef ;C=1 ERROR
pop DATA ;set data to DATA
rcall write
brcs rt_f ;C=1 ERROR
rcall stop
brcs rt_f ;C=1 ERROR
ret
;--------------- чтение EEPROM -------------
ReadFlash: ;в AddrL,AddrH — адрес, данные в DATA
;если бит с = 1 в регистре флагов, то ошибка
cbi PORTD,pSDA
cbi PORTD,pSCL
Читать дальше
Конец ознакомительного отрывка
Купить книгу