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 } }