Смекни!
smekni.com

Счетчик времени исходящих телефонных разговоров (стр. 2 из 3)

Все аппаратно-математические трудности исчезают, когда используется «нерациональный» способ хранения времени телефонных разговоров. В этом случае все, что требуется от обеспечивающей работу устройства программы, – это правильно изменять счетчики часов, минут и секунд. Для верного изменения элементов счета достаточно элементарных арифметических операций, поэтому такой подход к хранению наговоренного времени – через отдельные счетчики – представляется наиболее оправданным в условиях ограниченности набора команд контроллера PIC16C55.

Кроме того, в целях наиболее эффективного использования возможностей PIC, стоит предусмотреть «спящий» режим для контроллера. Для обоснования использования этого режима приведу выдержку из описания контроллера PIC [2], кое-где снабжая ее своими комментариями.

Для входа в режим пониженного энергопотребления используется команда SLEEP. По этой команде сторожевой таймер WDT (о нем ниже), если он был разрешен при программировании контроллера, сбрасывается и начинает отсчет времени заново. При пониженном энергопотреблении не происходит сброс контроллера, однако ток в режиме SLEEP не превышает нескольких микроампер.Для снижения тока, потребляемого в этом режиме, все разряды внешних портов кристалла должны находится либо на уровне Vss, либо на уровне Vdd. Все разряды портов, находящиеся в высокоимпедансном состоянии, должны быть соединены внешними резисторами с Vss или Vdd, чтобы избежать токов переключения, вызываемых плавающим потенциалом на высокоомных входах. Вывод MCLR должен иметь высокий логический уровень. Выйти из режима пониженного энергопотребления микроконтроллеры могут по одному из следующих событий:

1) Внешний сброс – импульс низкого уровня на MCLR;

2) Сброс при срабатывании сторожевого таймера WDT.

При этом независимо от причины сброса обнуляется сторожевой таймер WDT.

В нашем случае необходимость использования функции SLEEP обусловлена тем, что в общем-то при отсутствии импульсов счета в течение длительного времени оптимальным решением для PIC является его перевод в «спящий» режим. Схема перевода контроллера в режим пониженного энергопотребления состоит в следующем: работа программы осуществляется, пока на вход внутреннего таймера поступают импульсы счета времени (то есть до тех пор, пока идет телефонный разговор, инициированный нашим телефоном). Как только обрабатывается очередной импульс, начинается отсчет времени до прихода следующего импульса. В это время контроллер ничем не занят, а его сторожевой таймер включен. Как только время ожидания становится равным 2 секундам (с большой долей вероятности можно сказать, что если за 2 секунды не придет ни одного импульса, то телефонного разговора нет), происходит переход PIC-контроллера в режим пониженного энергопотребления. Согласно документации, каждые 18 мс тот же сторожевой таймер будет сбрасывать контроллер, и в это время будет выполняться небольшой участок программы, ответственный за проверку пришествия импульса счета на вход микросхемы. Эта проверка занимает несколько микросекунд, что, очевидно, не нивелирует разницу между работой с режимом пониженного энергопотребления и работой без такового режима. Задача у этой проверки предельно проста: получить значение внутреннего таймера-счетчика TMR0, сравнить его с предыдущим значением. В случае, когда результатом сравнения станет равенство значений, можно смело «засыпать» снова, поскольку новых импульсов не появилось. Если же результат сравнения есть «не равно», то необходимо обнулить сторожевой таймер и начать счет импульсов. Таким образом, при такой схеме работы контроллер основное время находится в «спящем» режиме, выходя из него только в случае поступления нового импульса счета или в случае «дежурного обхода», то есть при проверке входа таймера TMR0 с целью обнаружить новый импульс.

2.5. Особенности программной реализации алгоритма счета

Программа обработки импульсов счета (см. п.2.5.) получает управление сразу после включения разрабатываемого устройства в сеть и, вместе с ним, включения PIC-контроллера. Первые строки программы служат определению режима работы контроллера: если контроллер «просыпается», это отражено в бите 4 регистра STATUS. В этом случае программа разумно считает, что начальная инициализация не нужна, поскольку счет импульсов уже шел до этого, и проходит этот этап. Если же контроллер заработал по включению питания, то начинается настройка программы на ее дальнейшую работу. Поскольку в начальный момент времени состояние памяти изделия фирмы Microchip трудно прогнозируемо, первым делом в программе мы обнулим все регистры общего назначения, которые используются в работе (предварительно, следуя рекомендации разработчиков PIC, переключимся на нулевую страницу памяти). Следующим этапом инициализации является настройка счетчика WDT на 2 секунды. Для этого в программе для контроллера используется код, рекомендованный в литературе по PIC. Поскольку в PIC есть предварительный делитель для TMR0 и для WDT, то может возникнуть путаница при программировании делителя на заданное значение из-за неопределенности подсистемы (TMR0 или WDT), для которой программируется делитель. Фрагмент программы, ответственный за такую настройку, данную неопределенность устраняет: он сперва, выбрав внутренний сигнал для TMR0, назначает новое значение делителя TMR0 (выбор внутреннего сигнала необходим, поскольку в разрабатываемом устройстве используется внешний сигнал для тактирования TMR0). Затем код выбирает WDT и устанавливает нужное нам значение предварительного делителя.

После предварительной подготовки наступает выполнение основного цикла программы. Он заключается в непрерывном сканировании входа RB2, чтобы вовремя детектировать сигнал сброса счета, и в постоянной проверке содержимого TMR0. Для проверки последнего в программе заведено свое значение, соответствовавшее TMR0 на момент прихода последнего импульса. Для выяснения того, пришел новый импульс или нет, довольно выполнить исключающее ИЛИ с текущим значением TMR0 и значением программного счетчика. Если результат нулевой – импульса счета нет. Параллельно с этим циклом контроллер ведет свою канцелярию: изменяется счетчик сторожевого таймера WDT. Если данный цикл будет выполняться в течение двух и более секунд, это означает, что прохождение импульсов через цепь счета (блок 3 на структурной схеме) прервано по каким-либо причинам (скорее всего, просто-напросто нет исходящего от абонента разговора). В случае прерывания импульсов счета контроллер переходит в режим пониженного энергопотребления, периодически проверяя, не пришел ли еще какой-либо импульс (сброса или счета времени). Период такой проверки равен 2 секундам, отсюда видно, что максимальная погрешность подсчета телефонных разговоров также равна 2 секундам. Для ее уменьшения следует изменить значение предварительного делителя сторожевого таймера WDT, однако в данном случае несколько возрастет нагрузка на PIC, поскольку импульсы поступают не чаще, чем раз в секунду, а обнуление счетчика WDT происходит только по приходу импульса. Отсюда следует, что если установить малое значение делителя, то PIC будет часто попусту сбрасываться, что само по себе не очень хорошо. Если же установить время сброса на 2 секунды, то несложно увидеть, что в таких случаях пустых сбросов контроллера не будет совсем.

При подаче высокого уровня на вход RA2 должен по проекту последовать сброс счетчика на нуль. Реализация этого действия в программном варианте сводится к обнулению всех внутренних регистров и подача на жидкокристаллический экран соответствующих результатов.

Для самого счета импульсов в программе отдельно сделаны счетчики для каждой из цифр, которые будут отображаться на жидкокристаллическом экране.Это единицы и десятки часов, минут и секунд. В первоначальном варианте предполагалось выводить на жидкокристаллический экран лишь минуты и часы разговора, однако путем изменения модели индикатора и добавлением соответствующих строк в программу было сделано расширение отображаемого временного диапазона до секунд.Таким образом, при поступлении импульса счета происходит увеличение сперва единицы секунд (onesecond), затем, если необходимо, десятка секунд (decsecond), и так далее. Фраза «если необходимо» значит, что для каждой цифры времени есть свои пределы. Для единиц и десятков часов, а также для единиц минут и секунд цифры могут меняться от 0 до 9, для десятков минут и секунд от 0 до 5. Слежка за изменением состояния каждой цифры в программе реализована довольно традиционно, путем сравнения его с пределом диапазона.