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

November 7, 2014 by admin Комментировать »

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

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

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

Прототип для прерывания

При программировании на языке С обрабатывать прерывания просто, поскольку для прерываний имеются процедуры под разными именами и компилятор сохраняет содержимое регистра состояния перед выполнением ISR. Когда процессор переходит на ISR— прерывания автоматически запрещаются (чтобы никакое другое прерывание не могло произойти). По завершении ISR прерывания автоматически разрешаются. В языке ассемблера возвращение из ISR выполняется при помощи команды reti, которая разрешает прерывания (и тем самым отличается от оператора ret). Далее показан пример включения таймера на микроконтроллере AVR (для прерывания по переполнению). Задействован 8-разрядный таймер TimerO.

// Инициализация TimerO

//разрешение прерываний sei();

//установка частоты таймера = fclk/1024 TCCRO = (1«CS02) I (1«CS01) ;

TCNTO = 0x00;

//разрешаем прерывание по переполнению таймера TIMSK | = (1«ТО1Е0) ;

//Определение процедуры прерывания по переполнению таймера ISR (TIMER 0_OVF_vec t)

{

PORTD = Oxff; //обычные команды и операции <некий код>

}

Каждое прерывание имеет свое уникальное название вектора (которое пишется в скобках isr ( )); эти имена определяются в файле заголовков interrupt.h. Таким образом, необходимо присоединять этот файл заголовков при написании прерываний и работе с ними. Процессор вызывает процедуру iSR(TiMERO_ovF_vect) каждый раз, когда происходит переполнение TimerO и прерывание.

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

Оставить комментарий

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