Freescale’s HCS08 microcontrollers have two external interrupt sources: the IRQ interrupt and the keyboard interrupt. The IRQ pin can be configured to generate interrupts on falling or rising edges or on high/low logic states.
When a configured edge or level is detect on IRQ, the IRQF flag is set and can generate an interrupt. That interrupt source can also be used to wakeup the chip from a low-power mode.
The following example, from my HCS08 Unleashed book, demonstrates how to use that interrupt on the MC9S08QG8 microcontroller (using Freescale’s DEMOQG8 board).
// DEMO9S08QG8 IRQ controlled led blinker for DEMOQG8
// LED1's cathode is connected to PTB6
// RESET switch is connected to PTA5
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "hcs08.h" // HCS08 Unleashed definition file
unsigned char blinking=0;
// this is the IRQ ISR
void interrupt VectorNumber_Virq IRQ_isr()
{
IRQSC_IRQACK = 1; // acknowledges IRQ (clear IRQF)
blinking = !blinking; // toggle the blink control variable
// IRQ interrupt is disabled to avoid noise (debounce)
IRQSC_IRQIE = 0; //disables IRQ interrupt
}
void main(void)
{
unsigned int temp;
SOPT1 = bBKGDPE; //configures SOPT1, enables BDM mode on BKGD pin
PTADD = 0; //all PTA pins as inputs
PTBDD = 0xFE; // PTB0 as input, PTB1 to PTB7 as outputs
PTBD = 0xC0; //turn leds off
PTAPE = BIT_5; // enables PTA5's internal pullup
IRQSC = bIRQPE | bIRQIE; //enable pin IRQ and its interrupt
EnableInterrupts; // interrupt enable (CCR:I = 0)
while (1)
{
if (blinking)
{
PTBD_PTBD6 = 0; // turn led on
for (temp=3000; temp; temp--); // wait
PTBD_PTBD6 = 1; // turn led off
for (temp=30000; temp; temp--); //wait
}
IRQSC_IRQIE = 1; // enable IRQ interrupt
}
}
