Листинг 16.9
proc_F2: ;F2 читать flash
rcall ReadFullFlash
rjmp Gcykle
…
ReadFullFlash:
cli
mov YH,AddrH ;сохраняем текущий адрес в Y
mov YL,AddrL
clr AddrL ;чтение начнем с начала памяти
clr AddrH
loopRF:
cp AddrL, YL ;не дошли ли до текущего
срс AddrH, YH
breq end_RF ;если дошли, то конец чтения
rcall ReadFlash ;собственно чтение
mov temp,DATA ;данные из DATA в temp
rcall out_com ;передаем наружу
adiw AddrL,1 ;следующий адрес
rjmp loopRF
end_RF:
mov AddrH,YH ;восстанавливаем текущий адрес
mov AddrL,YL
sei
ret
Процедура эта будет долгой, если записан сколько-нибудь существенный кусок в памяти (для передачи 32 кбайт со скоростью 9600 потребуется порядка полминуты, да еще и чтение по I 2С), и на все это время прерывания будут запрещены. Для нашего измерителя это выльется только в исчезновение на это время индикации, но могут быть ситуации, когда следует предотвратить выключение контроллера на такое время — например, чтобы не потерять данные, когда настанет момент очередной записи. В дальнейшем мы учтем этот момент (хотя это, как вы увидите, сильно усложнит программу). А пока
Листинг 16.10
proc_F8: ;F8 clear address
rcall ClearAddr
rjmp Gcykle
…
ClearAddr:
cbr Flag,4 ;обнуляем бит конец памяти
clr AddrH ;обнуляем адрес
clr AddrL
clr ZH ;и записываем его в EEPROM
ldi ZL,EaddrL
mov temp,AddrL ;можно и просто clr temp
rcall WriteEEP
inc ZL
mov temp,AddrH
rcall WriteEEP
ldi temp,$AA ;ответ в комп. все Ok
rcall out_com
sei
ret
Теперь у нас есть измеритель температуры и давления, записывающий данные во внешнюю память, откуда они могут быть прочитаны в любой момент. В главе 18 мы займемся вопросом приема данных через компьютер. А здесь нам осталось только объединить измеритель с часами, чтобы можно было задавать точный и достаточно длительный интервал измерения. И для этой цели нам также пригодится интерфейс I 2С.
Часы с интерфейсом I 2С
Моделей микросхем RTC, о которых мы говорили в начале главы 14 , существует множество. Все они внутри устроены примерно одинаково, и имеют встроенный счет времени и календарь, а также функции будильника и/или таймера. Подавляющее большинство RTC имеют возможность автономной работы от батарейки в течение длительного времени, без потери однажды установленного времени. Такие часы обычно снабжены кварцем на 32 768 Гц, иногда даже встроенным в микросхему. Кроме этого, значительная часть моделей имеет дополнительный выход (иногда и не один), на котором формируется некая частота, задаваемая программно. Этот выход можно использовать для управления прерыванием микроконтроллера, и таким образом организовать счет времени и его индикацию.
Еще одна особенность микросхем RTC — величины времени в них традиционно представлены в десятичном виде (т. е. в упакованном BCD-формате). Именно так выдаются значения времени в RTC, встроенных в ПК. Например, число минут, равное 59, так и выдается, как байт со значением 59, но, как мы уже говорили, это не $59, что в десятичной системе есть 89! Соответствующее шестнадцатеричное число записалось бы как $ЗВ. BCD-представление удобно для непосредственной индикации, но при выполнении арифметических операций со временем (или, например, операций сравнения) его приходится преобразовывать к обычному двоичному виду. На самом деле это почти не доставляет неудобств, скорее наоборот.
Для наших целей выберем модель RTC под названием DS1307. Это простейшие часы с I 2С-интерфейсом, в 8-выводном корпусе с внешним резонатором на 32 768 Гц, 5-вольтовым питанием и возможностью подключения резервной батарейки на 3 В (т. е. обычной «таблетки»). Схема переключения питания на батарейку встроенная и не требует внешних элементов. Имеется вывод для прерывания МК, который может программироваться с различным коэффициентом деления частоты кварца. Мы его запрограммируем на выдачу импульсов с периодом 1 с, по внешнему прерыванию от этих импульсов в МК будем считать секунды, обновлять значение времени и производить всякие другие полезные действия — точно так же, как мы это делали в часах из главы 14 , только там отсчет времени производился внутренним таймером. Но здесь мы можем быть уверены, что при любых сбоях в МК время у нас будет отсчитываться верно.
Читать дальше
Конец ознакомительного отрывка
Купить книгу