ЛАБОРАТОРНАЯ РАБОТА № 6
Тема: ИССЛЕДОВАНИЕ МЕХАНИЗМА ПРЕРЫВАНИЙ
Цель: ознакомиться с принципами использования механизма прерываний.
2.1 Краткие сведения из теории
Прерыванием называется приостановка выполнения текущей программы и передача управления программе-обработчику прерывания в определенных, заранее оговоренных ситуациях. Ситуация, вызвавшая прерывание, называется источником прерываний. Адрес программы-обработчика прерываний называется вектором прерываний.
Контроллер имеет 4 источника прерываний:
· изменение состояния битов RB4..RB7;
· перепад 0\1 или 1\0 на входе RB0;
· переполнение таймера;
· окончание записи в ЭППЗУ данных.
При возникновении прерывания от любого из этих источников в счетчик команд записывается адрес 0004h, то есть управление передается команде, находящейся по этому адресу.
Управление прерываниями (разрешение, запрещение, определение источника) осуществляется регистром INTCON с адресом 0x0B.
Назначение битов регистра INTCON.
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
GIE |
EEIE |
TOIE |
INTE |
RBIE |
TOIF |
INTF |
RBIF |
GIE – разрешает/запрещает одновременно все прерывания (1 – прерывания разрешены, 0 – запрещены);
EEIE – разрешает/запрещает прерывание по окончании записи в ЭППЗУ данных;
TOIE – разрешает/запрещает прерывания от таймера;
INTE – разрешает/запрещает прерывания от нулевого бита PORTB;
RBIE – разрешает/запрещает прерывания от битов с 4-го по 7-й PORTB;
TOIF – устанавливается в единицу при возникновении прерывания от таймера;
INTF – устанавливается в единицу при возникновении прерывания от нулевого бита PORTB;
RBIF – устанавливается в единицу при возникновении прерывания от битов с 4-го по 7-й PORTB.
Состояние регистра INTCON при загрузке контроллера – все нули, то есть по умолчанию все прерывания запрещены.
Бит общего разрешения/запрещения прерывания GIE (INTCON <7>) разрешает (если = 1) все индивидуально незамаскированные прерывания или запрещает их (если = 0). Каждое прерывание в отдельности может быть дополнительно разрешено/запрещено установкой/сбросом соответствующего бита в регистре INTCON.
Бит GIE при сбросе обнуляется. Когда начинает обрабатываться прерывание, бит GIE обнуляется, чтобы запретить дальнейшие прерывания, адрес возврата посылается в стек, а в программный счетчик загружается адрес 0004h. Время реакции на прерывание для внешних событий, таких как прерывание от ножки INT или порта B, составляет приблизительно пять циклов. Это на один цикл меньше, чем для внутренних событий, таких как прерывание по переполнению от таймера TMR0. Время реакции всегда одинаковое.
В подпрограмме обработки прерывания источник прерывания может быть определен по соответствующему биту в регистре признаков. Этот флаг-признак должен быть программно сброшен внутри подпрограммы. Признаки запросов прерываний не зависят от соответствующих маскирующих битов и бита общего маскирования GIE.
Команда возврата из прерывания RETFIE завершает прерывающую подпрограмму и устанавливает бит GIE, чтобы опять разрешить прерывания.
Логика прерываний контроллера изображена на рис. 1
Рис. 1. Логика прерываний микроконтроллера
Внешнее прерывание на ножке RB0/INT осуществляется по фронту: либо по нарастающему (если в регистре OPTION бит INTEDG=1), либо по спадающему (если INTEDG=0). Когда фронт обнаруживается на ножке INT, бит запроса INTF устанавливается в единицу (INTCON <1>). Это прерывание может быть замаскировано сбросом управляющего бита INTE в ноль (INTCON <4>). Бит запроса INTF необходимо очистить прерывающей программой перед тем, как опять разрешить это прерывание. Прерывание INT может вывести процессор из режима SLEEP, если перед входом в этот режим бит INTE был установлен в единицу. Состояние бита GIE также определяет, будет ли процессор переходить на подпрограмму прерывания после выхода из режима SLEEP.
Любое изменение сигнала на одном из четырех входов порта RB<7:4> устанавливает в единицу бит RBIF (INTCON<0>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски RBIE (INTCON<3>). Сброс запроса RBIF – дело программы обработки.
Переполнение счетчика TMR0 (FFh->00h) устанавливает в единицу бит запроса T0IF (INTCON<2>). Это прерывание может быть разрешено/запрещено установкой/сбросом бита маски T0IE (INTCON<5>). Сброс запроса T0IF – дело программы обработки.
Признак запроса прерывания по завершении записи в EEPROM, EEIF (EECON1<4>) устанавливается в единицу по окончании автоматической записи данных в EEPROM. Это прерывание может быть замаскировано сбросом бита EEIE (INTCON<6>). Сброс запроса EEIF – дело программы обработки.
2.2 Общая схема программы, использующей механизм прерываний
Org 0 ; размещаем команду Goto STARTпо адресу 0
Goto START ; переход на начало основной программы
Org 4 размещаем команду Goto INTERRUPT по адресу 4
Goto INTERRUPT ; переход на начало программы обработки ; прерываний
START ;начало основной программы
<разрешить прерывания от нужных источников>
<разрешить все прерывания>
<тело основной программы>
INTERRUPT ; начало процедуры обработки прерываний
<определить источник прерывания, проверив соответствующие биты регистра INTCON, перейти на нужную процедуру обработки прерывания от данного источника, сбросить бит индикации прерывания>
Retfie ; завершить процедуру обработки прерываний
2.3 Задание на лабораторную работу № 6
Используя первые два источника прерываний, запрограммировать контроллер как кольцевой буфер на n ячеек, начиная с адреса r. Данные в кольцевой буфер поступают от передатчика по прерыванию с RB4..RB7 по этим же битам. Отсылка данных производится на PORTA по сигналу прерывания от RB0. При возникновении ситуации «буфер переполнен» отсылать сигнал по линии RB1 передатчику, ситуации «буфер пуст» – по линии RB2 приемнику.
Буфер – устройство, позволяющее осуществлять временное хранение данных до момента их востребования.
Кольцевой буфер – последовательность ячеек памяти, запись и выборка информации из которого осуществляется следующим образом. Имеется два указателя: на первую ячейку с информацией – «голову» и на свободную ячейку-«хвост». При поступлении новых данных, они записываются в ячейку, на которую указывает «хвост», который при этом смещается либо к следующей ячейке, либо на начало буфера, если был достигнут конец буфера. При поступлении запроса на получение данных из буфера, они извлекаются из ячейки, на которую указывает «голова», а сам указатель на «голову» смещается к следующей ячейке либо в начало аналогично «хвосту». Таким образом, информация из буфера извлекается в том же порядке, в котором поступала, а указатели на «голову» и «хвост» перемещаются по кольцу.
2.4 Пример использования прерываний от нескольких источников
Кольцевой буфер начинается по адресу 0x0d и состоит из 10 ячеек.
Решение.
|
Org 0 |
; размещаем команду по адресу 0 |
|
Goto START |
; переход на начало основной программы |
|
Org 4 |
; размещаем команду по адресу 4 |
|
Goto INT |
; переход на процедуру обработки прерываний |
START |
bsf STATUS,RP0 |
; переключаемся в банк 1 |
|
Movlw B’11111001’ |
; настраиваем 1-й и 2-й биты PORTB |
|
Movwf TRISB |
; на выход |
|
bcf STATUS,RP0 |
; переключаемся в банк 0 |
|
Movlw 0x0d |
; настраиваем указатели head и |
|
Movwf head |
; tail |
|
Movwf tail |
; на начало кольцевого буфера |
|
Bsf INTCON,INTE |
; разрешаем прерывания от бита 0 PORTB |
|
Bsf INTCON,RBIE |
; разрешаем прерывания от битов 4 – 7 PORTB |
|
Bsf INTCON,GIE |
; разрешаем все прерывания |
L1 |
sleep |
; переключаемся в режим sleep |
|
Goto L1 |
; организуем бесконечный цикл |
INT |
btfsc INTCON,RBIF |
; если прерывание от битов 4 – 7 PORTB |
|
Goto GET |
; переходим на процедуру GET |
|
btfsc INTCON,INTF |
; если прерывание от бита 0 PORTB |
|
Goto SEND |
; переходим на процедуру SEND |
|
retfie |
; возврат из процедуры обработки прерываний |
GET |
bcf INTCON,RBIF |
; сбрасываем флаг прерывания от битов 4 – 7 ; PORTB |
|
Movf tail,0 |
; настраиваем FSR |
|
Movwf FSR |
; на адрес свободной ячейки |
|
Movf PORTB,0 |
; читаем информацию из PORTB |
|
Andlw B’11110000’ |
; сбрасываем лишние биты |
|
Btfsc STATUS,Z |
; если прислали 0 |
|
Goto end_GET |
; переходим на конец процедуры |
|
Movwf INDF |
; записываем код клавиши в свободную ячейку |
|
Swapf indf,1 |
; меняем «четверки» |
|
Incf tail,1 |
; сдвигаем указатель tail к следующей ячейке |
|
Movlw 0x17 |
; сравниваем содержимое указателя tail |
|
Xorwf tail,0 |
; с адресом ячейки за буфером |
|
Movlw 0x0d |
; записываем в аккумулятор адрес начала буфера |
|
Btfsc STATUS,Z |
; если вышли за границы буфера |
|
Movwf tail |
; перемещаем tail на начало буфера |
|
Movf head,0 |
; сравниваем указатели |
|
Xorwf tail,0 |
; tail и head |
|
Btfsc STATUS,Z |
; если совпадают |
|
Bsf PORTB,1 |
; передаем сигнал «буфер переполнен» |
end_GET |
Bcf PORTB,2 |
; сбрасываем сигнал «буфер пуст» |
|
return |
; возврат из процедуры |
SEND |
bcf INTCON,INTF |
; сбрасываем флаг прерывания от бита 0 PORTB |
|
Movf head,0 |
; настраиваем FSR |
|
Movwf FSR |
; на адрес ячейки, которую нужно переслать |
|
Movf INDF,0 |
; отправляем содержимое этой ячейки |
|
Movwf PORTA |
; в PORTA |
|
Incf head,1 |
; сдвигаем указатель head к следующей ячейке |
|
Movlw 0x17 |
; сравниваем содержимое указателя head |
|
Xorwf head,0 |
; с адресом ячейки за буфером |
|
Movlw 0x0d |
; записываем в аккумулятор адрес начала буфера |
|
Btfsc STATUS,Z |
; если вышли за границы буфера |
|
Movwf head |
; перемещаем head на начало буфера |
|
Movf head,0 |
; сравниваем указатели |
|
Xorwf tail,0 |
; tail и head |
|
Btfsc STATUS,Z |
; если совпадают |
|
Bsf PORTB,2 |
; передаем сигнал «буфер пуст» |
|
Bcf PORTB,1 |
; сбрасываем сигнал «буфер переполнен» |
|
return |
; возврат из процедуры |
2.5 Варианты заданий
Вариант 1: n=20, r=0x1c |
Вариант 10: n=10, r=0x22 |
Вариант 19: n=14, r=0x17 |
Вариант 2: n=15, r=0x0f |
Вариант 11: n=28, r=0x0e |
Вариант 20: n=19, r=0x18 |
Вариант 3: n=40, r=0x0c |
Вариант 12: n=7, r=0x21 |
Вариант 21: n=23, r=0x19 |
Вариант 4: n=12, r=0x20 |
Вариант 13: n=11, r=0x1f |
Вариант 22: n=24, r=0x1a |
Вариант 5: n=24, r=0x10 |
Вариант 14: n=21, r=0x1d |
Вариант 23: n=25, r=0x1b |
Вариант 6: n=16, r=0x15 |
Вариант 15: n=20, r=0x13 |
Вариант 24: n=26, r=0x1c |
Вариант 7: n=18, r=0x11 |
Вариант 16: n=9, r=0x14 |
Вариант 25: n=27, r=0x1e |
Вариант 8: n=22, r=0x0d |
Вариант 17: n=10, r=0x15 |
Вариант 26: n=28, r=0x21 |
Вариант 9: n=8, r=0x12 |
Вариант 18: n=13, r=0x16 |
Вариант 27: n=29, r=0x0e |
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.