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

Автор работы: Пользователь скрыл имя, 03 Февраля 2010 в 12:50, Не определен

Описание работы

Курсовой проект

Файлы: 1 файл

КУРСОВОЙ.doc

— 111.00 Кб (Скачать файл)

      Кроме того, в целях наиболее эффективного использования возможностей 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. Слежка за изменением состояния каждой цифры в программе реализована довольно традиционно, путем сравнения его с пределом диапазона.

      После изменения счетчика времени происходит передача значений в RB0-RB7. Перед этим необходимо установить сигнал высокого уровня на RA3, что говорило бы жидкокристаллическому экрану о включении отображения символов (Enable). Передача данных происходит порциями по 8 бит, с небольшой временной задержкой. Поскольку выбранный мною индикатор позволяет выводить не только цифры, но и графику, то для более привычного представления будем выдавать на индикатор время в формате ЧЧ:ММ:СС, причем сперва выдаются часы, затем минуты, и уж наконец – секунды. После передачи идет возврат к главному циклу. 

2.5. Текст программы

; Программа для  микроконтроллера PIC16C55. 

STATUS equ 03h

onemin equ 08h

decmin equ 09h

onehour equ 0Ah

dechour equ 0Bh

curtime equ 0Ch

onesecond equ 0Dh

decsecond equ 0Eh 

org 00h

mainprog: 

; Начальная инициализация

      movf STATUS

      btfss STATUS, 4

      goto resume  ; Если возвращаемся от сброса

      bsf status

      bsf fsr   ; Установка нулевой страницы памяти 

      movlf 0h   ; Обнуление всех данных программы

      movwf TMR0

      movwf onemin

      movwf decmin

      movwf onehour

      movwf dechour

      movwf curtime

      movwf second 
 

resume:

; Установим делитель WDT на 1 секунду

      movlw 010000b

      option

      clrf TMR0

      movlw ‘xxxxx1xxx’b

      option

      clrwdt

      movlw 1110b

      option 

; Проверяем таймер

maincycle:

      movf TMR0, 0

      xorwf curtime, 0

      btfss STATUS, 2

      goto getnewtime  ; Если появился необработанный сигнал -

                              ; пойдем на getnewtime

      btfss PORTA, 2  ; Есть запрос на сброс счета?

      goto maincycle  ; Если нет - на maincycle 

; Обнуление всех  счетчиков

      movlf 0h

      movwf onemin

      movwf decmin

      movwf onehour

      movwf dechour

      movwf second

      goto dataout   ; Выведем на индикатор нули 

getnewtime:

; Обработка сигнала 
 

; Установим делитель WDT на 1 секунду

      movlw 010000b

      option

      clrf TMR0

      movlw ‘xxxxx1xxx’b

      option

      clrwdt

      movlw 1110b

      option 

      movf TMR0, 0

      movwf curtime ; Установим новое значение счетчика 

      incf onesecond, 1

      movlf 10d

      xorwf onesecond, 0

      btfss STATUS, 2

      goto dataout  ; Если не натикало 10 секунд, к dataout 

      movlf 0h

      movwf onesecond   ; Обнулим счетчик секунд 

      incf decsecond, 1

      movlf 06d

      xorwf decsecond, 0

      btfss STATUS, 2

      goto dataout  ; Если не натикало минуты, к dataout 

; Считаем единицы  минут

      incf onemin, 1

      movlf 10d

      xorwf onemin, 0

      btfss STATUS, 2

      goto dataout   ; Если десятка минут еще нет 

      movlf 0h

      movwf onemin 

; Десятки минут

      incf decmin, 1

      movlf 06d

      xorwf decmin, 0

      btfss STATUS, 2  ; Есть ли потребность изменить час?

      goto dataout   ; Нет - к dataout 

      movlf 0h

      movwf decmin 

; Единицы часов

      incf onehour, 1

      movlf 10d

      xorwf onehour, 0

      btfss STATUS, 2  ; Есть десять часов или нет?

      goto dataout   ; Нет - к dataout 

      movlf 0h

      movwf onehour 

; Десятки часов

      incf dechour, 1

      movlf 10d

      xorwf dechour, 0

      btfss STATUS, 2  ; Исчерпан лимит времени?

      goto dataout   ; Нет - к dataout 

      movlf 0h

      movwf dechour 

dataout:

; Выдача данных  на индикатор

      movlf 00h   ; Настроим PORTB как выход

      tris PORTB

      movf dechour, 0

      rlf W, 0

      rlf W, 0

      rlf W, 0

      rlf W, 0

      addwf onehour, 0

      movwf PORTB   ; Запишем информацию о часах 

; Временная задержка  перед отправлением следующего  пакета данных

      movwf 20d

new1: nop

      decfsz w, 1

      goto new1 

; Запишем код разделителя на индикатор

      movlf 2Eh

      movwf PORTB 

      movf decmin, 0

      rlf W, 0

      rlf W, 0

      rlf W, 0

      rlf W, 0

      addwf onemin, 0

      movwf PORTB   ; И о часах телефонного разговора

      movlf 2Eh

      movwf PORTB

Информация о работе Счетчик времени исходящих телефонных разговоров