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


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



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

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

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

Рис. 21.19. Схема согласования уровней сигналов последовательного порта микроконтроллера и COM‑порта компьютера

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

Первый переданный символ будет рассматриваться как команда. При использовании в качестве команды заглавных и строчных букв латинского алфавита будет доступно 56 команд. При желании можно добавить еще 64 команды, обозначаемыми буквами русского алфавита. Следующие несколько символов составят поле данных. Обычно здесь используются цифры. Пусть у нас поле данных содержит четыре символа. В качестве завершения команды используем символ возврата каретки (ASCII-код ’13’). Этот символ вводится при нажатии на клавишу ‘Enter’.

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

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

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

/*-------------------------------------------------------

Подпрограмма инициализации микроконтроллера

--------------------------------------------------------*/

void Init(void)

{TMOD=0x20; //Настроить таймер 1 на режим работы с автозагрузкой

TH1=-3; //Настроить последовательный порт на скорость 9600 бит/с

TR1=1; //Включить таймер 1

SCON=(1<<6)| //Выбрать восьмибитовый асинхронный режим работы

(1<<4); //Разрешить работу приемника

IE=(1<<7)| //Разрешить прерывания (установить седьмой бит

//регистра IE)

(1<<4); //Разрешить прерывания от последовательного порта

}

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

Листинг 21.32. Главная функция программы, принимающей и выполняющей команды от персонального компьютера

bit cmPrinjata=0;

void main(void)

{Init();

while(1)

{PCON|=1; //Остановить процессорное ядро и подождать,

//пока не будет принят очередной байт

if(cmPrinjata) //Если прием команды завершен,

{cmPrinjata=0; //то сбросить флаг приема команды

ObrabInf(); //и выполнить команду.

}

}

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

Листинг 21.33. Подпрограмма приема команд от персонального компьютера через последовательный порт

/*-------------------------------------------------------------

Подпрограмма обслуживания прерываний от последовательного порта

-------------------------------------------------------------*/

char сmd[6];

char data* ptr=сmd-1;

void PriemCmd (void) interrupt 4

{if(RI) //Если последовательный порт принял байт,

{RI=0; //то обнулить флаг прерывания от приемника.

++ptr; //Перейти к следующему байту буфера команд

*ptr=SBUF; //и запомнить в нем принятый байт

if(*ptr==13) //Если принятый байт это символ конца строки,

{cmPrinjata=1; //то установить флаг завершения приема команды

ptr=cmd-1; //и подготовиться к приему очередной команды

}

}

}

Для обмена данными с основной программой используется глобальная переменная буфера команд Cmd и флаг завершения приема команды cmPrinjata. Выберем длину буфера команд равной максимальной длине команды – шесть байтов.

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

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

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

Итак, подведем итоги

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

Особое внимание было уделено методу создания программ сверху вниз. Для этого был рассмотрен пример развития программы от построения программы-прототипа до детализации, достаточной для реализации устройства.

В главе были использованы некоторые интуитивно понятные конструкции языков программирования C и ASM-51. Однако для написания серьезных программ требуются более глубокие знания по этим языкам программирования, поэтому в последующих главах мы остановимся на этих языках подробнее.

 

 



Поделиться:


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

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