Os microcontroladores HCS08 da Freescale apresentam duas fontes de interrupção externa: a interrupção externa IRQ e a interrupção de teclado. O pino IRQ pode ser configurado para gerar interrupções nas bordas de descida, de subida ou em nível lógico baixo/alto.
Ao ser detectada uma borda ou nível pré-definido no pino IRQ o flag IRQF é setado e poderá gerar uma interrupção da CPU. Esta fonte de interrupção também pode ser utilizada para fazer o chip retornar ao modo ativo (saída de um modo de baixo consumo).
O exemplo a seguir, retirado do livro HCS08 Unleashed, demonstra como utilizar este tipo de interrupção no microcontrolador MC9S08QG8 (com base na placa DEMOQG8 da Freescale).
// DEMO9S08QG8 pisca led controlado pelo pino IRQ
// O catodo do LED1 está conectado ao PTB6
// A tecla de RESET está conectada ao pino PTA5
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "hcs08.h" // Arquivo de definições do livro HCS08 Unleashed
unsigned char blinking=0;
// Esta é a rotina de tratamento da interrupção IRQ
void interrupt VectorNumber_Virq IRQ_isr()
{
IRQSC_IRQACK = 1; // reconhece a interrupção IRQ (apaga IRQF)
blinking = !blinking; // inverte o estado da variável de controle do pisca
// A interrupção IRQ é desativada para evitar ruído da tecla (debounce)
IRQSC_IRQIE = 0; //desabilita a interrupção IRQ
}
void main(void)
{
unsigned int temp;
SOPT1 = bBKGDPE; //configura o registrador SOPT1, habilita pino BKGD para modo BDM
PTADD = 0; //todos os pinos PTA como entradas
PTBDD = 0xFE; // PTB0 como entrada, PTB1 a PTB7 como saídas
PTBD = 0xC0; //desliga leds 1 e 2
PTAPE = BIT_5; // ativa o pull-up interno do pino PTA5
IRQSC = bIRQPE | bIRQIE; //habilita pino IRQ e a interrupção IRQ
EnableInterrupts; // habilita interrupções (CCR:I = 0)
while (1)
{
if (blinking)
{
PTBD_PTBD6 = 0; // liga o led
for (temp=3000; temp; temp--); // aguarda
PTBD_PTBD6 = 1; // desliga o led
for (temp=30000; temp; temp--); //aguarda
}
IRQSC_IRQIE = 1; // habilita a interrupção IRQ
}
}
