Вы находитесь на странице: 1из 10

6/6/7.

Пример практического применения модуля CCP, работающего в режиме


ШИМ: устройство, формирующее импульсную последовательность с постепенно
изменяющейся скважностью (варианты без уходов в прерывания и с ними).

Предлагаемое Вашему вниманию информация, помогает понять принцип построения


программы, обслуживающей устройство формирования импульсной последовательности
с постепенно изменяющейся скважностью.
Что касается аппаратной части устройства, то она очень проста: к выводу RB3, через
гасящий резистор, подключается светодиод.
Второй его вывод - на корпусе (кварц - само собой).
Светодиод будет плавно наращивать интенсивность своего свечения от нуля
(светодиод не "горит") и до максимума (светодиод "горит ярко").
После достижения этого максимума, он резко "гасится" и опять начинает постепенно
наращивать интенсивность своего свечения. И т.д.
Это обеспечивается за счет постепенного изменения скважности, от ее минимального
до максимального значения (цикл) и периодичности этих циклов.

;********************************************************************************
; Schim_1.asm Устройство, формирующее импульсную последовательность с
; постепенно изменяющейся скважностью.
;--------------------------------------------------------------------------------
; Задействуется модуль CCP, работающий в режиме ШИМ.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Функции выводов порта А:
; Выводы порта А не задействованы.
; Функции выводов порта В:
; к RB3 подключен контрольный светодиод.
; Остальные выводы порта В не задействованы.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Используется PIC16F628A.
;----------------------------------------------
; Объем программы: 26 слов в памяти программ.
;********************************************************************************
LIST p=16F628A ; "Привязка" MPLAB к микроконтроллеру
; PIC16F628A.
__CONFIG 03F21H ; Определение значений битов конфигурации: бит
; защиты выключен, WDT выключен, стандартный
; генератор XT.
;================================================================================
; "Прописка" регистров специального назначения.
;================================================================================
Status equ 03h ; Регистр Status.
TrisB equ 06h ; Регистр Tris B-банк1.
PIR1 equ 0Ch ; Регистр флагов прерываний
; от периферийных модулей.
T2CON equ 12h ; Регистр управления модулем таймера TMR2.
CCP1CON equ 17h ; Регистр управления модулем CCP.
CCPR1L equ 15h ; Регистр младшего разряда CCP.
PR2 equ 12h ; Регистр периода-банк1.
TMR2 equ 11h ; Регистр TMR2.
;================================================================================
; "Прописка" регистров общего назначения.
;================================================================================
Temp equ 70h ; Регистр временного хранения.
;================================================================================
; Присвоение названий местам размещения результатов операций.
;================================================================================
F equ 1 ; Результат направить в регистр.
W equ 0 ; Результат направить в аккумулятор.

1
;================================================================================
; Присвоение названий битам регистров специального назначения.
;================================================================================
RP0 equ 5 ; Бит переключения банков.
Z equ 2 ; Флаг нулевого результата.
TMR2IF equ 1 ; Флаг прерывания по переполнению TMR2.
;================================================================================
; Подготовка к началу исполнения программы.
;================================================================================
org 0 ; Начальная точка отсчета в PC – нулевой
; адрес.
;********************************************************************************

;================================================================================
; Начало программы.
;================================================================================
; Подготовительные операции.
;--------------------------------------------------------------------------------
; Задание длительности периода, длительности импульса,
; подготовка TMR2 и настройка RB3 на работу "на выход".
;------------------------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
movlw .249 ; Задание длительности
movwf PR2 ; периода (.249).
bcf TrisB,3 ; RB3 работает на выход.
bcf Status,RP0 ; Переход в 0-й банк.

clrf TMR2 ; Сброс TMR2.


clrf CCPR1L ; Задание начальной длительности импульса
; в части касающейся CCPR1L (.0).
;------------------------------------------
; Настройка модуля CCP.
;------------------------------------------
movlw b'00011111' ; Включение режима ШИМ и задание начальной
movwf CCP1CON ; длительности импульса в части касающейся
; CCP1CON,5,4 (.1).
; Примечание: работа устройства начинается с CCPR1L/CCP1CON,5,4 = .1
;------------------------------------------
; Сброс флага TMR2IF и разрешение счета.
;------------------------------------------
bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.
movlw b'00011101' ; TMR2 включен, Кдел.предделителя = 4,
movwf T2CON ; Кдел.выходного делителя = 4.

;========================================================================
; Подпрограмма формирования числового значения 10-разрядного слова
; (последовательный инкремент CCPR1L/CCP1CON,5,4) и его записи в
; CCPR1L/CCP1CON,5,4.
;========================================================================
; Определение момента "запуска" процедуры.
;-----------------------------------------------------
SNOVA btfss PIR1,TMR2IF ; Проверка состояния флага
goto $-1 ; прерывания по переполнению TMR2.
;-----------------------------------------------------
; "Переправка" содержимого CCP1CON в Temp и Temp+1.
;-----------------------------------------------------
swapf CCP1CON,W ; Смена местами п/байтов с сохранением
; результата в W.
movwf Temp ; W à Temp.
incf Temp,F ; Temp + 1 = …
;-----------------------------------------------------
; Проверка содержимого Temp на соответствие числу .244.
;-----------------------------------------------------
movlw .244 ;
2
subwf Temp,W ; Temp – .244 = … (результат – в W).
btfss Status,Z ; Флаг Z поднялся или нет?
goto $+2 ; Если не поднялся, то инкремента CCPR1L
; не производится.
incf CCPR1L,F ; Если поднялся, то инкремент CCPR1L
; производится.
;-----------------------------------------------------
; Запись измененного значения.
;-----------------------------------------------------
swapf Temp,W ; Восстановление содержимого CCP1CON
movwf CCP1CON ; с учетом инкремента.

bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.


goto SNOVA ; Переход на новый цикл формирования
; длительности импульса.
;********************************************************************************
end ; Конец программы.

Исходные данные.
Сначала нужно определиться с длительностью периода.
"Привяжусь" все к тому же значению Тп = 1000 мкс.
Это соответствует частоте 1 Кгц.
Частота кварца 4 Мгц.
Открываю программу PIC – калькулятора. Щелкаю по кнопке "ШИМ".
В данном случае, никакого расчета производить не требуется, так как нужные
исходные данные расчитываются по умолчанию.
Выбираю верхние строки (наибольшие битность и количество градаций).
Использую результаты расчета из верхней строки поля "Итог":
- Кдел. предделителя модуля TMR2 = 4,
- число, которое нужно записать в регистр периода PR2 = .249.
Теперь нужно определиться с длительностью импульса.
Так как речь идет о постоянно изменяющейся скважности, то, в принципе, все равно, с
какой скважности начинать работу устройства.
Например, начну с максимальной скважности: 00000000(CCPR1L)01(CCP1CON,5,4).
Так как речь идет о цикличности, то в регистре CCPR1L/CCP1CON,5,4 нужно
организовать счет по кольцу.
Теперь нужно определиться с величиной интервала времени между двумя соседними
сменами минимальной скважности на максимальную, ведь если сделать этот интервал
времени маленьким, то, визуально, не удобно будет отслеживать процесс постепенного
нарастания яркости свечения светодиода.
Прикидываю: 1000 градаций ШИМ "проскочат" за 1 секунду. На мой взгляд, маловато.
Вопрос: "Как увеличить это время, не меняя тех условий, что уже заданы"?
Ответ: нужно задействовать выходной делитель модуля TMR2. У него "богатые
возможности затягивания".
Его еще нужно задействовать и по той причине, что только через него имеется
"прямой выход" на флаг TMR2IF, без которого, в данном случае, не обойтись.
Напоминаю Вам, что если речь идет о смене скважности по ходу работы, то загрузку
10-битного слова, из CCPR1L/ CCP1CON,5,4 в буфер, нужно произвести "на стыке" двух
соседних периодов, то есть, сразу же после поднятия флага TMR2IF.
Возвращаюсь к вопросу о времени цикла.
В зависимости от выбранного Кдел. выходного делителя модуля TMR2, оно может
быть различным.
В данном случае, я выбрал Кдел. выходного делителя модуля TMR2 равным 4-м, но
можно выбрать и другой.
Задействование выходного делителя модуля TMR2 с выставленным в нем Кдел. = 4,
приведет к тому, что смена скважности будет осуществляться не на каждом импульсе,
а на каждом 4-м импульсе.
За счет этого, величина интервала времени между двумя соседними сменами
минимальной скважности на максимальную увеличится с 1 секунды до 4 секунд.
Итак, основные исходные данные будут выглядеть так:
- Кдел. предделителя модуля TMR2 = 4,
3
- Кдел. выходного делителя модуля TMR2 = 4,
- число, которое нужно записать в регистр периода PR2 = .249.
Теперь нужно подумать, как программно организовать смену скважности, с учетом того,
что речь идет о постепенном ее изменении.
Проще всего это сделать, если, во время "прохождения" текущей "четверки" импульсов,
произвести инкремент содержимого 10-байтного регистра CCPR1L/ CCP1CON,5,4.
После "прохождения" текущей "четверки" импульсов, в пределах которой скважность
является фиксированной, произойдет смена скважности (+1 шаг к ранее установленной
длительности импульса) и т.д., вплоть до перехода на следующее кольцо счета.
И это будет периодически повторяться до тех пор, пока питание устройства будет
включено.
Итак, нужно организовать инкремент 2-байтного регистра, ведь ПИКи не работают с
"байтом, плюс 2-битный хвостик".
Им подавай целое количество байтов.
В данном случае, работа будет происходить с двумя "полновесными" байтами.
Дело осложняется тем, что биты регистра CCP1CON c №№5 и 4 "лежат" где-то в
"районе" середины байта, и в младшем полубайте "лежат" биты настройки режима
работы модуля CCP, которые "загубить" нельзя.
Биты регистра CCP1CON c №№5 и 4, являются младшими битами регистра
CCPR1L/ CCP1CON,5,4.
Значит, в случаях перехода на "новые витки" двухбитного счета, нужно организовать
перенос из CCP1CON,5,4 в CCPR1L.
О том, как я решил этот "кроссворд", будет сказано ниже.

Работа программы.
В подготовительных операциях я не стал "прописывать" процедуру отключения модуля
компараторов, так как выводы порта А не используются (думаю, что она уже
достаточно "помозолила Вам глаза").
Прерывания запрещать тоже не стал, так как они запрещены по умолчанию.
В самом начале программы, происходит "загрузка", в регистр периода PR2, числового
значения периода (.249).
В дальнейшем оно не меняется.
Вывод RB3, к которому подключен светодиод, настраивается на работу "на выход" (по
умолчанию, выводы портов настраиваются на работу "на вход").
С целью подготовки начала счета от нуля (на 1-м "витке" полного цикла программы),
содержимое регистра TMR2 сбрасывается в 0.
Счета пока нет, так как модуль TMR2, по умолчанию, отключен.
Далее, в части касающейся регистра CCPR1L, задается длительность первых 4-х
импульсов.
Как и оговорено выше, байт CCPR1L сбрасывается в 0.
Далее производится настройка модуля CCP: он переводится в режим ШИМ, и в биты
№№5 и 4 регистра CCP1CON записывается число .1.
Установка в CCPR1L числа .0 и установка в CCP1CON,5,4 числа .1, в комплексе
(CCPR1L/ CCP1CON,5,4 = .1), есть установка минимального значения скважности первой
"четверки" импульсов, с которой начинается формирование импульсной
последовательности.
Теперь можно сбросить флаг TMR1IF (чтобы гарантировать первичную установку
максимальной скважности), установить заданные выше Кдел. предделителя и выходного
делителя модуля TMR2 (.4 и еще раз .4) и разрешить счет.
В данном случае, с учетом значительной длительности интервалов времени между
началами формирования двух соседних "четверок" импульсов и низкими требованиями
к инерционности отклика, я не стал использовать прерывания, а ограничился
стандартной проверкой флага прерывания по переполнению TMR2.
Напоминаю, что этот флаг (и не только этот) работает вне зависимости от того,
разрешены прерывания или запрещены.
Вот, собственно говоря, и вся подготовка.
Далее начинается циклическая ПП формирования числового значения 10-
разрядного слова и его записи в CCPR1L/CCP1CON5,4.

4
В ее начале, организуется стандартная проверка состояния флага прерывания по
переполнению TMR2 ("плавающая" задержка).
Стоп.
Теперь нужно разобраться с принципом дальнейших действий.
Биты №№5 и 4 регистра CCP1CON "лежат" в старшем полубайте и являются битами
его младших разрядов.
Если поменять местами полубайты (swapf), то появится возможность беспроблемного
инкремента.
Чтобы, после этого, вернуться к исходному состоянию, нужно, перед записью "нового"
значения битов №№5 и 4 в регистр CCP1CON, еще раз поменять местами полубайты.
Получается что-то типа процедуры сохранения/восстановления содержимого регистров
Status и W, при отработке ПП прерывания, но только с инкрементом.
Такая "комбинация из двух пальцев" требует "введение в эксплуатацию" регистра
оперативной памяти, что и сделано (регистр Temp).
Теперь нужно организовать перенос, из CCP1CON,5,4, в CCPR1L.
Это можно сделать, если, в случае переходов числовых значений 2-битного слова от
числа .3 к числу .4, инкрементировать содержимое регистра CCPR1L.
Но в этом случае, в начале всей этой "свистопляски", сразу же после 1-й смены
полубайтов регистра CCP1CON, нужно произвести "нейтрализацию" всех битов, кроме
битов с №№1 и 0 (это "ушедшие в подполье" биты №№5 и 4 регистра CCP1CON), и
после 2-й смены полубайтов, "присуммировать" к результату этой смены число .
15/00001111 (для восстановления настройки режима ШИМ, так как, в этом случае, она
"убита нейтрализацией").
Это смотрится как-то "рогато". Зачем нужны лишние проблемы?
Вопрос: "А нельзя ли обойтись без нейтрализации и восстановления настройки режима
ШИМ"?
Ответ: можно, если, при решении вопроса о переносе, ориентироваться не на число .4
(0000 0100), а на число .244 (1111 0100).
В этом случае, "нейтрализация" не нужна и "плюсовать" ничего не нужно (минус 2
команды), что и имеет место быть.
Если результат инкремента равен числу .244, то числовое значение 2-битного слова
будет равно 00 (переход на следующее кольцо счета), плюс, инкремент содержимого
регистра CCPR1L.
Примечание: в слове 1111 0100 (.244), состояния битов с №№3 и 2 не важны, так как
они есть, "ушедшие в подполье" (после смены полубайтов регистра CCP1CON), биты
№№7 и 6 регистра CCP1CON, которые не используются (см. "раскладку" битов
регистра CCP1CON).
"На колу висит мочало, начинаем все сначала" (в смысле "петля на шее у проблемы
потихоньку затягивается". Уже "ноги дрыгаются").
Выход из "плавающей" задержки происходит на команду 1-й смены полубайтов.
Полубайты регистра CCP1CON меняются местами, а результат сохраняется в регистре
W.
При этом, биты с №№5 и 4 меняют свою "дислокацию" на №№1 и 0.
Далее следует "переправка" содержимого регистра W в регистр Temp, с целью
обеспечения дальнейшего инкремента его содержимого.
Далее, сам инкремент.
После этого, результат инкремента проверяется на соответствие числу .244
(задействуется флаг Z).
Сценарии:
- если счет не дошел до числа .244, то перенос из CCP1CON,5,4 в CCPR1L
игнорируется (команда инкремента содержимого CCPR1L обходится).
- если счет дошел до числа .244, то этот перенос происходит.
"Миссия выполнена" и можно "выходить из подполья", то есть, осуществить 2-ю смену
местами полубайтов (восстановление).
Она отличается от 1-й только тем, что меняются местами полубайты регистра Temp.
В результате этого, в регистре W, "оседает" "материнское" (исходное) содержимое
регистра CCP1CON, но только увеличенное на 1 (в части касающейся битов с №№5 и
4, и с учетом переноса, если он был).
Оно и переписывается в регистр CCP1CON в качестве его "нового" значения.
5
Что касается увеличения на 1 содержимого регистра CCPR1L, то оно может либо
произойти, либо не произойти (зависит от сценария), а если говорить точнее, то
увеличение на 1 содержимого регистра CCPR1L (перенос из CCP1CON,5,4) происходит
через каждые 4 цикла работы ПП SNOVA.
В конце ПП SNOVA, флаг TMR2IF сбрасывается для того, чтобы обеспечить условия
работы "плавающей" задержки.
Далее, goto SNOVA, и все повторяется.
Теперь нужно проанализировать ПП SNOVA на наличие или отсутствие "бяки" типа "я
еще не закончил, а ты уже над душой стоишь".
ПП SNOVA, без учета "плавающей" задержки, отрабатывается за 13 м.ц.
Плюсую к этому задержку в 3 м.ц. (наихудшая ситуация), которая может возникнуть в
"плавающей" задержке.
Получается 16 м.ц. (в данном случае, 16 мкс.).
Так как имеется буферизация, то, в данном случае, имеется "запас" времени аж
4импульса х 1000 мкс. = 4000 мкс.
16 мкс. гораздо меньше чем 4000 мкс., и по этой причине не стоит опасаться поднятия
флага TMR2IF тогда, когда цикл ПП SNOVA полностью не отработан.
Даже если выходной делитель модуля TMR2 делит на 1, то все-равно "запас" времени
очень даже приличный (вот Вам и практический эффект от наличия буферизации).
Вывод: "бяка" типа "я еще не закончил, а ты уже над душой стоишь" отсутствует.
Теоретически, она может иметь место быть, но при таком малом периоде сигнала
ШИМ, технически реализовать который не представляется возможным.
Ну и ладушки.
В программном отношении, программа Schim_1.asm ничего выдающегося из себя не
представляет (всего 26 команд), но она достаточно "технологична" в том смысле, что
для того чтобы "родить" этого "карапуза", нужно как следует разобраться в работе
модуля.
Если снять требование по входу в ПП SNOVA с заданным числовым значением
начальной длительности импульса, то количество команд можно уменьшить.
Те из Вас, кто имеет осциллограф, могут, подключившись к выводу RB3, визуально
отследить процесс изменения скважности.
Если "подцепить к этой штуковине" тиристор (семистор) и соответствующим образом ее
доработать, то можно, например, плавно зажигать и гасить свет в помещении.
Если к выводу RB3 подключить фильтр нижних частот (например, простейший,
однозвенный RC ФНЧ), то на его выходе будет сигнал с формой близкой к
пилообразной.
Примечание: не стоит пытаться обойтись без регистра Temp, так как при смене
полубайтов регистра CCP1CON с сохранением результата операции в нем же,
происходит выход из режима ШИМ ("жесточайший глюк").
Можно ли сделать то же самое с уходом в прерывания?
Можно.
Ниже Вы это видите.
Можете убедиться, что, в "железе", программа Schim_2.asm работает точно так же, как
и программа Schim_1.asm.

;********************************************************************************
; Schim_2.asm Устройство, формирующее импульсную последовательность с
; постепенно изменяющейся скважностью.
; (вариант с прерываниями)
;--------------------------------------------------------------------------------
; Задействуется модуль CCP, работающий в режиме ШИМ.
;********************************************************************************
; "Практикум по конструированию устройств на PIC контроллерах"
; (http://ikarab.narod.ru)
; Корабельников Евгений Александрович karabea@Lipetsk.ru
;********************************************************************************
; Функции выводов порта А:
; Выводы порта А не задействованы.
; Функции выводов порта В:
; к RB3 подключен контрольный светодиод.

6
; Остальные выводы порта В не задействованы.
; Кварц 4000 Кгц (1 м.ц.= 1 мкс.).
; Используется PIC16F628A.
;----------------------------------------------
; Объем программы: 35 слов в памяти программ.
;********************************************************************************
LIST p=16F628A ; "Привязка" MPLAB к микроконтроллеру
; PIC16F628A.
__CONFIG 03F21H ; Определение значений битов конфигурации: бит
; защиты выключен, WDT выключен, стандартный
; генератор XT.
;================================================================================
; "Прописка" регистров специального назначения.
;================================================================================
Status equ 03h ; Регистр Status.
TrisB equ 06h ; Регистр Tris B-банк1.
IntCon equ 0Bh ; Регистр IntCon.
PIE1 equ 0Ch ; Регистр разрешения прерываний
; от периферийных модулей.
PIR1 equ 0Ch ; Регистр флагов прерываний
; от периферийных модулей.
T2CON equ 12h ; Регистр управления модулем таймера TMR2.
CCP1CON equ 17h ; Регистр управления модулем CCP.
CCPR1L equ 15h ; Регистр младшего разряда CCP.
PR2 equ 12h ; Регистр периода-банк1.
TMR2 equ 11h ; Регистр TMR2.
;================================================================================
; "Прописка" регистров общего назначения.
;================================================================================
Temp equ 70h ; Регистр временного хранения.
;================================================================================
; Присвоение названий местам размещения результатов операций.
;================================================================================
F equ 1 ; Результат направить в регистр.
W equ 0 ; Результат направить в аккумулятор.
;================================================================================
; Присвоение названий битам регистров специального назначения.
;================================================================================
RP0 equ 5 ; Бит переключения банков.
Z equ 2 ; Флаг нулевого результата.
TMR2IF equ 1 ; Флаг прерывания по переполнению TMR2.
;================================================================================
; Подготовка к началу исполнения программы.
;================================================================================
org 0 ; Начальная точка отсчета в PC – нулевой
; адрес.
goto START ; Переход на начало программы.
org 4 ; Начать исполнение ПП прерывания c команды,
; которая, в PC, имеет адрес 04h.
;********************************************************************************

;================================================================================
; Подпрограмма прерывания.
;================================================================================
; Формирование числового значения 10-разрядного слова (последовательный инкремент
; CCPR1L/CCP1CON,5,4) и его запись в CCPR1L/CCP1CON,5,4.
;================================================================================
; "Переправка" содержимого CCP1CON в Temp и Temp+1.
;----------------------------------------------------
swapf CCP1CON,W ; Смена местами п/байтов с сохранением
; результата в W.
movwf Temp ; W --> Temp.
incf Temp,F ; Temp + 1 = ...
;----------------------------------------------------

7
; Проверка содержимого Temp на соответствие числу 244.
;----------------------------------------------------
movlw .244 ;
subwf Temp,W ; Temp - .244 = ... (результат - в W).
btfss Status,Z ; Флаг Z поднялся или нет?
goto $+2 ; Если не поднялся, то инкремента CCPR1L
; не производится.
incf CCPR1L,F ; Если поднялся, то инкремент CCPR1L
; производится.
;---------------------------------------------------
; Запись измененного значения.
;---------------------------------------------------
swapf Temp,W ; Восстановление содержимого CCP1CON
movwf CCP1CON ; с учетом инкремента.

bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.


retfie ; Выход из прерывания.
;--------------------------------------------------------------------------------

;================================================================================
; Начало программы.
;================================================================================
; Подготовительные операции.
;--------------------------------------------------------------------------------
; Задание длительности периода, длительности импульса,
; подготовка TMR2 и настройка RB3 на работу "на выход".
;------------------------------------------------------
START bsf Status,RP0 ; Переход в 1-й банк.
movlw .249 ; Задание длительности
movwf PR2 ; периода (.249).
bcf TrisB,3 ; RB3 работает на выход.
bcf Status,RP0 ; Переход в 0-й банк.

clrf TMR2 ; Сброс TMR2.


clrf CCPR1L ; Задание начальной длительности импульса
; в части касающейся CCPR1L (.0).
;------------------------------------------
; Настройка модуля CCP.
;------------------------------------------
movlw b'00011111' ; Включение режима ШИМ и задание начальной
movwf CCP1CON ; длительности импульса в части касающейся
; CCP1CON,5,4 (.1).
; Примечание: работа устройства начинается с CCPR1L/CCP1CON,5,4 = .1
;------------------------------------------
; Разрешение прерываний от модуля TMR2.
;------------------------------------------
movlw b'11000000' ; Глобальное разрешение прерываний и
movwf IntCon ; разрешение прерываний от периферийных
; модулей.
bsf Status,RP0 ; Переход в 1-й банк.
movlw b'00000010' ; Разрешение прерываний
movwf PIE1 ; от модуля TMR2.
bcf Status,RP0 ; Переход в 0-й банк.
;------------------------------------------
; Сброс флага TMR2IF и разрешение счета.
;------------------------------------------
bcf PIR1,TMR2IF ; Сброс флага прерывания по переполнению TMR2.
movlw b'00011101' ; TMR2 включен, Кдел.предделителя = 4,
movwf T2CON ; Кдел.выходного делителя = 4.
;------------------------------------------
goto $ ; "Мертвяк" (отсюда происходят уходы
; в прерывания).
;********************************************************************************
end ; Конец программы.

8
В "подготовительные операции" добавляется процедура разрешения прерываний от
модуля TMR2.
В "зоне" разрешения прерываний - команда, зацикленная сама на себя ("мертвяк").
На основе ПП SNOVA "стряпается" ПП прерывания.
В этом случае, проверка состояния флага TMR2IF ("плавающая" задержка) не нужна и
она "выбрасывается на помойку".
В ПП прерывания добавляется команда retfie.
"Шапка" программы "доукомплектовывается" "пропиской" регистров IntCon и PIE1.
В конец "шапки" добавляется goto START (чтобы "перепрыгнуть" через ПП прерывания)
и org 4 (при работе с прерываниями, обязательно).
После этих нехитрых "манипуляций" получилась программа, обеспечивающая малую
инерционность отклика.
За это "платится" увеличением количества команд.
В данном случае, в связи с низкими требованиями к инерционности отклика, более
оптимальной является программа Schim_1.asm (зачем "переплачивать"?)
Программой Schim_2.asm я просто "проиллюстрировал" принцип перехода от
программы, в которой используется проверка флага прерывания, к программе, в
которой используется тот тип прерывания, который связан с этим флагом.
В других случаях, более оптимальной может оказаться программа с уходами в
прерывания.

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

9
10