Виконання підпрограми переривання
Система переривань формує апаратний виклик (LCALL) відповідної підпрограми обслуговування, якщо вона не заблокована однією з наступних умов:
у цей момент обслуговується запит переривання рівного або високого рівня пріоритету;
поточний машинний цикл - не останній у циклі виконуваної команди;
виконується команда RETI або будь-яка команда, пов'язана зі звертанням до регістрів IЕ або IP
Відзначимо, що якщо прапор переривання був встановлений, але по одному із зазначених вище умов не одержав обслуговування й до моменту закінчення блокування вже скинутий, то запит переривання губиться й ніде не запам'ятовується.
По апаратно сформованому коді LCALL система переривання поміщає в стек тільки вміст лічильника команд (PC) і завантажує в нього адреса вектора відповідної підпрограми обслуговування. За адресою вектора повинна бути розташована команда безумовної передачі керування (JMP) до початкової адреси підпрограми обслуговування переривання. Якщо буде потреба вона повинна починатися командами запису в стек (PUSH) слова стану програми (PSW), акумулятора, розширника, покажчика даних і т.д. і повинна закінчуватися командами відновлення зі стека (POP). Підпрограми обслуговування переривання повинні завершуватися командою RETI, по якій у лічильник команд перезавантажується зі стека збережена адреса повернення в основну програму. Команда RET також повертає керування перерваній основній програмі, але при цьому не знімуть блокування переривань, що приводить до необхідності мати програмний механізм аналізу закінчення процедури обслуговування даного переривання
Приклад програми обробки переривання
Виведіть на індикатор цифру «1», при надходженні переривання по входу INT0 виведіть цифру «5».
org 0000h
jmp start
org 0003h ;перехід до підпрограми обробки переривань
jmp s1
org 0100h
start: mov ie,#10000001b ; дозвіл переривань INT0
mov p0,#01h
jmp start
s1: mov p0,#05h ; підпрограма обробки переривання INT0
reti ; повернення до виконання основної програми
end
Приклад програми програмування таймера
Настройте таймер на режим генератора із частотою 1 Гц (тактова частота процесора 120 кгц).
org 0000h
jmp start
org 000Bh ;перехід до підпрограми обробки переривань від таймера
jmp s2
org 0100h
start:
mov tmod,#00000001b ; настроювання режиму роботи таймера
mov ie,#10000010b ; дозвіл переривань від таймера
mov th0,#0d8h ; попередня установка таймера
mov tl0,#0f0h
mov tcon,#00010000b ; запуск таймера
st: nop
jmp st
s2: mov th0,#0d8h ; підпрограма обробки переривання від таймера
mov tl0,#0f0h ; попередня установка таймера
reti
end
Приклад програми передачі інформації через послідовний порт
На молодшому розряді семи сегментного індикатора реалізувати інкрементний рахунок. При натисканні кнопки передати вміст лічильника на другий контролер і відобразити на індикаторі. Рахунок триває при натисканні кнопки. Провести передачу даних через послідовні порти, настроєні на перший режим з тактовій частоті процесора 11,059 Мгц і швидкості передачі 9,6 Кгц.
Програма передавача.
org 0000h
jmp start
org 0003h
lcall switch ; обробка переривання від кнопки
reti
org 0023h
lcall uartper ; обробка переривання від передавача
reti
org 000bh ; обробка переривання від таймера
lcall timer
reti
org 0100h
start:
mov tmod,#00100001b ; настроювання режимів роботи таймерів
mov ie,#10010011b ; дозвіл переривань від приемопередавача,
; кнопки, таймера
mov th0,#0d8h ; попередня установка таймера 0
mov tl0,#0f0h
mov tl1,#0FDh ; попередня установка таймера 1
mov th1,#0FDh
mov tcon,#01010001b ; запуск таймерів
mov pcon,#0h ; настроювання приемопередавача
mov scon,#01000000b
s3: mov a,r2 ; відображення даних на індикаторі
anl a,#00001111b
orl a,#01110000b
mov p2,a
mov p2,#10110000b
mov p2,#11010000b
mov p2,#11100000b
jmp s3
switch: mov SBUF,r2 ; передача даних
ret
uartper: clr ti ; скидання біта, що сигналізує про закінчення передачі
ret
timer: mov th0,#0d8h ; підпрограма обробки переривань від таймера
mov tl0,#0f0h
inc r6
cjne r6,#40,s5
mov r6,#0
inc r2
cjne r2,#10,s5
mov r2,#0
s5: ret
end
Програма приймача
org 0000h
jmp start
org 0023h
lcall uartpr ; обробка переривання від приймача
reti
org 0100h
start:
mov tmod,#00100000b ; настроювання режимів роботи таймера 1
mov ie,#10010000b ; дозвіл переривань від приемопередавача
mov tl1,#0FDh ; попередня установка таймера 1
mov th1,#0FDh
mov tcon,#01000000b ; запуск таймера 1
mov pcon,#0h ; настроювання приемопередавача
mov scon,#01010000b
jmp start
uartpr: clr ri ; скидання біта прийому, що сигналізує про закінчення
mov p2,sbuf ; відображення прийнятих даних
ret
end