6.2. Прерывания

(Руководство разработчика по микроконтроллерам семейства HCS08)

Модуль внешнего прерывания IRQ — это модуль в составе процессорного ядра МК. Модуль IRQ имеет собственный выделенный вектор прерывания, который обладает одним из наивысших приоритетов. Аппаратные средства модуля способны детектировать запросы на прерывание в статическом и динамическом режимах.

Модуль IRQ очень прост в использовании. Если соответствующий вывод МК сконфигурирован для работы в качестве входа внешнего прерывания (IRQPE = 1), то можно установить режим его работы. Различают статический и динамический режимы генерации запросов на прерывание.

В статическом режиме (бит IRQMOD = 1) запрос генерируется, если на входе IRQ установлен активный уровень сигнала. Например, для модуля IRQ назначили статический режим работы и НИЗКИЙ активный уровень сигнала. Тогда при подаче на вход IRQ логического 0 будет сгенерирован запрос на прерывание. Центральный процессор выполнит подпрограмму прерывания и вернется к исполнению основной программы. Если на входе IRQ все еще будет удерживаться активный НИЗКИЙ уровень, то модуль IRQ сгенерирует новый запрос, и подпрограмма прерывания будет выполнена вторично. Таким образом, в статическом режиме генерация запроса на прерывание будет продолжаться до тех пор, пока на входе IRQ не установится высокий неактивный уровень сигнала запроса. В англоязычной литературе этот режим называют «Edge and Level Sensitivity».

В динамическом режиме (бит IRQMOD = 0) запрос генерируется, если уровень сигнала на входе IRQ изменился с неактивного на активный. Например, для модуля IRQ назначили динамический режим работы и НИЗКИЙ активный уровень сигнала. Тогда при изменении на входе IRQ сигнала с 1 на 0 будет сгенерирован запрос на прерывание. Центральный процессор выполнит подпрограмму прерывания и вернется к исполнению основной программы. Новый запрос не будет сгенерирован, даже если на входе IRQ все еще будет удерживаться низкий активный уровень. Таким образом, в динамическом режиме генерация запроса на прерывание будет выполнена только один раз, независимо от длительности активного уровня сигнала запроса. В англоязычной литературе этот режим называют «Edge only Sensitivity».

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

Большинство МК из семейства HCS08 (кроме QA и QG) позволяют выбрать активный уровень и фронт, по которым модуль IRQ будет детектировать внешний запрос на прерывание. Если бит IRQEDG регистра IRQSC установить в 1, то активными будут ВЫСОКИЙ уровень и нарастающий фронт внешнего сигнала; если бит установить в 0 — то НИЗКИЙ уровень и спадающий фронт.

После того, как работа модуля IRQ была разрешена посредством установки бита IRQF в регистре IRQSC, аппаратные средства модуля осуществляют непрерывный мониторинг уровня сигнала на выводе IRQ. При регистрации выбранного фронта/уровня на входе IRQ, устанавливается флаг запроса IRQF в регистре управления и состояния IRQSC, и генерируется запрос на прерывание в ЦП. Для сброса флага IRQF необходимо записать 1 в бит подтверждения IRQACK того же регистра.

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

Сразу после разрешения работы модуля внешнего прерывания ко входу IRQ автоматически подключается подтягивающий резистор: верхний — при выборе режима детектирования нарастающего фронта и ВЫСОКОГО уровня и нижний — для режима детектирования НИЗКОГО уровня и спадающего фронта.

Таблица6.2. Режимы детектирования сигнала внешнего запроса

Биты регистра IRQSCСигнал IRQ, при котором устанавливается флаг IRQF
IRQMODIRQEDG
00Спадающий фронт
01Нарастающий фронт
10Спадающий фронт или НИЗКИЙ уровень
11Нарастающий фронт или ВЫСОКИЙ уровень

Во всех моделях МК, кроме серий AW, GB, GT и Rx, внутренние подтягивающие резисторы можно отключить с помощью бита IRQDD регистра IRQSC.

В следующем примере рассмотрены принципы программного обслуживания внешнего прерывания IRQ. Это модифицированная версия Примера 6.2, в которой для изменения состояния светодиода используется клавиша RESET. После первого нажатия светодиод начнет мигать, после второго — перестает мигать.

Пример 6.3. Мигающий светодиод с управлением по входу внешнего прерывания IRQ

//ДемонстрационнаяплатаDEMO9S08QG8,мигающийсветодиодсуправлениемпоIRQ
//КатодсветодиодаLED1соединенсPTB6
//КнопкаRESETсоединенасPTA5
#include/*forEnableInterruptsmacro*/
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"//Этонашфайлсобъявлениями!
unsignedcharblinking=0;
//ФункцияобработкивнешнегопрерыванияповходуIRQ
voidinterruptVectorNumber_VirqIRQ_isr()
{
IRQSC_IRQACK=1;//ПодтверждениепрерыванияпоIRQ(сбросфлагаIRQF)
blinking=!blinking;//Изменитьсостояниепеременнойрежимаработысветодиода
//ПрерываниепоIRQзапрещаетсядлязащитыотмеханическогодребезгаконтактов
IRQSC_IRQIE=0;//ЗапретитьпрерываниеотIRQ
}
voidmain(void)
{
unsignedinttemp;
SOPT1=bBKGDPE;//ИнициализациярегистраSOPT1,разрешитьотладкупоBKGD
PTADD=0;//ВселинииPTAнаввод
PTBDD=0xFE;//ЛинияPTB0наввод,остальныелиниипортаPTB—навывод
PTBD=0xC0;/*ВыключитьсветодиодыLED1иLED2(тожеприсутствуетна
плате),установитьв0остальныелиниипортаPTB*/
PTAPE=BIT_5;//ПодключитьподтягивающийрегистрдляPTA5
IRQSC=bIRQPE|bIRQIE;//РазрешитьпрерыванияпоIRQ
EnableInterrupts;//РазрешитьпрерыванияЦП(CCR:I=0)
while(1)
{
if(blinking)
{
PTBD_PTBD6=0;//Светодиодвключен
for(temp=3000;temp;temp--);//Программнаязадержка
PTBD_PTBD6=1;//Светодиодвыключен
for(temp=30000;temp;temp--);//Программнаязадержка
}
IRQSC_IRQIE=1;//РазрешитьпрерыванияпоIRQ
}
}

Приведем некоторые комментарии к этому примеру:

  1. В МК семейства QG модуль IRQ может детектировать только спадающий фронт и/или НИЗКИЙ активный уровень сигнала.
  2. В данном примере переменная blinking — глобальная, поскольку ее необходимо изменять вне функции main().
  3. В этом примере прерывание запрещается в самой подпрограмме прерывания IRQ_isr() и снова разрешается лишь в конце очередного цикла программы main. Такой прием в данном конкретном случае применяется для борьбы с механическим дребезгом кнопки.
  4. МК семейства HCS08 допускают одновременный сброс флага IRQF и запрет работы модуля внешнего прерывания:
    IRQSC = bIRQPE | bIRQACK;   // Подтвердить прерывание по IRQ и запретить функцию
                              // внешнего прерывания для линии IRQ 
    В таком случае код ISR будет выглядеть так:
    void interrupt VectorNumber_Virq IRQ_isr() {
    IRQSC = bIRQPE | bIRQACK;  
    blinking = Iblinking;      // Инвертировать переменную blinking
    }

В следующем примере показана реализация счетчика событий по входу IRQ. Программа считает количество спадающих фронтов на входе IRQ без защиты от дребезга сигнала на входе.

Пример 6.4. Счетчик событий по входу внешнего прерывания IRQ

//ДемонстрационнаяплатаDEMO9S08QE128,счетчиксобытийповходуIRQ
//СветодиодыподключеныкпортуPTC
//КнопкаRESET/IRQсоединенасPTA5
#include/*forEnableInterruptsmacro*/
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"//Этонашфайлсобъявлениями!
unsignedcharcounter=0;
//ФункцияобработкивнешнегопрерыванияпоIRQ
voidinterruptVectorNumber_VirqIRQ_isr()
{
IRQSC_IRQACK=1;//ПодтверждениепрерыванияпоIRQ(сбросфлагаIRQF)
counter++;//Увеличитьпрограммныйсчетчикcounterна1
}
voidmain(void)
{
SOPT1=bBKGDPE;//ИнициализациярегистраSOPT1,разрешитьотладкупоBKGD
PTCDD=0xFF;//ЛиниипортаPTC–навывод
PTEDD=BIT_7|BIT_6;//ЛинииPTE7иPTE6–навывод
PTAPE=BIT_5;//ВключитьподтягиваюшийрезистордляPTA5
IRQSC=bIRQPE|bIRQIE;//РазрешитьпрерыванияпоIRQ
EnableInterrupts;//РазрешитьпрерыванияЦП(CCR:I=0)
while(1)
{
PTCD=~counter;/*Отобразитьнасветодиодахсостояниесчетчикакоманд.
ДляэтоговывестинапортPTCпобитовуюинверсиюcounter*/
PTED_PTED7=PTCD_PTCD7;//PTE7=PTC7
PTED_PTED6=PTCD_PTCD6;//PTE6=PTE6
}
}

6.2.1.1. Регистр управления IRQSC

РегистрРежимD7D6D5D4D3D2D1D0
IRQSCЧтение0IRQDDIRQEDGIRQPEIRQF0IRQ1EIRQMOD
ЗаписьIRQACK
Сброс00000000

Описание битов:
Имя битаОписаниеСимвол в языке С
IRQDDВключение подтягивающего резистора для входа IRQ:
0 — подтягивающий резистор подключен;
1 — подтягивающий регистр отключен.
Бит недоступен в микроконтроллерах серий AW, GB, GT, и Rx!
bIRQDD
IRQEDGВыбор активного уровня, по которому будет детектироваться запрос:
0 — спадающий фронт и/или НИЗКИЙ уровень;
1 — нарастающий фронт и/или ВЫСОКИЙ уровень.
Этот бит недоступен в микроконтроллерах серий QA и QG!
bIRQEDG
IRQPEБит разрешения линии IRQ в качестве входа запроса на прерывание:
0 — линия IRQ активирована.
1 — линия IRQ не действует.
bIRQPE
IRQFФлаг события запроса внешнего прерывания:
0 — запроса на прерывание нет;
1 — запрос на прерывание поступил.
Бит доступен только для чтения!
bIRQF
IRQACKБит подтверждения запроса о прерывании:
0 — не дает никакого эффекта;
1 — очистка триггера запроса на прерывание IRQF.
bIRQACK
IRQIEРазрешение прерываний от модуля IRQ:
0 — прерывания от модуля запрещены;
1 — прерывания от модуля разрешены.
bIRQIE
IRQMODРежим детектирования сигнала запроса:
0 — динамический режим;
1 — статический режим.
bIRQMOD

Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>