Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 9. Программирование таймеров 235 Разумеется, чтобы этот алгоритм правильно заработал с самого начала, в секции Reset требуется предварительно обнулить все регистры отсчета времени. Затем придется установить в них реальные значения текущего времени (число минут не должно быть бол ь ше 59, часов - больше 23 и т. д. ) . Последнее можно делать вруч­ ную - как обычно на часах, с помощью нажатия кнопок. Расписывать такой алго­ ритм в силу его громоздкости полностью мы здесь не станем. Для более удобной установки и коррекции времени применяются различные автоматизированные ме­ тоды, на которых мы остановимся позже (см. главу 15) . Вернемся к подсчету времени. Другой (точнее, первый из упомянутых) метод под­ счета времени состоит в том, что счет времени мы ведем в обычной шестнадцате­ ричной форме, а значения разрядов в ВСD-формате храним в SRAM. Причем могут понадобиться значения времени как в распакованном виде (для индикации), так и в упакованном (для обмена с «внешним миром», - например, для установки вре­ мени в отдельной микросхеме часов реального времени, RTC) . Так что реализацию этого способа мы начнем с резервирования памяти под все указанные нужды. При этом для удобства положим старший байт адреса SRAM навсегда равным единице, что равносильно использованию адресов, начиная с 256-й ячейки, и страхует нас от случайного обращения к' области регистров (для моделей вроде ATtiny23 1 3 , где объем SRAM менее 256 байтов, адреса придется менять, - об этом рассказано далее, в конце главы). Такой фрагмент программы представлен в листинге 9 . 5 . ; SRAМ старший байт адреса SRAМ = OxO l . equ Sek = 0 0 ; текущие секунды в упакованном формате . equ Min = 01 ; текущие минуты в упакованном формате . equ Hour = 02 ; текущие часы в упакованном формате ; распакованные . equ DdН = Ох0 6 ; часы старший BCD . equ DeH = Ох07 ; часы младший BCD . equ DdМ = Ох08 ;минуты старший BCD . equ DeM = Ох0 9 ;минуты младший BCD . de f temp = rl 6 ; рабочая переменная . de f templ = rl 7 ; рабочая переменная . de f cSek = rl8 ; счетчик секунд . de f cMin = rl 9 ; счетчик минут . def cHour = r2 0 ; счетчик часов T IMl_COMPA : ; прерывание по сравнению 1 сек ldi ZH, OxO l ; старший адреса SRAМ ДJIЯ сохранения в памяти inc cSek ; увеличиваем число секунд на 1 cpi cSek , 60 ; сравнить со значением 60 brne Tsek exit ; если не равно , на запись в память

RkJQdWJsaXNoZXIy MTExODQxMg==