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

1.  Цей оброблювач має виконувати - інкремент 16-розрядного лічильника в пам'яті даних, тому для цього лічильника у пам'яті даних беремо дві комірки (8-розрядні) одна з яких буде молочшою, а інша старшою частиною 16-розрядного лічильника. Кожного разу коли це преривання буде траплятися буде виконуватися інкремент молочшої частини 16-розрядного лічильника та якщо трапиться її переповнення буде виконуватися інкремент старшої частини 16-розрядного лічильника.

2.  У кінці кожного оброблювача преривання необхідно зробити скидання біту цього преривання у регістрі INTCON, бо це не робиться апаратно, тому в кінці цієї підпрограми оброблювача преривання на виводі RB0/INT ми маємо зробити скидання біту INTF, а далі робимо повернення з цієї підпрограми оброблювача преривання.

б) алгоритм роботи підпрограми оброблювача преривання на виводі RB4.

1.  Цей оброблювач має виконувати - формування позитивного імпульсу тривалістю ti =7tц на виводі RA1, але спочатку треба у оброблювачі зробити перервірку, чи дійсно преривання трапилося за зміною рівня сигналу на виводі RB4, а не на іншому з виводів: RB5, RB6 або RB7. Для цоьго робимо порівняння значення порту В до та після преривання, а саме перевіряємо чи змінилося значення на виводі RB4, якщо ні, то переходимо на кінець підпрограми та далі робимо повернення з цієї підпрограми оброблювача цього преривання; якщо так, то робимо формування позитивного імпульсу тривалістю ti на виводі RA1: для цього встановлюємо RA1 у “1” та далі робимо необхідну затримку за допомогою порожніх команд, кожна з яких нічого не робить, закрема затримки у один такт мікроконтролера. Після виконання необхідної затримки робимо скидання RA1 та перехід на кінець підпрограми де ми зберігаємо значення порту В у відповідній комірці пам’яті та скидання біту RBIF у регістрі INTCON і виконуємо повернення з цієї підпрограми оброблювача цього преривання.

Розобивши алгоритм виконання завдання, напишемо текст програми, яка буде працювати за цим алгоритмом:

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

       list p=16f84a         ;определение типа мк

       #include p16f84.inc   ;подключение файла p16f84a.inc

       counter_l EQU 0x0c    ;молодша частина 16-розрядного лічильника

        oldportb EQU 0x0d    ;попереднє значення порту В

             T_W EQU 0x0e    ;комірка для збереження старого значення регістру W

        T_STATUS EQU 0x0f    ;комірка для збереження старого значення регістру STATUS

        counter_h EQU 0x10   ;старша частина 16-розрядного лічильника

             test EQU 0x11   ;допоміжня комірка

       bcf INTCON, GIE       ;запрет прерываний

       goto start            ;перейт на початок програми

int_point

       org 0x04              ;начало вектора прерываний

       bcf INTCON, GIE       ;запрет прерываний

        movwf T_W             ;сохраняем значение W

        swapf STATUS,W               ;сохранение регистра

       movwf T_STATUS        ;STATUS

       btfsc INTCON,INTF     ;ожидание появления сигнала на ножке INT

       call obrob_INT        ;вызов подпрограммы

       btfsc INTCON,RBIF     ;ожидание смены сигнала на RB7-RB4

       call obrob_RB4       ;вызов подпрограммы

       swapf T_STATUS,W      ;востановление STATUS

       movwf STATUS

        movf T_W,0              ;востановление W

        bsf INTCON, GIE              ;разрешение прерываний

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

start  call init             ;вызов подпрограммы ініціалізації

       movlw b'10011000'     ;запрет ненужных и разрешение

       movwf INTCON            ;нужных прерываний

       movf PORTB,0            ;чтение состаяния порта В

        movwf oldportb          ;сохранение для следубщего сравнения     

loop

       nop                    ;пустая команда