Система преривань мікроконтролера PIC16F84. Власні оброблювачі преривань

Страницы работы

10 страниц (Word-файл)

Фрагмент текста работы

поточного, і відновлюється за командою повернення з переривання. Адреса повернення посилається в стек, а в програмний лічильник завантажується адреса 0004h. Час реакції на переривання для зовнішніх подій, таких як переривання від ніжки INT або порту B, складає приблизно п'ять циклів. Це на один цикл менше, ніж для внутрішніх подій, таких як переривання по переповненню від таймера RTCC. Час реакції завжди однаковий. В підпрограмі обробки переривання джерело переривання може бути визначене по відповідному біту в регістрі прапорців. Цей прапорець-біт повинен бути програмно скинутий всередині підпрограми. Прапорці запитів переривань не залежать від відповідних бітів, що маскують, і біта загального маскування GIE. Команда повернення з переривання RETFIE завершує підпрограму, що перериває, і встановлює біт GIE, щоб знов дозволити переривання.

Управляючий регістр переривань INTCON (Адреса: 0Bh. Значення при reset: 0000 000?) має наступний зміст:

7

6

5

4

3

2

1

0

 

GIE

ADIE

RTIE

INTE

RBIE

RTIF

INTF

RBIF

 
 

RBIF

– Прапорець переривання від зміни на порту RB.

Прапорець встановлюється, коли сигнал на вході RB < 7:4 > змінюється.

Прапорець скидається програмним способом.

INTF

– Прапорець переривання INT.

Прапорець встановлюється, коли на ніжці INT з'являється сигнал від зовнішнього джерела переривання.

Прапорець скидається програмним способом.

RTIF

– Прапорець переривання від переповнення RTCC.

Прапорець встановлюється, коли RTCC переповнюється.

Прапорець скидається програмним способом.

RBIE

– Біт дозволу/заборони RBIF переривання:

RBIE = 0 – забороняє RBIE переривання;

RBIE = 1 – дозволяє RBIE переривання.

INTE– Біт дозволу/заборони INT переривання

INTE = 0 –  забороняє INT переривання;

INTE = 1 –  дозволяє INT переривання.

RTIE

– Біт дозволу/заборони RTIF переривання:

RTIE = 0 –  забороняє RTIE переривання;

RTIE = 1 – дозволяє RTIE переривання.

GIE

– Біт дозволу/заборони всіх переривань:

GIE = 0 – забороняє переривання;

GIE = 1: – дозволяє переривання.

Він скидається автоматично при наступних обставинах:

·  при  включенні живлення;

·  за зовнішнім сигналом /MCLR при нормальній роботі;

·  за зовнішнім сигналом /MCLR в режимі SLEEP;

·  по закінченню затримки таймера WDT при нормальній роботі;

·  по закінченню затримки таймера WDT в режимі SLEEP.

Прапорець запиту переривання по закінченні запису даних-констант в довготривалу пам'ять EEIF (EECON1<5>) встановлюється по закінченню автоматичного запису в EEPROM. Це переривання може бути замасковане скиданням біта EEIE (INTCON<6>).

Скидання біта запиту переривання EEIF в регістрі EECON1<5> може бути здійснено в програмі обробки.

Алгоритми програми:           Основна програма:


Обробник преривання від таймеру:

 


Обробник преривання зі входу RB0:

 


Рис.3. Схема алгоритму обробника преривання зі входу RB0

Текст програми:

list p=16f84                     ; тип используемого ОМК

 #include <p16f84.inc>   ; подключение описаний регистров ОМК

H_COUNT           equ 0Ch                      ; старшая часть счетчика

L_COUNT           equ 0Dh                      ; младшая часть счетчика

 org           00h                  ; переход на начало программы

 goto         main              

 org           04h                  ; обработка прерывания осуществляется за 9 циклов (4,5 мкс)

 btfss        INTCON, T0IF           ; анализ

 goto         rb0                  ;   источника прерывания

tmr                                               ; обработчик прерывания от таймера

 movlw     0BBh              ; запись в таймер

 movwf     TMR0             ;   нового значения

 movlw     01h                  ; инверсия уровня

 xorwf      PORTA, F       ;   сигнала на выходе RA0

 bcf           INTCON, T0IF           ; сброс флага переполнения от таймера

 retfie                               ; возврат из прерывания

rb0                                               ; обработчик прерывания со входа RB0

 incfsz      L_COUNT                  ; инкремент младшей части счетчика

 goto         next                 ; при переполнении младшей части

 incf          H_COUNT                 ;   инкремент старшей части счетчика

next                                  ; сброс флага,

 bcf           INTCON, INTF          ;   сигнализирующего о прерывании со входа RB0

 retfie                               ; возврат из прерывания

 org           0AAh              ; адрес программы в памяти программ

main                                ; начало рабочей части программы

 movlw     b'10110000'    ; инициализация

 movwf     INTCON                     ;   регистра INTCON

 bsf           STATUS, RP0            ; выбор банка 1

 clrf          TRISA            ; сброс регистра TRISA

 clrf          OPTION_REG           ; сброс регистра OPTION_REG

 bcf           STATUS, RP0            ; выбор банка 0

 clrf          H_COUNT                 ; сброс

 clrf          L_COUNT                  ;   счетчика

 goto         $                      ; зацикливание

 end                                  ; конец

Вміст файлу лістінгу програми:

MPASM 02.20 Released          LAB5TMR.ASM   4-23-2004  15:48:36         PAGE  1

LOC  OBJECT CODE     LINE SOURCE TEXT

  VALUE

                    00001  list p=16f84           ; тип используемого ОМК

                    00002  #include <p16f84.inc>  ; подключение описаний регистров ОМК

                    00001         LIST

                    00002 ; P16F84.INC  Standard Header File, Version 2.00    Microchip Technology, Inc.

                    00136         LIST

                    00003

  0000000C          00004 H_COUNT equ 0Ch         ; старшая часть счетчика

  0000000D          00005 L_COUNT equ 0Dh         ; младшая часть счетчика

                    00006

0000                00007  org    00h             ; переход на

0000 28AA           00008  goto   main            ;   начало программы

                    00009

0004                00010  org    04h             ; обработка прерывания осуществляется за 9 циклов (4,5 мкс)

0004 1D0B           00011  btfss  INTCON, T0IF    ; анализ

0005 280C           00012  goto   rb0             ;   источника прерывания

                    00013

0006                00014 tmr                     ; обработчик прерывания от таймера

0006 30BB           00015  movlw  0BBh            ; запись в таймер

0007 0081           00016  movwf  TMR0            ;   нового значения

0008 3001           00017  movlw  01h             ; инверсия уровня

0009 0685           00018  xorwf  PORTA, F        ;   сигнала на выходе RA0

000A 110B           00019  bcf    INTCON, T0IF    ; сброс флага переполнения от таймера

000B 0009           00020  retfie                 ; возврат из прерывания

                    00021

000C                00022 rb0                     ; обработчик прерывания со входа RB0

Message[305]: Using default destination of 1 (file).

000C 0F8D           00023  incfsz L_COUNT         ; инкремент младшей части счетчика

000D 280F           00024  goto   next            ; при переполнении младшей части

Message[305]: Using default destination of 1 (file).

000E 0A8C           00025  incf   H_COUNT         ;   инкремент старшей части счетчика

000F                00026 next                    ; сброс флага,

000F 108B           00027  bcf    INTCON, INTF    ;   сигнализирующего о прерывании со входа RB0

0010 0009           00028  retfie                 ; возврат из прерывания

                    00029

00AA                00030  org    0AAh            ; адрес программы в памяти программ

00AA                00031 main                    ; начало рабочей части программы

00AA 30B0           00032  movlw  b'10110000'     ; инициализация

00AB 008B           00033  movwf  INTCON          ;   регистра INTCON

00AC 1683           00034  bsf    STATUS, RP0     ; выбор банка 1

Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.

00AD 0185           00035  clrf   TRISA           ; сброс регистра TRISA

Message[302]: Register in operand not in bank 0.  Ensure that bank bits are correct.

00AE 0181           00036  clrf   OPTION_REG      ; сброс регистра OPTION_REG

00AF 1283           00037  bcf    STATUS, RP0     ; выбор банка 0

00B0 018C           00038  clrf   H_COUNT         ; сброс

00B1 018D           00039  clrf   L_COUNT         ;   счетчика

                    00040

00B2 28B2           00041  goto   $               ; зацикливание

                    00042  end                    ; конец

MPASM 02.20 Released          LAB5TMR.ASM   4-23-2004  15:48:36         PAGE  2

SYMBOL TABLE

  LABEL                             VALUE

C                                 00000000

DC                                00000001

EEADR                             00000009

EECON1                            00000088

EECON2                            00000089

EEDATA                            00000008

EEIE                              00000006

EEIF                              00000004

F                                 00000001

FSR                               00000004

GIE                               00000007

H_COUNT                           0000000C

INDF                              00000000

INTCON                            0000000B

INTE                              00000004

INTEDG                            00000006

INTF                              00000001

IRP                               00000007

L_COUNT                           0000000D

NOT_PD                            00000003

NOT_RBPU                          00000007

NOT_TO                            00000004

OPTION_REG                        00000081

PCL                               00000002

PCLATH                            0000000A

PORTA                             00000005

PORTB                             00000006

PS0                               00000000

PS1                               00000001

PS2                               00000002

PSA                               00000003

RBIE                              00000003

RBIF                              00000000

RD                                00000000

RP0                               00000005

RP1                               00000006

STATUS                            00000003

T0CS                              00000005

T0IE                              00000005

T0IF                              00000002

T0SE                              00000004

TMR0                              00000001

TRISA                             00000085

TRISB                             00000086

W                                 00000000

WR                                00000001

WREN                              00000002

WRERR                             00000003

Z                                 00000002

_CP_OFF                           00003FFF

_CP_ON                            0000000F

_HS_OSC                           00003FFE

_LP_OSC                           00003FFC

MPASM 02.20 Released          LAB5TMR.ASM   4-23-2004  15:48:36         PAGE  3

SYMBOL TABLE

  LABEL                             VALUE

_PWRTE_OFF                        00003FFF

_PWRTE_ON                         00003FF7

_RC_OSC                           00003FFF

_WDT_OFF                          00003FFB

_WDT_ON                           00003FFF

_XT_OSC                           00003FFD

__16F84                           00000001

main                              000000AA

next                              0000000F

rb0                               0000000C

tmr                               00000006

MEMORY USAGE MAP ('X' = Used,  '-' = Unused)

0000 : X---XXXXXXXXXXXX X--------------- ---------------- ----------------

0080 : ---------------- ---------------- ----------XXXXXX XXX-------------

All other memory blocks unused.

Program Memory Words Used:    23

Program Memory Words Free:  1001

Errors   :     0

Warnings :     0 reported,     0 suppressed

Messages :     4 reported,     0 suppressed

Послідовність дій при тестуванні:

1. Запускаю пакет MPLAB.

2.Створюю нове вікно, набираю текст програми, зберігаю його.

3. Захожу в опції та обираю тип мікро контролера: Options –> Development

    Mode – вибір типу мікроконтролера (PIC16F84) і режиму (Simulator).

4. Компілюю мою програму: Project –> Build Node.

5. Якщо є помилки , то вони зберігаються у файлі лістінгу або у файлі помилок

    (lst, err). Виправляю помилки.

6. Debug –> Simulator Stimulus –> Clock Stimulus ... – задаю зовнішні сигнали

    на входи портів вводу/виводу.

7. Window –> Special Function Registers – відкриття вікна регістрів

    спеціального призначення.

Рис.4. Вікно Special Function Registers.

В ході програми я можу спостерігати за станом регістрів спеціального призначення за допомогою цього вікна.

8. Debug –> Run –> Reset – скидання мікроконтролера.

9. Debug –> Run –> Step – покрокове виконання програми.

10. File –> Exit – вихід із програми.

Результати виконання програми:

В результаті виконання лабораторної роботи я написала оброблювачі переривань який виконує обробку переривань від таймера та від зміни рівня сигналу на виводі RB4.

Рис.5. Вікно результатів компіляції.

Отриманий мною обробник переривань виконує обробку переривання

Похожие материалы

Информация о работе