Файл: Справочник по программированию «Bascom-AVR» (М.Л. Кулиш).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.06.2025

Просмотров: 749

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

===================================== Справочник по программированию «Bascom-AVR» ==

Обработка прерываний

Обстоятельства и правила возникновения прерывания

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

-изменение уровня на входной линии порта. Возможные варианты срабатывания на низкий, высокий или любое изменение уровня;

-переполнение счетчика таймера;

-совпадение значения счетчика таймера с заданным фиксированным значением;

-прием байта приемником одного из интерфейсов (UART, SPI, I2C);

-опустошением передатчика одного из интерфейсов

-окончанием задержки отработанной сторожевым таймером;

-окончание преобразования АЦП;

-окончание записи в EEPROM;

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

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

ная с нулевого адреса. Размер области вектора составляет:

-два байта для облегченных микроконтроллеров (семейства Mega и всех семейства Tiny) и предусматривает размещение в векторе только одной короткой команды перехода RJMP;

-четыре байта для микроконтроллеров семейства Mega и позволяет разместить в векторе и короткую RJMP

идлинную команду перехода JMP.

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

Чтобы в Bascom-AVR обозначить адрес такого перехода записываются следующие директивы:

'---------------------

' назначение векторов прерывания

'вектор внешнего прерывания 0

On Int0 Int0_int Nosave

On Timer0 Timer0_int Nosave

'вектор прерывания от таймера 0

On Urxc Rxd_int Nosave

'вектор прерывания от приемника UART

'---------------------

которые содержат:

-прерывания (или тип), по которому компилятор данный вектор соответствующему адресу (определяемому моделю микроконтроллера);

-имя метки, с которой начинается программы обработки прерывания;

-необязательная опция Nosave , запрещающая компилятору автоматическое сохранение всех регистров общего назначения (R0-R31) и регистра статуса SREG. Применение данной опции рекомендуется, но требует от программиста самостоятельного определения списка сохраняемых регистров. Этот список определяется выполняемыми операциями при обработке прерываний. Перемещение данных требует сохранения только используемых регистров, а использование арифметических и логических команд еще сохранения статуса SREG.

Происхождение прерываний

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

а) наличие общего разрешения прерываний, которое производится установкой (в «1») бита SREG.7 (бита I: Global Interrupt Enable). Управление этим битом может производиться многими способами. Напрямую установка его значения производится ассемблерными командами SEI (разрешение) и CLI (запрещение) или соответствующими командами Bascom-AVR:

'---------------------

'разрешить прерываниЯ

Enable Interrupts

Или

'---------------------

'запретить прерываниЯ

Disable Interrupts

б) разрешения выбранного типа прерывания. Как правило, разрешение прерывания производится установкой (в «1») соответствующего бита регистров управления. Запись данной операции операторами Bascom-AVR выполняется следующим образом:

============================================================================= 21


===================================== Справочник по программированию «Bascom-AVR» ==

'---------------------

'разрешить прерывание

таймера

0

Enable Timer0

Enable Int0

'разрешить

внешнее прерывание

0

Enable Urxc

'разрешить

прерывание

по заполнению приемника

'---------------------

Однако лучше применять следующую форму записи, как более очевидную и экономичную с точки зрения размера кода:

Timsk = &B00000001

'разрешить прерывание таймера 0

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

Приоритеты прерываний

В микроконтроллерах AVR отсутствует механизм перераспределения векторов прерывания. При наличии условий возникновения нескольких прерываний первым обрабатывается находящееся выше в списке векторов (с меньшим адресом). Когда происходит прерывание, то остальные оказываются автоматически запрещенными, вследствие очистки (сброса) бита I. То есть, по умолчанию, вложенные прерывания невозможны. Обеспечение вложенности прерываний осуществляется программным методом. Для этого достаточно в начале программы обработки прерывания вновь установить бит I.

Программный механизм прерываний

При возникновении любого прерывания происходит переход на исполнение команды, записанной по адресу соответствующего вектора. При этом в стеке запоминается адрес (два байта) команды, которая должна исполняться после завершения обработки прерывания (которая бы выполнялась при отсутствии прерывания). Указатель стека при наступлении прерывания уменьшается на два. Таким образом, прерывания эквивалентно выполнению двух команд - CALL и CLI. Для возврата к исполнению прерванной программы после завершения обработки прерывания применяется команда RETI, эквивалентная двум командам - RET (возврат по адресу, запомненному в стеке) и SEI (разрешение прерываний). После завершения обработки прерывания указатель стека возвращается к исходному значению (увеличивается на два). Источником прерывания всегда является соответствующий флаговый бит, устанавливаемый аппаратно по совпадению назначенных условий. После выполнения обработки прерывания по команде RETI сбрасывается и бит, вызвавший прерывание. Однако имеются случаи, когда этого не происходит (смотреть описание микроконтроллера) и требуется его программный сброс.

Сохранение данных прерванной программы

Для обеспечения правильной работы прерванной программы требуется сохранение данных, которые могут быть испорчены при обработке прерывания. Предлагаемый (по умолчанию) компилятором вариант сохранения всех регистров общего назначения для оптимального программирования не годится. Во-первых, очень редко в программе обработки прерывания используется не более четырех регистров. Во-вторых, даже эта мера не позволяет использовать в программе прерывания все функции Bascom-AVR. В число запрещенных входят функции, использующие служебные области памяти - внешние переменные, служебный строковый буфер, программный стек (обработка строк, вычисления (обработка) чисел в формате с плавающей точкой, обработка протоколов связи и т.п.). О наличие служебных областей можно узнать, посмотрев файл отчета (“Cntr-W”) после компиляции (до этого нужно еще нужно назначить его создание и включение в список внутренних переменных). В число разрешенных функций входят:

-операторы назначения и перезаписи данных;

-целочисленные вычисления;

-проверка условий с целыми числами;

-управление внутренними и внешними периферийными устройствами.

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

Другие вопросы совместного использования ресурсов

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

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

-замедляется реакция на внешние события или они пропускаются совсем;

-пропускаются отдельные элементы последовательно принимаемые данные;

============================================================================= 22


===================================== Справочник по программированию «Bascom-AVR» ==

-происходит нарушение формы (временных соотношений) программно формируемой временной диаграммы для управления внешним устройством;

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

Особый случай - считывание (или запись) данных в регистры изменяемые (или соответственно считываемые) в процессе обработки прерывания. Дефект подобного рода проявляется только тогда, кода размер данных превышает один байт. За счет разделения прерыванием процесса модификации данных нарушается их целостность. Из-за низкой вероятности такого наложения, проявление данного дефекта имеет случайный характер и зависит от времени исполнения участков программы, примыкающих к критичному. Для внешнего наблюдателя, при этом складывается впечатление, что появление сбоя обусловлено каким-то определенным значением обрабатываемых данных. Естественно, дезориентирует и затрудняет поиск ошибки.

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

Управление прерываниями

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

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

-нужно сбрасывать флаг в самой программе прерывания, если для данного вида прерывания это не делается автоматически (смотреть datasheet);

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

-предотвращать возможность вызовы прерываний с периодичностью, меньше или даже близкой к времени его обработки. Когда суммарное время обработки прерываний превышает 50 процентов, программы становится неработоспособной;

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

Встроенные прерывания

В некоторых функциях “Bascom-AVR” предполагается использование прерываний. Главным образом, это функции программных интерфейсов, работающие режимах синхронизации от внешних устройств (в режиме ведомого - Slave). Библиотеки “Bascom-AVR”, обычно, используют для этого самые популярные прерывания Int0 и Timer0. Это нужно учитывать при проектировании системы и не занимать прерывания, используемые такими функциями, другими задачами. При этом резервируются и линии портов соответственно используемым прерываниям. Прерывания используют следующие функции: AT-клавиатура, I2C – двухпроводный программный интерфейс (ведомый), SPI – последовательный программный интерфейс (ведомый), TCP/IP – сетевой протокол с микросхемой W3100A, RC5 –программный инфракрасный порт дистанционного управления. Типы используемых прерываний: внешнее от изменения уровня - Int0 или Int2, от переполнения счетчиков - Timer0 или Timer2. Причем компилятор во всех случаях предлагает выбрать одного из двух каждого типа.

Оформление программ прерывания

Важнейшей частью программы обработки прерывания является сохранение, а затем перед завершением восстановление регистров общего назначения. По умолчанию автоматически сохраняются все регистры (R0…R31 и статусный регистр SREG). Если в операторе, формирующем вектор прерывания, применена опция NOSAVE, то операции автоматического сохранения-восстановления регистров не будут включены в текст программы, а об этом нужно позаботится самостоятельно. Компилятор “Bascom-AVR” не предоставляет ассемблерного листинга. Написав программу обработки прерывания с использованием операторов бейсика, весьма затруднительно определить список используемых регистров, чтобы произвести их выборочное сохранение. Поэтому рекомендуется программы обработчика прерывания выполнять на ассемблере. Это оптимально во всех отношениях. И хорошая практика, чтобы не забыть ассемблер, и быстрое исполнение программы, и надежная предсказуемая работа программы, независимость от версии компилятора.

Чтобы обеспечить возврат из программы обработки с разрешением прерываний следует применить команду микроконтроллера RETI. Компилятор делает это автоматически - первая команда RETURN, встретившаяся после метки с именем вектора прерывания скомпилируется как команда микроконтроллера RETI. Чтобы такая автозаме-

============================================================================= 23


===================================== Справочник по программированию «Bascom-AVR» ==

на произошла в нужном месте, даже применяя ассемблер, необходимо завершить его текст оператором Bascom RETURN. Это указание реализовано в последующих примерах.

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

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

' ......

' перезаписать данные

Gosub Transfer

' ......

Также в любом месте программы на бейсике может быть вставлена ассемблерная вставка. Однако в программе прерывания может быть вызвана подпрограмма, написанная на ассемблере. Вызов лучше выполнять с помощью более короткой команды RCALL. При этом вызываемый модуль должен быть расположен в тексте программы поблизости, учитывая ограниченный диапазон перехода;

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

' ......

'"новые данные"

Dim Ndat As Byte

Dim R_bd As Long

'двоичный результат

' ......

$asm

'запишем сумму

Sts {r_bd} , R0

Sts {r_bd + 1} ,

R1

Sts {r_bd + 2} ,

R26

Sts {r_bd + 3} ,

R27

Ldi R31 , &HFF

Sts {ndat} , R31

Rjmp Adci_2

$end Asm

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

'---------------------

Dim K_dc0 As Single

Dim Fldb As Single

'---------------------

' ......

'перезапись данных

Transfer:

Loadadr K_dc0 , X 'записать адрес переменной K_dc0 в индексный регистр X Loadadr Fldb , Z 'записать адрес переменной Fldb в индексный регистр Z

$asm

Ld R16 , Z+

St X+ , R16

Ld R16 , Z+

St X+ , R16

Ld R16 , Z+

St X+ , R16

Ld R16 , Z+

St X+ , R16 $end Asm

Return '---------------------

' ......

'установка индексного регистра Z для считывания байтовых данных

Ldi R30

,

Low(Tab_phs * 2)

'записать адрес метки Tab_phs в индексный регистр Z

Ldi R31

,

High(Tab_phs * 2)

'младший и старший байты

' ......

'установка специального индексного регистра компилятора

Restore

Tab_phs

'запись указателя на метку в регистры R8 и R9

' ......

Tab_phs:

55

,

55 , 55 , 56

'поля данных

Data

' ......

M12:

Tmpb

'считывание данных

Read

============================================================================= 24