Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 9. Программирование таймеров 237 ЗАМЕТКИ НА ПОЛЯХ Следует обратить внимание, что в МК с часовыми функциями отдельный подсчет времени обычно ведется даже тогда, когда в схеме присутствуют автономные часы реального времени , RTC (ими мы займемся в главе 13) . Вроде бы в таком случае де лать это незачем - RTC все равно считают «внутри себя» , и притом не только время , но и дату, и день недели . Однако обмен данными с RTC каждую секунду займет вре мени значительно больше, чем собственный подсчет. Из-за этого RTC целесообразно использовать , как генератор внешних прерываний , по которым и происходит подсчет времени (вместо прерываний таймера, как у нас) , а синхронизировать значения можно один раз при включении системы (RTC , как правило, имеют собственную резервную батарейку) и можно еще периодически для подстройки (это при условии , что выбран ные часы точнее нашего кварца , а то может оказаться и наоборот) . Иное дело, если требуются дни недели-месяцы-годы - ведь алгоритм календаря весьма громоздкий, сложен в отладке и организовывать его самостоятельно замучаетесь. Но учтите, что тогда придется менять и все решение полностью: очевидно , семисегментные индика торы (о которых далее в этой главе) с этим удовлетворительно не справятся . О других решениях мы также поговорим в главе 1 6. В «больших» компьютерах реализован еще более простой алгоритм взаимодействия с RTC . Системное время Windows хранится в длинном многоразрядном счетчике и преобразуется в реальные значения даты-времени каждой программой самостоятель но по готовым функциям, а синхронизация с RTC происходит один раз при включении питания. RTC также могут там выполнять функцию «будильника» для системы. Точная коррекция времени Остановимся на вопросе о том, как можно точно корректировать ход таких часов. Относительно грубую подстройку (чтобы устранить основную часть ошибки из-за погрешности частоты «кварца») можно осуществить подгонкой коэффициента, за писываемого в р е гистры сравнения . Например, если при номинальном значении 62 500 часы отстают на 1 О с в сутки, то это означает, что частота прерываний тай мера на 1 0 /86 400 = 1 1 ,7· 1 0- 5 долей меньше, чем необходимо (86 400 - число секунд в сутках). Чтобы ускорить ход, надо увеличить частоту, т. е. уменьшить секундный интервал на эту величину. Для этого нужно записать в регистр сравнения число 62500 - 62500· 1 1 ,6 · 1 0" 5 � 62493 . Как легко подсчитать, подстройка получается дос таточно грубая - изменение коэффициента на единицу дает изменение хода часов на � 1 ,4 с в сутки, т. е. примерно на 40 с в месяц. Если же требуется более точная подстройка, то решать проблему путем еще каких то программных манипуляций нецелесообразно. Увеличением частоты прерываний таймера и формированием секундного интервала с помощью дополнительного регистра, как мы это делали в простейшем примере в главе 6, не получится - «раз решающая способность» наших манипуляций в любом случае ограничена 1 6-раз рядным числом в регистрах сравнения. Можно отказаться от удобного способа формирования секундного интервала с помощью сравнения и вести его примитив ным методом подсчета достаточно большого числа. Но на практике же это мало чего даст: если ввести в регистр сравнения число 1, то таймер запускать все равно придется с частотой не более 1 / 6 4 от тактовой. Если прерывания будут происходить чаще, чем каждые 64 такта, то, скорее всего, часть прерываний «потеряется» - нам
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==