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 ;пустая команда
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.