Реализация подпрограмм обработки прерываний на языке ASM51 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Реализация подпрограмм обработки прерываний на языке ASM51



Подпрограммы обработки прерыванийвызываются аппаратурой в произвольный момент времени и не могут иметь параметров. Подпрограммы обработки прерываний не могут быть подпрограммами-функциями. При переходе на подпрограмму обслуживания прерывания автоматически запрещается возникновение последующих прерываний, поэтому при возвращении из подпрограммы обработки прерывания должны быть разрешены прерывания. Команда возвращения из подпрограммы ret не снимает запрет на обработку прерываний, поэтому возврат из подпрограммы обработки прерывания может быть осуществлен только специальной командой возврата из подпрограммы обслуживания прерывания reti. Пример подпрограммы обработки прерывания на языке программирования ASM‑51 приведен в листинге 23.17.

Листинг 23.17. Пример подпрограммы обработки прерывания

;Старт программы------------------------------------------------

ORG 0;Вектор рестарта процессора

Reset: jmp main

 

ORG 0Bh;Вектор прерывания таймера 0

jmp IntT0

ORG 23h;Вектор прерывания последовательного порта

jmp PoslPort

 

IntT0:;Перезагрузка таймера------------------------------------

mov TL0,#LOW(15000);Настроить таймер

mov TH0,#HIGH(15000);на период 15 мс

reti

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

main:

...

Достаточно часто требуется обработка прерываний от нескольких источников. В результате подпрограмма обработки прерываний не может уместиться между векторами прерываний на участке памяти длиной 8 байтов, поэтому подпрограммы выносятся из области векторов прерывания. Для перехода на эти подпрограммы используются команды безусловного перехода. В листинге 23.17 директива ORG 0BH использована для того, чтобы поместить команду перехода на подпрограмму обработки прерывания точно на вектор прерывания таймера 0.

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

Если подпрограмма обработки прерывания использует несколько регистров, то на сохранение регистров в стеке и на восстановление их из стека тратится достаточно много времени. Микроконтроллеры семейства MCS-51 предлагают возможность использовать для подпрограмм прерываний отдельный банк регистров. Переключение банков регистров производится при помощи регистра PSW. В языке программирования ASM-51 то, что программа использует не нулевой банк регистров, указывается при помощи директивы using. Переключение банков регистров в подпрограмме обработки прерывания от таймера T0, а также резервирование первого банка регистров при помощи директивы using показано в листинге 23.18.

Листинг 23.18. Пример подпрограммы обработки прерывания с использованием первого банка регистров

;Старт программы--------------------------------------------------------

ORG 0;Вектор рестарта процессора

Reset: jmp main

 

ORG 0Bh;Вектор прерывания таймера 0

jmp IntT0

ORG 23h;Вектор прерывания последовательного порта

jmp PoslPort

 

USING 1

PoslPort:;Подпрограмма обработки прерывания от посл. порта-------------

push PSW;Сохранить регистр слова состояния в стеке

mov PSW,#00001000b;Включить первый банк регистров

 

mov @R0,SBUF;Записать принятое значение в буфер приемника

inc R0;Перейти к следующей ячейке буфера приемника

cjne R0,#KonBuf,EndProv;Если достигнут конец буфера приемника,

mov R0,#NachBuf;то перейти к первой ячейке

EndProv:

pop PSW;Восстановить регистр слова состояния из стека

reti

Структурное программирование на языке ASM‑51

Применение структурного программирования позволяет увеличить скорость написания программ и облегчить их отладку. Языки программирования C, PASCAL, PL/M разрабатывались на основе принципов структурного программирования, поэтому в состав этих языков входят структурные операторы. Ассемблер не относится к структурированным языкам программирования. Тем не менее, структурное программирование возможно и на языках программирования низкого уровня, в том числе и на языке программирования ASM-51, где не предусмотрено структурных операторов.

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

Для реализации методов структурного программирования огромное значение имеет использование «говорящих» меток, обозначаемых не просто M0, M1 и т.д., а в названии которых отображается действие, выполняемое программой. Для людей, не владеющих иностранным языком, ограничение в использовании для назначения меток букв только латинского алфавита создает определенные трудности. Однако, используя транслитерацию, и латинскими буквами можно писать русские слова. При этом для обозначения действия может потребоваться несколько слов, использование же пробелов внутри метки недопустимо! Выйти из такой ситуации можно двумя способами:

q применять специальные символы-разделители;

q начинать каждое новое слово внутри метки с буквы верхнего регистра.

В качестве разделителей внутри метки можно использовать символы подчеркивания '_' и вопроса '?'. Примеры назначения «говорящих» меток:

Priem_Comandy;Использование символов-разделителей

ProveritBitGotovnosti;Использование букв верхнего регистра

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

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

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

ProchitatPort;Прочитать порт

VklychitIndikator;Включить индикатор

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

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

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

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

Пример реализации линейной цепочки операторов на языке программирования ASM‑51 приведен в листинге 23.19.

Листинг 23.19. Пример использования подпрограмм для структурирования программы, написанной на языке программирования ASM-51

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

;Главная программа

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

...

;----- Линейная цепочка операторов ---------------------------------

Call Deistvie1;Алгоритмическое действие 1

Call Deistvie2;Алгоритмическое действие 2

;-------------------------------------------------------------------

...

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

;Определения подпрограмм

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

;--- Подпрограмма-заглушка 1 ---------------------------------------

Deistvie1: ret

;--- Подпрограмма-заглушка 2 ---------------------------------------

Deistvie2: ret

Вторая структурная конструкция управления — условное выполнение оператора. Как уже рассматривалось в предыдущей главе, эта конструкция может быть двух видов – с одной ветвью и с двумя ветвями.

Если реализуется конструкция условного выполнения оператора только с одной ветвью, то можно воспользоваться любой командой условного перехода, входящей в набор команд микроконтроллера. Соответствующий пример приведен в листинге 23.20. В приведенном примере переменная SV1 и константа NajKnZvezd должны быть объявлены ранее (например, при помощи директивы equ).

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

;-------------------------------------------------------------------

;Оператор обработки нажатой кнопки

;-------------------------------------------------------------------

cjne A,#NajKnZvezd,NeGasitSvDiod;Если нажата кнопка ‘*’

clr SV1;то погасить светодиод SV1

NeGasitSvDiod:

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

Листинг 23.21. Пример реализации конструкции условного выполнения операторов на языке программирования ASM-51

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

;Главная программа

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

...

;----------Условный оператор-------------------

jb PrinjatByte,ElseUsl;Условная операция

Call Plecho1;Реализация

jmp EndUsl;ветви 1

ElseUsl:

Call Plecho2;Реализация ветви 2

EndUsl:;---------------------------------------

...

 

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

;Определения подпрограмм

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

;--Пока это только подпрограмма-заглушка!------

Plecho1:;Метка помечает следующий оператор

ret

 

;--Пока это только подпрограмма-заглушка!------

Plecho2:;Метка помечает следующий оператор

ret

Третья структурная конструкция – это цикл с проверкой условия после тела цикла. Такая конструкция легко реализуется на ассемблере при помощи одной команды условного или безусловного перехода. Отличие этой конструкции от условного выполнения операторов заключается в том, что передача управления осуществляется не вперед, а назад. Однако в системе команд микроконтроллера MCS-51 для реализации цикла предусмотрена специальная команда, выполняющая сразу два алгоритмических действия, необходимых для реализации цикла, – DJNZ. Пример использования этой команды для реализации цикла с проверкой условия после тела цикла приведен в листинге 23.22.

Листинг 23.22. Пример реализации цикла с проверкой условия после тела цикла на языке программирования ASM-51

;Программа обнуления внутренней памяти микроконтроллера

mov R0,#128;Обнулить 128 ячеек

mov A,#0;внутренней памяти

Obnulenie:

mov @R0,A;Обнулить очередную ячейку

DJNZ R0, Obnulenie;и если все ячейки обнулены,

;то выйти из цикла

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

Листинг 23.23. Пример оператор цикла с проверкой условия до тела цикла на языке программирования ASM‑51

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

;Главная программа

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

...

;-------- Оператор цикла -----------------

Nachalo:

jb KnNaj,KonCykla;Условная операция

Call TeloCykla;Реализация обработки

sjmp Nachalo;подпрограмм ожидания

KonCykla:

;-----------------------------------------

...

 

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

;Определения подпрограмм

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

;--- Подпрограмма-заглушка ---------------

TeloCykla:

ret;Оператор помечен предыдущей меткой

Многомодульные программы

Как это обсуждалось в предыдущей главе разбиение исходного текста программы на отдельные модули делает его более понятным для программиста или нескольких программистов, участвующих в создании программного продукта. Язык программирования ASM-51 позволяет писать многомодульные программы. Однако каждый модуль программы должен быть оформлен соответствующим образом.

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

В языке программирования ASM‑51 для этой цели используется директива public(общедоступные). Директива может быть использована в любом месте исходного текста модуля, однако обычно она размещается в его начале. Имена переменных в этой директиве перечисляются через запятую. Если в результате получается слишком длинная строка, то можно использовать несколько таких директив. Глобальное имя может быть объявлено только в одном модуле программы. Несколько глобальных переменных или подпрограмм с одним и тем же именем недопустимы. Пример использования директивы public на языке программирования ASM-51:

PUBLIC BufInd, Parametr
PUBLIC Podprogr,?Podprogr?Byte

Для ссылки на переменную или метку, объявленную в другом модуле, используется директива extrn. Идентификатор в пределах одного модуля не может быть одновременно объявлен как public и как extrn. В директиве extrn перечисляются через запятую имена подпрограмм и переменных, числовое значение которых редактор связей должен получить из других модулей и модифицировать все команды, в которых эти метки или переменные используются. Кроме того, для правильного использования инструкций микроконтроллера, в директиве extrn должен быть указан тип памяти(data, bit, code, idata или xdata), в которой расположена переменная или метка. Для передачи числовых констант между модулями можно воспользоваться вспомогательным словом number Директива extrn может располагаться в любом месте исходного текста модуля. Идентификатор внешнего именине может быть переопределен в программном модуле каким-либо способом. Рекомендуется с целью оптимизации результирующего объектного кода (в частности, команд JMP и CALL) размещать директиву EXTRN до ссылки на соответствующее внешнее имя (как правило, в начале исходного текста программного модуля или программного сегмента). Пример использования директивы extrn на языке программирования ASM-51:

EXTRN DATA (BufInd, ERR), CODE (ASC_BIN, BIN_ASC), NUMBER (LIMIT)
EXTRN CODE (Podprogr)

Объявления переменных и имен подпрограмм внешних модулей загромождают исходный текст модуля. Кроме того, при использовании чужих модулей трудно объявить переменные и подпрограммы без ошибок. Поэтому, как это обсуждалось в предыдущей главе, объявления имен хранят во включаемых файлах, которые называются файлами-заголовками. Файл-заголовокна языке программирования asm‑51 записывается на диск с расширением *.inc (сокращение от английского слова include — включать) и включается в исходный текст программы при помощи директивы include. Например:

$INCLUDE (REG51.INC)

При работе с пакетом программ, поставляемым фирмой keil, программа-транслятор с языка программирования ASM-51 «понимает» и файлы-заголовки, написанные для языка программирования С-51. Поэтому можно воспользоваться и этими файлами. Например:

#include <at87f51rc.h>

$include (init.inc)

Теперь рассмотрим команды редактора связей, которые позволят объединить несколько объектных модулей в один. В простейшем случае для объединения модулей можно использовать имя программы-редактора связей с необходимыми ключами. Для объединения нескольких модулей в исполняемую программу имена всех модулей передаются в редактор связей rl51.exe в качестве параметров при запуске этой программы. Приведем пример вызова редактора связей из командной строки DOS для объединения трех модулей:

rl51.exe progr.obj, modul1.obj, modul2.obj

В результате работы редактора связей в этом примере будет создан исполняемый модуль с именем progr. Формат записи информации в этом файле остается прежним — объектным. Это позволяет объединять модули по частям, то есть при желании можно из нескольких мелких модулей получить один более крупный.

В настоящее время часто пользуются интегрированными средами программирования, например, фирм Franclin или keil, в состав которых входят язык программирования ASM‑51. В этих программах создание строки вызова редактора связей производится автоматически при настройке программного проекта, а вызов редактора связей при помощи этой строки производится в ходе построения программного проекта. Настройка программного проекта происходит при подключении к нему новых программных модулей и при изменении его свойств, таких как разрешение или запрет создания карты памяти программы, выбор папки для хранения выходных файлов, разрешение или запрет помещения в выходной файл отладочной информации, разрешение или запрет создания загрузочного HEX-файла.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 562; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.4.244 (0.07 с.)