Микропроцессоры и микроконтроллеры

 
 
 
«PHP — это маленькое зло, созданное некомпетентными новичками, в то время как Perl — это большое и коварное зло, созданное умелыми, но извращёнными профессионалами.»
Jon Ribbens
Русский | Українська


Микропроцессоры и микроконтроллеры :: Структура и программирование однокристальных микроконтроллеров :: 7.1 Система обработки прерываний в МК MCS-51. Продолжение

7.1 Система обработки прерываний в МК MCS-51. Продолжение

Уровень приоритета каждого источника устанавливают битами регистра приоритетов прерываний IP:

Имя бита

Назначение

IP.7 – IP.5

Биты IP.7 – IP.5 не используются в базовой модели МК

PS

При PS = 1 установка высокого приоритета запроса от УАПП (флаги TI-RI)

PT1

При PT1 = 1 установка высокого приоритета запроса от таймера 1 (флаг TF1)

PX1

При PX1 = 1 установка высокого приоритета внешнего запроса INT1#

PT0

При PT0 = 1 установка высокого приоритета запроса от таймера 0 (флаг TF0)

PX0

При PX0 = 1 установка высокого приоритета внешнего запроса INT0#

Для задания высокого приоритета запросов от таймеров нужно сформировать двоичное число в соответствии со структурой регистра IP:

init_ip  equ  00001010b

и записать это число в регистр IP:

MOV   IP, #init_ip

При необходимости можно устанавливать приоритет конкретных прерываний индивидуально, например, для этой же задачи:

SETB  PT1

SETB  PT0

Флаги прерываний опрашиваются в каждом машинном цикле. Далее проводится проверка разрешения прерываний и проверка приоритетности. Таким образом, выбирается прерывание, которое нужно обслужить – т.е. вызвать нужную подпрограмму для обслуживания прерывания.

Контроллер прерываний аппаратно формирует команду вызова  LCALL  и загружает ее в регистр команд IR. Один из адресов векторов перехода на подпрограмму обслуживания прерывания используется как адрес вызова.

Вектора перехода образуют участки по восемь байт в памяти программ. На этих участках могут находиться:

-  команда JMP для перехода на соответствующую подпрограмму обработки  прерывания, или команды условных переходов к нескольким подпрограммам (например, для УАПП – по TI или RI);

-   короткая (до восьми байт) подпрограмма обработки прерывания.

Важно: связь конкретного запроса на прерывание с адресом в памяти программ (т.е. с так называемым вектором прерывания) определяется аппаратной структурой ядра контроллера. То есть по определенному запросу всегда делается переход на определенный адрес в памяти программ (см. рис. 7.2). Дальнейшее зависит от программы – какие команды, и какие подпрограммы будут выполнены по данному запросу на прерывание.

Например: пусть зафиксирован запрос на прерывание от TF1. Логика перехода к подпрограмме обработки показана на рис. 7.3.

Рисунок 7.3 – Пример обработки прерывания от таймера Т1 по флагу TF1

Подпрограмму обработки прерывания обычно начинают командами PUSH. Это нужно для сохранения в стеке содержимого тех регистров, которые используются в подпрограмме (например, PSW, ACC,  DPRT и т.д.). Завершают подпрограмму командами POP, с помощью которых восстанавливают содержимое регистров из стека в обратном порядке.

Последней в подпрограмме должна быть команда RETI, по которой в (РС) пересылается адрес возврата в основную программу, сохраненный в стеке, и снимается блокировка обслуженного прерывания. Таким образом, внутри подпрограммы обработки прерывания не может обслуживаться прерывание, которое вызвало данную подпрограмму.

В случае, если необходимо обрабатывать сигналы внешних прерываний от нескольких источников (больше двух), можно воспользоваться простой схемой, показанной на рис. 7.4. В соответствии с ней, при возникновении запроса на прерывание от любого устройства (даже от нескольких одновременно!) будет сформирован единый запрос на входе #INT1. Процедура обработки этого общего запроса должна  программным  путем провести опрос всех входов Р1.0...Р1.3, определить устройство (или устройства), которое сделало вызов, выбрать источник с высоким приоритетом и провести соответствующую обработку события,  которое  вызвало  прерывание основной программы.

Рисунок 7.4 – Пример подключения четырех сигналов запросов
к одному входу сигнала прерывания

Таким образом, эта схема требует реализации протокола обработки прерывания с программным поиском источника. Студентам предлагается самостоятельно разработать программный фрагмент реализации такого протокола.

7.5  Заполнение начальной области памяти программ

Заполнение начальной области памяти  программ  (ячейки  с адресами 0000h – 00ххh) должно строго соответствовать принципам функционирования конкретного микропроцессора или микроконтроллера. При этом необходимо принимать во внимание:

·  адрес памяти, с которого начинается выборка команд при включении питания или подаче сигнала Reset (в МК MCS-51 это будет адрес 0000h);

·  принципы функционирования системы обработки прерываний, в частности, размещение и структуру таблицы векторов перехода на подпрограммы обслуживания прерываний.

Согласно указанным требованиям, заполнение начальной области памяти  программ для МК MCS-51 следует выполнять в таком виде (рис. 7.5).

Рисунок 7.5 – Принцип заполнения начальной области памяти программ МК

Команда (или вектор) стартового перехода представляет собой команду безусловного перехода на метку, которая отмечает первую команду основной программы.  Команда стартового перехода размещается в ячейках ПП по адресу 0000h–0002h и нужна для обхода таблицы векторов переходов при запуске системы.

Таблица векторов перехода состоит из пяти блоков по 8 байт; в каждый блок необходимо записать команду безусловного или условного (например, для прерывания от УАПП) перехода на нужную подпрограмму. Если подпрограмма обработки прерывания имеет размер не больше, чем восемь байт, она может быть размещена непосредственно в соответствующем блоке в таблице векторов перехода. Таблица векторов перехода занимает область ячеек с адресами 0003H...002AH.

Практически начиная с адреса 002BH можно поместить команды основной программы или таблицы констант, которые используются в алгоритмах. В любом случае первая команда основной программы может быть отмечена меткой, ссылку  на которую используют в команде стартового перехода.

Основная программа должна начинаться с таких программных блоков:

·  инициализация стека;

·  выбор текущего активного банка регистров;

·  настройка линий портов на ввод или вывод;

·  настройка системы прерываний (разрешение запросов и исходная установка приоритетов);

·  настройка таймеров и УАПП.

Вариант программной реализации таблицы векторов перехода по всем прерываниям МК MCS-51 представлен ниже. Естественно, в конкретных задачах в таблице должны присутствовать только те вектора (команды перехода), для которых формируются запросы прерываний в процессе работы МК-системы.

Показанная структура характерна для событийно-ориентированных программ.

Декларативная часть программы не представлена, т.к. она зависит от условий использования контроллера и решаемых задач.

CSEG               ; Начало сегмента исполнимого кода

org 0              ; Размещение вектора стартового перехода

jmp start        ; Переход на начало основной программы

org 0003h          ; Размещение вектора перехода по INT0

jmp proc_INT0    ; Переход на обработчик прерывания INT0

org 000Bh          ; Размещение вектора перехода по TF0

jmp proc_T0      ; Переход на обработчик прерывания от таймера Т0

org 0013h          ; Размещение вектора перехода по INT1

jmp proc_INT1    ; Переход на обработчик прерывания INT1

org 001Bh          ; Размещение вектора перехода по TF1

jmp proc_T1      ; Переход на обработчик прерывания от таймера Т1

org 0023h          ; Размещение вектора перехода по TI или RI (УАПП)

jb TI,proc_Trans ; Переход на обработчик прерывания от передатчика

jmp proc_Receive ; Переход на обработчик прерывания от приемника

org 0030h                   ; Размещение основной программы

start:                       ; Команды основной программы

mov  TMOD, #init_tmod   ; Настройка таймеров, УАПП

mov  TCON, #init_tcon

mov  SCON, #init_scon

mov  TL0, #Low(St_T0)   ; Стартовые числа для таймеров

mov  TH0, #High(St_T0)

mov  TL1, #Low(St_T1)

mov  TH1, #High(St_T1)

mov  IE, #init_ie       ; Настройка прерываний

setb TR1                ; Включение таймера Т1

...

m1:  jmp m1        ; Цикл ожидания событий (прерываний)

Proc_INT0:         ; Обработчик прерывания от сигнала INT0

...

Reti

Proc_T0:           ; Обработчик прерывания от таймера T0

...

Reti

. . .            ; Далее следуют остальные подпрограммы

При создании программ для обработки прерываний удобно вначале составить таблицу событий в МК-системе:

         Вид события – Сигнал о событии – Действия по обработке события

На основании этой таблицы составляют набор подпрограмм, и затем их связывают с нужными прерываниями через таблицу векторов перехода.