Краткие сведения

Цель работы

Контрольные вопросы

 

6.6.1 Какие существуют варианты условных переходов?

6.6.2 Назовите недостаток третьего варианта программы.

6.6.3 Как организовать цикл?

6.6.4 Как можно организовать массив данных в ОЗУ?

6.6.5 Зачем нужны директивы и чем они отличаются от команд?

6.6.6 Как отличить директиву от команды?

6.6.7 Назовите операнды, которыми может оперировать арифметико-логическое устройство (АЛУ).

6.6.8 Как определить время выполнения программы?

6.6.9 Какие группы команд имеются в языке ассемблера для микроконтроллера AT90S8535?

6.6.10 В каких формах можно задавать данные при написании программ?

6.6.11 Что называется операндом, и в каких видах он может задаваться при программировании микроконтроллера AT90S8535?

 

7 ЛАБОРАТОРНАЯ РАБОТА

«ИЗУЧЕНИЕ СИСТЕМЫ ПРЕРЫВАНИЙ»

 

 

Освоение приемов программирования с использованием прерываний

 

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

В-первых, микроконтроллер может управлять несколькими устройствами и тогда приходится опрашивать устройства по очереди. Это в целом замедляет работу и может привести к потере и искажению информации. Во-вторых можно прозевать появление сигнала на входе особенно если он там находился короткое время, а программа работала в это время с другим входом, В третьих , если микроконтроллер наряду с другими функциями осуществляет еще и функции защиты, то запоздалая реакция на один из входных сигналов может привести к неприятным последствиям.

Перечисленные недостатки можно решить, если использовать прерывания.

Прерыванием называется принудительное немедленное прекращение выполнения текущей программы для выполнения другой более важной в данное время программы, Эта программа называется подпрограммой прерывания. После выполнения подпрограммы прерывания, продолжается выполнение текущей программы с того места, где было прервано ее выполнение.

Прерывания могут быть программными и аппаратными. В микроконтроллерах используются аппаратные прерывания, которые могут быть вызваны внешними и внутренними устройствами. При появлении сигнала от устройства, требующего прерывания, в микроконтроллере устанавливается триггер (флаг), отвечающий за данное прерывание. Сбрасывается он аппаратно после начала обработки прерывания. Перед началом выполнения каждой команды основной программы опрашиваются флаги прерываний и если какой-нибудь флаг установлен, начинается обработка этого прерывания. Если были установлены несколько флагов, начинается обработка того прерывания, приоритет которого выше. При одинаковом приоритете обрабатывается то прерывание, которое появилось первым. Триггеры остальных прерываний будут находиться в состоянии «установлен» до тех пор, пока не будет начата обработка их прерывания.

Все прерывания микроконтроллера AT90S8535 маскируемые, т. е. их можно запретить программно. Наличие флага глобального прерывания позволяет разрешать или запрещать все прерывания одновременно.

Если условия прерываний возникли, когда прерывания запрещены, поступающие прерывания устанавливают свои флаги. Эти флаги будут сохранены в таком состоянии, пока не появится разрешение глобального прерывания. После этого прерывания обрабатываются в порядке приоритетов.

В процессе обработки прерывания используется стек. Стек – это память, организованная по принципу «первым зашел, последним вышел», как в детской пирамиде. Т.е. информация, записанная первой, считывается последней. Микроконтроллер AT90S8535 не имеет аппаратного стека, и стек организуется в ОЗУ в процессе написания программы. Для стека рекомендуется использовать область старших адресов ОЗУ. Адрес вершины стека (адрес последнего помещенного туда байта) находится в специальном регистре – указателе стека SP. Этот регистр SP является шестнадцатиразрядным и находится в области регистров I/O. При записи данных в стек значение указателя стека автоматически уменьшается на 1, т. е. стек растет в сторону младших адресов (вверх). При извлечении данных из стек значение указателя стека автоматически увеличивается на 1.

Следует учесть, что в микроконтроллере AT90S8535 при извлечении данных из стека они не уничтожаются, а продолжают храниться в той же ячейки памяти ОЗУ, куда были записаны, пока на их место не будет помещена новая информация.

При появлении прерывания текущая команда выполняется до конца и начинается процедура обработки данного прерывания. Содержимое счетчика команд помещается в стек, а взамен него в счетчик команд помещается адрес ячейки вектора обслуживаемого прерывания. (В этой ячейке памяти размещается команда безусловного перехода, указывающая адрес подпрограммы прерывания). Аппаратно сбрасывается триггер обрабатываемого прерывания, и запрещаются все остальные прерывания (сбрасывается бит (флаг) разрешения глобального прерывания в регистре статуса SREG). Начинается выполнение подпрограммы прерывания. По окончанию выполнения подпрограммы прерывания из стека в счетчик команд возвращается его предыдущее содержимое, указывающее на адрес следующей команды основной программы. Все прерывания разрешаются, если для выхода из подпрограммы использовалась команда RETI.

При выходе микроконтроллеров AVR из прерывания, происходит возврат в основную программу и выполняется еще одна команда, прежде чем начнется обслуживание какого-либо отложенного прерывания.

Следует отметить, что автоматически в стеке сохраняется только счетчик команд. Если в подпрограмме обработки прерывания используются те же регистры, что и в основной (фоновой) программе, то их значение требуется сохранить в стеке. В особенности это касается регистра статуса SREG, (который используется, как в основной программе, так и в подпрограмме обработки прерывания), т.к. практически все команды, кроме команд пересылки данных и переходов, воздействуют на флаги. Поэтому значение регистра статуса SREG после возврата в основную программу может быть не таким, как перед началом обработки прерывания.

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

Система прерываний микроконтроллеров AVR допускает вложенные прерывания. Для этого в программе обработке прерывания необходимо программно разрешить все прерывания.

Микроконтроллер AT90S8535 (ATmega8535) использует 17 источников прерывания. Каждое прерывание располагает вектором прерывания (фиксированным адресом начала программы обработки прерывания) в пространстве памяти программ. Такое построение системы прерывания удобно тем, что для изменения подпрограммы обработки прерывания достаточно поменять адрес безусловного перехода в данном векторе прерывания.

Полный перечень векторов прерывания представлен в таблице 7.1.

Таблица 7.1.Векторы прерывания

Номер вектора Адрес Источник прерывания Вид прерывания
$000 RESET Сброс по выводу RESET, включению питания и сторожевому таймеру
$001 INTO Запрос внешнего прерывания 0
$002 INT1 Запрос внешнего прерывания 1
$003 TIMER2 COMP Совпадение при сравнении таймера/счетчика Т2
$004 TIMER2 OVF Переполнение таймера/счетчика Т2
$005 TIMER1 CAPT Захват таймера/счетчика Т1
$006 TIMER1 COMPA Совпадение А при сравнении таймера/счетчика Т1
$007 TIMER1 COMPB Совпадение В при сравнении таймера/счетчика Т1
$008 TIMER1 OVF Переполнение таймера/счетчика Т1
$009 TIMER0 OVF Переполнение таймера/счетчика Т0
$00A SPI, STC Завершение пересылки SPI
$00B UART, RX Завершение приема UART
$00C UART, UDRE Регистр данных UART пуст
$00D UART, TX Завершение передачи UART
$00E ADC Завершение ADC преобразования
$00F EE_RDY Готовность EEPROM
$010 ANA_COMP Срабатывание аналогового компаратора

Источники прерываний в таблице размещены в порядке приоритета. Прерывания с младшими адресами имеют больший уровень приоритета. RESET имеет наивысший уровень приоритета, следующим являются запрос внешнего прерывания INT0 и т. д.

Для управления прерываниями в микроконтроллере AT90S8535 используются специальные регистры, а также отдельные биты в регистрах управления различными устройствами микроконтроллера, в том числе бит (флаг) разрешения глобального прерывания в регистре статуса SREG. Каждому прерыванию присвоен свой бит разрешения, который должен быть установлен совместно с битом I регистра статуса SREG.

Некоторые флаги (триггеры) прерываний можно очистить, записав в соответствующий бит очищаемого флага логическую единицу.

Прерывания, которые можно разрешать и запрещать программно называются маскируемыми, а регистры, управляемые этими процедурами – регистрами масок.

У микроконтроллера AT90S8535 предусмотрено в порте D два фиксированных входа для внешних прерываний: D2 (INT0) и D3 (INT1).

В данной лабораторной работе используются только внешние прерывания, поэтому рассматриваются регистры, отвечающие только за внешние прерывания. Жирным шрифтом выделены биты, непосредственно имеющие отношение к внешним прерываниям. Регистры, отвечающие за прерывания от других устройств, будут рассмотрены в соответствующих лабораторных работах и в курсе лекций.

 

Регистр состоянияSREG ($3F ($5F))

I T H S V N Z C

 

Бит 7 – I, разрешение всех прерываний. Для разрешения всех прерываний этот бит должен быть установлен в 1. Аппаратно очищается после возникновения прерывания и устанавливается и устанавливается автоматически командой RETI.

Исходное состояние бита 7 после включения питания – 0.

Регистр масок внешних прерыванийGIMSK($3B ($5B))

INT1 INT0

Бит 7 – разрешение внешних прерываний INT1

Бит 6 – разрешение внешних прерываний INT0

При установленных битах INT1 и (или) INT0 и установленном бите I регистра статуса (SREG) разрешаются прерывания по соответствующим выводам внешних прерываний. Активизация выводов INT1 и INT0 вызывает запрос прерывания, если даже эти выводы будут запрограммированы, как выходы.

Исходное состояние битов 6,7 после включения питания – 0.

Регистр контроля (управления) – MCUCR ($35 ($55))

SE SM1 SM0 ISC11 ISC10 ISC01 ISC00

 

Биты 3, 2 – ISC11, ISC10 биты, определяющие параметр входного сигнала, вызывающий прерывание INT1

Биты 1, 0 – ISC01, ISC00 биты, определяющие параметр входного сигнала, вызывающий прерывание INT0

Запрос прерывания может осуществляться по перепаду входного сигнала с низкого уровня на высокий (с 0 на 1), или по перепаду входного сигнала с высокого уровня на низкий (с 1 на 0), или по низкому уровню входного сигнала.

Параметр входного сигнала, вызывающий прерывание INT0 задается комбинацией битов, указанной в таблице 7.2.

 

Таблица 7.2

ISC01 ISC00 Параметр входного сигнала, вызывающий прерывание INT0
Низкий уровень (нулевой) на INT0
Зарезервирован
Перепад с высокого уровня на низкий (с 1 на 0) на INT0
Перепад с низкого уровня на высокий (с 0 на 1) на INT0

 

Параметр входного сигнала, вызывающий прерывание INT1 задается комбинацией битов, указанной в таблице 7.3.

 

Таблица 7.3

ISC11 ISC10 Параметр входного сигнала, вызывающий прерывание INT1
Низкий уровень (нулевой) на INT1
Зарезервирован
Перепад с высокого уровня на низкий (с 1 на 0) на INT1
Перепад с низкого уровня на высокий (с 0 на 1) на INT1

При изменении битов 3…0 регистра MCUCR прерывание INT0 и INT1 должно быть запрещено путем очистки битов разрешения прерывания в регистре GIMSK. В ином случае может произойти несанкционированное прерывание.

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

Исходное состояние битов 3…0 после включения питания – 0.

 

Регистр флагов внешних прерываний – GIFR($3А ($5А))

INTF1 INTF0

Биты 7, 6 - INTF1, INTF0 флаги (триггеры) внешних прерываний INTF1 и INTF0.

В случае поступления запроса на внешнее прерывание соответствующий флаг устанавливается в 1. Если бит I регистра SREG и соответствующий бит разрешения регистра GIMSK установлены, то выполняется переход по вектору прерывания. При возврате из процедуры прерывания флаг автоматически очищается. Кроме того, при необходимости, флаг можно очистить, записав в него логическую 1.

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

Исходное состояние битов 7, 6 после включения питания – 0.

 

Для первой программы с использованием внешнего прерывания предлагается упрощенная структура (шаблон) построения программы, в которой представлены обязательный минимальный набор команд и директив. Полный шаблон приведен в приложении.

 

;*******************************************

; название программы,

; краткое описание, необходимые пояснения

;*******************************************

.include “8535def.inc” ; файл описания AT90S8535.

;******сегмент кодов

.cseg

;****** вектор прерываний

.org $00 ; адрес начала программы в памяти программ.

rjmp nacalo ; прерывание по сбросу и включению питания.

.org $01 ; вектор прерывания INT0.

rjmp preryv0 ; адрес подпрограммы прерывания INT0

… ; место для размещения других возможных прерываний

… ;

.org $30 ; адрес начала основной программы в памяти программ.

;

;*******начало основной программы

nacalo:

… ; программирование портов I/O и других устройств

… ; микроконтроллера, организация стека

programma:

… ; текст основной (фоновой) программы

rjmp programma ; переход на начало текста основной (фоновой про-

; граммы.

;********************** подпрограмма обработки прерывания INT0

preryv0:

reti ; конец программы обработки прерывания

;********************** подпрограммы обработки других прерываний

; конец программы (никак не обозначается).

Может получиться и так, что все действия, необходимые для выполнения устройства окажутся в подпрограмме. В этом случае основная программа не должна выполнять никаких внешних действий, т.е. содержать команды, изменяющие содержание регистров I/U и регистров общего назначения, используемых в подпрограмме обработки прерывания. Самый простой и экономичный способ построения такой программы:

 

programma:

rjmp programma