.
Открываем в MPLAB IDE проектTest_01 и добавляем в код программы строки выделенные синим цветом. Тем самым подключаем для наглядности к выходу порта "В" , 2 еще один светодиод. Он будет переключаться по прерыванию, т.е. при каждом переполнении таймера TMR0 светодиод будет инвертировать свое состояние. (задействуем прерывание от переполнения таймера TMR0).
{showhide title="Смотреть код программы" template="strong" changetitle="Свернуть код программы" mousetitleistitle=true closeonclick=true titleasspan=true}
list p=18F252 ; Используется микроконтроллер PIC18F252. #include p18F252.inc ; Подключение INC-файла PIC18F252. ;*************************************************************************** ; Конфигурирование. ;*************************************************************************** CONFIG OSC=XT ; кварц.резонатор CONFIG BOR=OFF ; Сброс по снижению питания выключен CONFIG WDT=OFF ; WDT выключен. CONFIG LVP=OFF ; Режим низковольтного програм. выкл. ;************************************ ; Присвоение ;************************************ #define led_1 LATB,1 ; #define led_2 LATB,2 ; ;************************************ ; Регистры общ. назначения ;************************************ cblock 20h ; Reg_1 ; Reg_2 ; Reg_3 ; endc ; ;******************************************************************* org 0 ; goto START ; ;---------------------------------------- ;добавляем в программу вектор прерывания ;---------------------------------------- org 08h ; H вектор прерывания btg led_2 ; инвертирование сигнала (светодиод №2) bcf INTCON,2 ; сброс флага TMR0 RETFIE 1 ; выход из прерывания с восст. ;************************************ ; иницилизация ;************************************ START movlw b'00000000'; movwf TRISB ; Конфигурирование порта B movlw b'10000000' ; настройка ТMR0 movwf T0CON ; movlw b'11100000' ; = разрешаем глоб.прерывания +периферия+ movwf INTCON ;переполнению TMR0+ сброс флага TMR0= ;=================================================================== ; Начало программы. ;=================================================================== Povtor bsf led_1 ; включаем светодиод call Pause_1 ; ждем одну секунду bcf led_1 ; выключаем светодиод call Pause_1 ; ждем одну секунду goto Povtor ; зацикливаем программу. ;************************************ ; Пауза 1 секунда ;************************************ Pause_1 movlw .173 movwf Reg_1 movlw .19 movwf Reg_2 movlw .6 movwf Reg_3 decfsz Reg_1 bra $-2 decfsz Reg_2 bra $-6 decfsz Reg_3 bra $-.10 return ;************************************* end
{/showhide}
В данном примере приоритетная система прерываний выключена, т.е. IPEN=0 и соответственно вектор перехода будет всегда 000008h (08h).
Давайте включим приоритетную систему прерываний установкой бита IPEN регистра управления RCON и задействуем для примера еще один таймер TMR1, который будет иметь низкий приоритет по отношению к TMR0. При сбросе микроконтроллера все регистры выбора приоритета устанавливаются "1" т.е. включен высокий приоритет, для того что бы TMR1 имел низкий приоритет необходимо сбросить бит "0" регистра IPR1. что мы и сделали в примере программы, предоставленной ниже (выделено синим цветом).
Для наглядности подключим к биту 3 порта"В" еще один светодиод и "нарисуем" его в проекте Протеуса, с помощью которого и будем визуально наблюдать работу приоритетной системы прерывания .Теперь при переполнении TMR0 произойдет переход с вектором 08h , а при переполнении TMR1 с вектором 18h.
{showhide title="Смотреть код программы" template="strong" changetitle="Свернуть код программы" mousetitleistitle=true closeonclick=true titleasspan=true}
list p=18F252 ; Используется микроконтроллер PIC18F252. #include p18F252.inc ; Подключение INC-файла PIC18F252. ;*************************************************************************** ; Конфигурирование. ;*************************************************************************** CONFIG OSC=XT ; кварц.резонатор CONFIG BOR=OFF ; Сброс по снижению питания выключен CONFIG WDT=OFF ; WDT выключен. CONFIG LVP=OFF ; Режим низковольтного програм. выкл. ;************************************ ; Присвоение ;************************************ #define led_1 LATB,1 ; #define led_2 LATB,2 ; #define led_3 LATB,3 ; ;************************************ ; Регистры общ. назначения ;************************************ cblock 20h ; Reg_1 ; Reg_2 ; Reg_3 ; endc ; ;******************************************************************* org 0 ; goto START ; ;---------------------------------------- ;H вектор прерывания ;---------------------------------------- org 08h ; H вектор прерывания btg led_2 ; инвертирование сигнала (светодиод №2) bcf INTCON,2 ; сброс флага TMR0 RETFIE ; выход из прерывания ;---------------------------------------- ;L вектор прерывания ;---------------------------------------- org 18h ; L вектор прерывания btg led_3 ; инвертирование сигнала (светодиод №3) bcf PIR1,0 ; сброс флага TMR1 RETFIE ; выход из прерывания ;************************************ ; иницилизация ;************************************ START movlw b'00000000'; movwf TRISB ; Конфигурирование порта B movlw b'10000000' ; настройка ТMR0 movwf T0CON ; movlw b'00000001' ; включаем ТMR1 movwf T1CON ; movlw b'11100000' ; = разрешаем глоб.прерывания +периферия+ movwf INTCON ;переполнению TMR0+ сброс флага TMR0= bcf PIR1,0 ; сброс флага TMR1 bsf PIE1,0 ; Разрешаем прерывание от TMR1 bsf RCON,IPEN ; разрешаем приор. систему прирываний bcf IPR1,0 ; выбор низкого приоритета TMR1 ;=================================================================== ; Начало программы. ;=================================================================== Povtor bsf led_1 ; включаем светодиод call Pause_1 ; ждем одну секунду bcf led_1 ; выключаем светодиод call Pause_1 ; ждем одну секунду goto Povtor ; зацикливаем программу. ;************************************ ; Пауза 1 секунда ;************************************ Pause_1 movlw .173 movwf Reg_1 movlw .19 movwf Reg_2 movlw .6 movwf Reg_3 decfsz Reg_1 bra $-2 decfsz Reg_2 bra $-6 decfsz Reg_3 bra $-.10 return ;************************************* end
{/showhide}
Еще очень часто встречается ситуация, когда задействовано несколько прерываний с одним приоритетом и вектор перехода у них соответственно тот же один. В этом случае для "выявления" источника прерывания необходимо проверить флаги задействованных источников (периферийных модулей или внешних) и перейти на соответствующую ПП обработки прерываний, к примеру как показано здесь.
org 08h ; (18h) btfsc INTCON,2 ; проверяем флаг таймера TMR0 goto Pr_0 ; установлен ? переходим на обработку btfsc INTCON,1 ; проверяем флаг по входу INT0 goto Pr_INT0 ; установлен ? переходим на обработку btfsc INTCON3,0 ; проверяем флаг по входу INT1 goto Pr_INT1 ; установлен ? переходим на обработку
;----------------------------------------------------
; обработка прерывания TMR0
;----------------------------------------------------
; Pr_0
Здесь ПП обработки прерывания
bcf INTCON,2 ; сброс флага TMR0 RETFIE 1 ; выход из прерывания с восст.
;----------------------------------------------------
; обработка прерывания INT0
;----------------------------------------------------
; Pr_INT0
Здесь ПП обработки прерывания
bcf INTCON,1 ; сброс флага INT0 RETFIE 1 ; выход из прерывания с восст.
;----------------------------------------------------
; обработка прерывания INT1
;----------------------------------------------------
Pr_INT1
Здесь ПП обработки прерывания
bcf INTCON3,0 ; сброс флага INT1 RETFIE 1 ; выход из прерывания с восст.
Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2021 © ChipMK.ru
![]() |
|