Главная страница

Справочник по программированию «Bascom-AVR» (М.Л. Кулиш). Справочник по программированию Bascomavr Создание микропроцессорной системы Теория


Скачать 1.18 Mb.
НазваниеСправочник по программированию Bascomavr Создание микропроцессорной системы Теория
АнкорСправочник по программированию «Bascom-AVR» (М.Л. Кулиш).pdf
Дата21.03.2017
Размер1.18 Mb.
Формат файлаpdf
Имя файлаСправочник по программированию «Bascom-AVR» (М.Л. Кулиш).pdf
ТипСправочник
#4054
КатегорияПромышленность. Энергетика
страница5 из 8
1   2   3   4   5   6   7   8
Data 19 , 5 , 31 , 19 ' " SH " (1)
Data 14 , 16 , 12 , 5 ' "ErCS" (2)
Data 19 , 0 , 15 , 15 ' " OFF" (3)
Data 19 , 0 , 18 , 19 ' " OL " (4)
Data 19 , 18 , 0 , 19 ' " LO " (5)
Data 19 , 23 , 24 , 19 ' " W " (6)
'-----------------------------------------------------------
'ожидание нажатий 2.5 с
Waitklc:
W_tim = 40 'задать время ожидания 2500=64 мс * 40
Buf_kl = 0 'очистим регистр клавиатуры от кода предыдущего нажати
'цикл ожидания нажатий
Do
If Buf_kl <> 0 Then 'есть нажания кнопки?
Goto Wtklend 'да - на выход
End If
Idle
Loop Until W_tim = 0 'или истечения разрешенного времени 2.5 с
Wtklend:
'следующая строка добавляется при необходимости
' Gosub Tr_klb 'скорректировать номер кнопокReturn
'---------
'П/П ПЕРЕСЫПКИ НОМЕРОВ КНОПОК - ПЕРЕХОД ОТ ФИЗИЧЕСКИХ НОМЕРОВ К ЛОГИЧЕСКИМ
Tr_klb:
Buf_kl = Lookup(Buf_kl , tklb) : Return
Tklb:
Data 0 , 4 , 3 , 2 , 1 'таблица перекодировки, например, наоборот
'-----------------------------------------------------------
=============================================================================
20

===================================== Справочник по программированию «Bascom-AVR» ==
Обработка прерываний
Обстоятельства и правила возникновения прерывания
Прерывания в микроконтроллере AVR возникают при возникновении событий, обусловленных изменением состояния аппаратного компонента периферии, находящейся на кристалле. Предусмотрено прерывания по сле- дующим событиям:
- изменение уровня на входной линии порта. Возможные варианты срабатывания на низкий, высокий или любое изменение уровня;
- переполнение счетчика таймера;
- совпадение значения счетчика таймера с заданным фиксированным значением;
- прием байта приемником одного из интерфейсов (UART, SPI, I2C);
- опустошением передатчика одного из интерфейсов
- окончанием задержки отработанной сторожевым таймером;
- окончание преобразования АЦП;
- окончание записи в EEPROM;
- изменения соотношения аналоговых уровней, сравниваемых компаратором.
Наличие событий прерывания и сочетание с другими функциями определяется моделью микроконтроллера.
Для каждого типа прерываний предусмотрен собственный вектор – адрес, с которого начинается исполне- ния программы в случае регистрации события. Все векторы прерывания размешены в программной памяти, начи- ная с нулевого адреса. Размер области вектора составляет:
- два байта для облегченных микроконтроллеров (семейства Mega и всех семейства Tiny) и предусматрива- ет размещение в векторе только одной короткой команды перехода RJMP;
- четыре байта для микроконтроллеров семейства Mega и позволяет разместить в векторе и короткую RJMP и длинную команду перехода JMP.
В векторе прерывания может быть еще размещена команда возврата RETI (возврат без обработки). Никаких других разумных вариантов применения иных команд не предполагается. По команде, размещенной в векторе, производится переход к самой программе обработки события прерывания.
Чтобы в Bascom-AVR обозначить адрес такого перехода записываются следующие директивы:
'---------------------
' назначение векторов прерывания
On Int0 Int0_int Nosave 'вектор внешнего прерывания 0
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» ==
'---------------------
Enable Timer0 'разрешить прерывание таймера 0
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
1   2   3   4   5   6   7   8


написать администратору сайта