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





Заметки на полях
Следует обратить внимание, что в МК с часовыми функциями отдельный подсчет времени обычно ведется даже тогда, когда в схеме присутствуют автономные часы реального времени, RTC (ими мы еще займемся в главе 12). Вроде бы в таком случае делать это незачем — RTC все равно считают "внутри себя", и притом не только время, но и дату, и день недели. Однако обмен данными с RTC каждую секунду займет времени значительно больше, чем собственный подсчет. Из-за этого RTC целесообразно использовать как генератор внешних прерываний, по которым и происходит подсчет времени (вместо прерываний таймера, как у нас), а синхронизировать значения можно один раз при включении системы (RTC, как правило, имеют собственную резервную батарейку), и, если это требуется, каждые сутки для обновления значения даты — ведь алгоритм календаря достаточно громоздкий, сложен в отладке и организовывать его самостоятельно не рекомендуется.
В "больших" компьютерах реализован еще более простой алгоритм взаимодействия с RTC. Так, системное время Windows хранится в длинном многоразрядном счетчике (преобразующимся в реальные значения даты-времени каждой программой самостоятельно по готовым функциям), а синхронизация с RTC происходит при включении питания (RTC также могут там выполнять функцию "будильника" для системы).

Точная коррекция времени
Остановимся на вопросе о том, как можно точно корректировать ход таких часов. Относительно грубую подстройку (чтобы устранить основную часть ошибки за счет погрешности частоты "кварца") можно осуществить подгонкой коэффициента, записываемого в регистры сравнения. Например, если при номинальном значении 62 500 часы отстают на 10 с в сутки, то это означает, что частота прерываний таймера на 5/86400 = 11,6-10~5 долей меньше, чем необходимо (86 400 — число секунд в сутках). Чтобы ускорить ход, нужно увеличить частоту, т. е. уменьшить секундный интервал на эту величину. Для этого нужно записать в регистр сравнения число 62 500 — 62 500-11,6-10"5 « 62 493. Как легко подсчитать, подстройка получается достаточно грубая — изменение коэффициента на единицу дает изменение хода часов на «1,4 с в сутки, т. е. примерно на 40 с в месяц.

Причем решить проблему путем увеличения частоты прерываний таймера и формированием секундного интервала с помощью дополнительного регистра, как мы это делали в простейшем примере в главе 5, не получится — "разрешающая способность" наших манипуляций в любом случае ограничена 16-разрядным числом в регистрах сравнения. На первый взгляд, можно отказаться от удобного способа формирования секундного интервала с помощью сравнения и вести его примитивным методом подсчета достаточно большого числа. На практике же это мало чего даст: если ввести в регистр сравнения число 1, то таймер запускать все равно придется с частотой не более 1/64 от тактовой. Если прерывания будут происходить чаще, чем каждые 64 такта, то, скорее всего, часть прерываний "потеряется" — нам ведь требуется еще и выполнять какие-то действия, а их нужно успеть совершить в промежутке между прерываниями. А тогда число прерываний в секунду для тактовой частоты 4 МГц составит все те же 62 500.

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

Поэтому ничего не остается, кроме как попробовать банальный метод с подбором задержки, формируемой по старинке, методом "пустого цикла". Для того чтобы попасть в нужный интервал, следует все точно рассчитать. Предположим, что мы "ориентируемся" на ошибку "кварца" в 500 миллионных долей (такую ошибку, если верить производителям, имеют образцы самого низкого класса), тогда при тех же условиях, что и ранее (4 МГц, 1/64 коэффициент предделителя), минимальная величина коэффициента в регистре сравнения составит 62 500 - 62 500-10 3 « 62 437, а необходимая задержка составит не более 2 мс (126 тактов на входе таймера, или 126 периодов частоты в 1/64 от 4 МГц).

С помощью процедуры Delay, описанной в главе 5, имеющей трехбайтовый счетчик и время работы 5 тактов на итерацию, мы можем получить задержку - максимум 224 х5 = 16 777 216x5 = 83 886 080 такта, которые дадут интервал 20 971 520 мкс при частоте 4 МГц— более 20 с, что для наших целей многовато. Если мы ограничимся двухбайтовым счетчиком, то максимальный интервал составит 65 536 мкс (с учетом того^, что цикл будет составлять 4 такта, а не 5, как при трехбайтовом) или почти 66 мс, что также превышает наши потребности. Однобайтовый счетчик сможет отсчитать всего 0,2 мс, чего недостаточно, потому придется прибегнуть к двухбайтовому, заодно мы сильно расширяем возможности подстройки по сравнению с расчетной величиной — мало ли какой "кварц" попадется?



     
 

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