Прерывания в семействе PIC18 xxxx

Автор: Super User Просмотров: 12160

Открываем  в 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-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru