Interrupção Externa IRQ nos HCS08

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

Leave a Reply