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