ИССЛЕДОВАНИЕ МЕХАНИЗМА ПРЕРЫВАНИЙ
Оценка 4.9

ИССЛЕДОВАНИЕ МЕХАНИЗМА ПРЕРЫВАНИЙ

Оценка 4.9
doc
08.05.2020
ИССЛЕДОВАНИЕ МЕХАНИЗМА ПРЕРЫВАНИЙ
15. ИССЛЕДОВАНИЕ МЕХАНИЗМА ПРЕРЫВАНИЙ.doc

ЛАБОРАТОРНАЯ РАБОТА № 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

ЛАБОРАТОРНАЯ РАБОТА № 6 Тема:

ЛАБОРАТОРНАЯ РАБОТА № 6 Тема:

EEIE – разрешает/запрещает прерывание по окончании записи в

EEIE – разрешает/запрещает прерывание по окончании записи в

GIE . Команда возврата из прерывания

GIE . Команда возврата из прерывания

Переполнение счетчика TMR0 (

Переполнение счетчика TMR0 (

Используя первые два источника прерываний, запрограммировать контроллер как кольцевой буфер на n ячеек, начиная с адреса r

Используя первые два источника прерываний, запрограммировать контроллер как кольцевой буфер на n ячеек, начиная с адреса r

START bsf STATUS,RP0 ; переключаемся в банк 1

START bsf STATUS,RP0 ; переключаемся в банк 1

Btfsc STATUS,Z ; если прислали 0

Btfsc STATUS,Z ; если прислали 0

Btfsc STATUS,Z ; если вышли за границы буфера

Btfsc STATUS,Z ; если вышли за границы буфера
Скачать файл