Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Здесь МК все время находится в состоянии непрерывного опроса UART на прием, что не мешает ему выполнять свою работу в прерываниях. Как только по UART приходит байт, запрещаются прерывания, пришедший байт последовательно сравнивается с известными командами. В зависимости от значения байта происходит переход на выполнение той или иной процедуры, либо просто разрешаются прерывания, и основной цикл возобновляет работу. В процедурах перед возвратом к основному циклу, как видите, предусмотрено разрешение прерываний. Вызываемая первыми двумя командами процедура inisek для инициализации часов и установки секунд, а также процедура чтения данных из памяти ReadFullFlash описаны в главе 12. Остальные процедуры мы сейчас распишем, листинг 13.8 иллюстрирует ReadTime.

Листинг 13.8
ReadTime: /вывод часов в порядке ЧЧ:ММ ДД.мм.ГГ rcall ReadClk ,
ldi ZH,1 /старший адрес RAM
ldi ZL,Hour /адрес часов Id temp,Z
rcall out_com
ldi ZL,Min /адрес минут Id temp,Z
rcall out_com
ldi ZL,Sek /адрес секунд Id temp,Z
rcall out_com
ldi ZL,Date /дата Id temp,Z+
rcall out_com
Id temp,Z+ /читаем месяц rcall out_com
Id temp,Z /читаем год rcall out_com ret

Начинается процедура ReadTime с вызова процедуры ReadClk для чтения истинных значений времени из часов и записи их в память (она описана в главе 12). Адреса компонентов времени в SRAM (Hour, Min и т. п.) также см. в главе 12. Так как их последовательность размещения в памяти отличается от той, в которой время необходимо посылать в компьютер (в памяти расположение начинается с секунд, а в ПК время удобно демонстрировать в нормальном формате ЧЧ:ММ:СС), то приходится в начале индивидуально адресовать каждую ячейку.

Процедура установки часов SetTime более громоздкая, т. к. обновлять значения приходится в трех местах— в самих часах и в памяти упакованные и распакованные (для индикации) десятичные значения. Для лучшей читаемости разделим процедуру на две: чтение значений из ПК (sciock) и запись значений в нужные места (собственно SetTime). Процедуру Setcik для записи значений непосредственно в часы, описание адресов памяти также см. в главе 12. Для перевода BCD-значений секунд в hex-значения понадобится специальная процедура HEXtime (листинг 13.9).

Листинг 13.9
/Процедура преобразования BCD в hex, специально для времени HEX_time: ;на входе в ZL адрес сек, часы или минуты ;на выходе в temp hex-значение, Id temp,Z ;
andi temp, 0Ы1110000 /распаковываем - старший swap temp /старший в младшей тетраде mul temp,multlO /умножаем на 10 в гО результат Id temp,Z /
andi temp,ObOOOOllll /младший add temp,гО /получили hex

ret
Sciock: /получить из ПК 6 байт и записать в память ldi ZH, 0x01 /старший RAM ldi
ZL,Sek /Ram rcall in_com st Z+,temp /sek rcall in_com st Z+,temp /min rcall in_com st Z+,temp /часы rcall in_com st Z+,temp /data rcall in com
st Z+,temp ;месяц
rcall in_com
st Z,temp ;год rcall SetClk ret
SetTime: /установка текущих значений в МК
rcall Sclock /читаем упакованные значения в память
ldi ZL,Sek /упакованные секунды
rcall HEX_time /hex-секунды в temp
mov count_sek,temp /инициализация счетчика секунд
ldi ZL,Hour /часы распаковываем Id temp,Z mov data,temp
andi temp,ObOOOOllll /младший часов ldi ZL,DeH st Z,temp
andi data, 0Ы1110000 /старший часов swap data /старший в младшей тетраде ldi ZL,DdH st Z,data

ldi ZL,Min /минуты распаковываем Id temp,Z mov data,temp
andi temp,ObOOOOllll /младший минут ldi ZL,DeM st Z,temp
andi data,ObllllOOOO ; старший минут swap data /старший в младшей тетраде ldi
ZL,DdM st Z,data
ret

Отметим, что если связь оборвется на стадии приема шести компонентов времени, МК может "повиснуть", т. к. прерывания запрещены. Но, во-первых, вероятность того, что за несколько миллисекунд, которые длится передача, это произойдет, крайне мала, а во-вторых, даже если постараться этого избежать (добавив разрешений и запрещений прерываний в нужных местах), работе МК это не поможет, т. к., скорее всего, собьется отсчет времени.

Отсчет времени может также сбиться и тогда, когда вы обновляете время в часах: процедура довольно долгая, и вероятность того, что вы попадете на переход секунд через ноль, довольно велика. Тогда часы могут внутри себя отсчитывать время правильно, а показания будут неверными. Можно попытаться "причесать" алгоритм, либо (что гораздо проще) после обновления попросту перезапускать МК (используя сторожевой таймер, см. главу 14), чтобы все значения во всех регистрах обновились "с нуля". Если вы проектируете супернадежный прибор, и хотите по-настоящему обезопасить себя от любых сбоев в таких случаях, то следует установку выполнять в два этапа: сначала только перекачать новые значения из ПК куда-нибудь на свободное место в SRAM, и лишь затем, убедившись, что обмен был корректным, обновлять время в часах (а затем для надежности еще и перезапускать МК).



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru