Само название "прерывания от переполнения TMR0" указывает на то, что уход в прерывания происходит после того, как содержимое TMR0 изменится с .255 на 0. Естественно, для того чтобы это имело место быть, TMR0 нужно "запустить в работу", что, в самом распространенном случае (TMR0 считает внешний такт), предполагает:
- настройку вывода RA4/TOCKI на работу "на вход";
- выбор внешнего такта с вывода RA4/TOCKI – TOCS (Option<5>);
- выбор активного перепада, производящего приращение содержимого TMR0 – TOSE (Option<4>). В большинстве случаев, выбор активного перепада не имеет особого, практического значения и обычно в бите TOSE регистра Option выставляется 0 (активный перепад - от 0 к 1);
- выбор способа включения предделителя. Если предделитель не нужен, то он подключается на выход WDT - бит PSA (Option<3>) устанавливается. В этом случае, речь идет о "чистом" TMR0 с коэффициентом счета Ксч.=256. Если требуется больший чем 256 коэффициент счета, то перед TMR0 нужно включить предделитель с заданным Ксч. бит PSAcбрасывается. КонкретныйКсч. предделителя выставляется в битах PS0, PS1, PS2 (Option<2…0>) и зависит от задумки программы.
- в начале исполнения программы нужно разрешить прерывания по переполнению TMR0: установить биты GIE (Option<7>) и TOCS (Option<5>).
Указанное выше есть не что иное, как подготовительные операции основной программы, которые должны выполняться первыми (по метке START).
Рис. 7.10. Принципиальная схема устройства c использованием прерываний от таймера
Программа CNTMR0 позволяет показать механизм работы прерываний: факт возвращения рабочей точки программы (после обработки прерывания) именно в то место основной программы, с которого она ушла в текущее прерывание по переполнению TMR0.
После включения питания программа, через проверку состояния кнопки "TMR" (BTFSC PORTA,1), закольцовывается (GOTO START) и будет там пока не произойдет нажатие кнопки "TMR”.
Рис. 7.11. Алгоритм программы прерывания от переполнения TMR0
На вход RA4/TOCKI подаются импульсы с выхода генератора сигналов (Tools>Signal Generator) частотой 400 Гц. После нажатия на кнопку "TMR" счетчик TMR0 начинает считать импульсы Signal Generator, что видно в основном окне PIC Simulator IDE по зажиганию светодиода, подключенного к RА1. Свечение светодиода будет продолжаться до тех пор, пока не произойдет переполнение TMR0 и ухода в прерывание. В качестве программы обработки прерывания используется программа зукового генератора Multi. Действие программы видно на экране осциллографа, подключенного к выводу RА2, количеством периодов = 10 (время "горения" равно времени "гашения" - по 0,2 сек.).
Таким образом, по осциллографу можно визуально проконтролировать время исполнения подпрограммы прерывания.
В момент ухода в прерывание программа вышла из основной программы, и после обработки прерывания, вернется по стеку в то место основной программы, из которого она ушла в прерывание. Работа в основной программе продолжится далее, после чего программа зациклится командой GOTO START и будет там "крутиться" в ожидании следующего прерывания, при пассивности моргалки".
Прерывания от переполнения таймераTMR0
Есть еще одна разновидность работы TMR0: на его вход (или предделителя, если он подключен ко входу TMR0) подаются импульсы внутреннего тактового генератора CLKOUT (бит TOCS регистра OPTION сброшен). В этом случае, если предделитель не подключен, приращение содержимого TMR0 будет происходить в каждом машинном цикле, а если подключен, то реже (зависит от выставленного коэффициента счета предделителя).
Этот режим используется для формирования калиброванных временных отрезков в электронных часах, календарях, будильниках, и т.п. Для получения задержки 1 сек при тактовой частоте 4 МГц (время выполнения команды 4Т=1 мкс) необходимо обеспечить с помощью трех делителей коэффициент деления 64х125х125=1 000 000.
ПРОГРАММА: ПРЕРЫВАНИЯ ОТ ПЕРЕПОЛНЕНИЯ ТАЙМЕРА TMR0
В основной программе выполняется настройка порта В на выход (CLRFTRISB) и запуск таймера от внутреннего генератора (BCF OPTION_REG,T0CS). Предделитель не подключаенко входу таймера (BSF OPTION_REG,PSA). После инициализации МК и таймера разрешаются прерывания (), в порту В устанавливается константа .255 и программа входит в зону прерываний.
;=============================================
; TIMER0 - Прерывания от переполнения таймера TMR0
MOVWF STAT_TEMP ; Копирование W в регистр STAT_TEMP.
;подпрограмма обработки прерываний------
MOVLW 01
SUBWFPORTB,W
MOVWFPORTB;
RETURN
; сброс флага прерываний-----------------------
BCFINTCON,T0IF
; восстановление значений W и STATUS---
SWAPFSTAT_TEMP,W ; Обмен полубайтами. Результат сохраняется в W.
MOVWF STATUS ; Копирование содержимого W в регистр Status.
SWAPF W_TEMP,F ; Обмен полубайтами.
SWAPFW_TEMP,W ; Обмен полубайтами. Результат сохраняется в W.
RETFIE
; Основная программа---------------------
START
; инициализация порта В------------------
BSFSTATUS,RP0
CLRFTRISB
; настройка таймера-----------------
; прерывания от внутреннего генератора
BCF OPTION_REG,T0CS
; предделитель отключен-----------
BSF OPTION_REG,PSA
; разрешение прерываний по переполнению таймера
BSF INTCON.T0IE;
BSF INTCON.GIE
BCFSTATUS,RP0
; установка 255 в порт В-------------
MOVLW 0FFH
MOVWF PORTB
; зона прерываний--------------------
L00K:
NOP
GOTOL00K
; конец всем командам
END
EEPROM ДАННЫХ
В состав МК РIС16F84А входит ПЗУ EEPROM данных — электрически программируемое ПЗУ, которое имеет восьмиразрядную организацию и предназначено для хранения значений переменных программы при выключенном питании. Обычно числа из EEPROM после старта программы переносят в обычные ячейкам памяти данных. Управляет процессом записи/считывания регистры EECON1 и EECON2.