On Interrupt: The default handler

Introduction

GCBASIC supports a default interrupt handler in two modes:

  1. You can define the interrupt flags and the default handler (a sub routine) will executed
  2. You can define an On Interrupt event Call handler where the handler is executed that matches the event and where all other define/valid events are handled by the default handler (a sub routine), The easiest way to write an interrupt handler is to write it in GCBASIC in conjunction with the On Interrupt statement. On Interrupt tells microcontroller to activate its internal interrupt handling and to jump to a predetermined interrupt handler (a sub routine that has been defined) when the interrupt handler (the sub routine) has completed processing returns to correct address in the program. See On Interrupt.

This method of supports the handling interrupts by enabling a default interrupt subroutine.

Example 1

This example shows if an event occurs the microcontroller will be program to jump to the interrupt vector and the program will not know the event type, it will simple execute the Interrupt subroutine. This code is not intended as a meaningful solution and intended to show the functionality only. An LED is attached to PORTB.1 via a suitable resistor. It will light up when the Interrupt event has occurred.

    #chip 16f877a, 4
    dir PORTB.1 out
    Set PORTB.1 Off

    'Note: there is NO On Interrupt handler
    InitTimer1 Osc, PS1_8
    SetTimer 1, 1
    StartTimer 1
    'Manually set Timer1Overflow to the overflow event
    'this will event will be handled by the Interrupt sub routine
    TMR1IE = 1          ' <<< enables the interrupt with no On Interrupt handler registered
    end

    Sub Interrupt
      Set PORTB.1 On
      TMR1IF = 0
    End Sub

Key line: TMR1IE = 1 — enables the Timer1 overflow interrupt directly, with no matching On Interrupt line, so every occurrence of the event falls through to the default Interrupt subroutine. Example 2

Any events that are not dealt with by On Interrupt will result in the code in the Interrupt subroutine executing. This example shows the operation of two interrupt handlers - is not intended as a meaningful solution.

LEDs are attached to PORTB.1 and PORTB.2 via suitable resistors. They will light up when the Interrupt events occur.

    #chip 16f877a, 4
    On Interrupt Timer1Overflow call Overflowed

    dir PORTB.1 out
    Set PORTB.1 Off

    dir PORTB.2 out
    Set PORTB.2 Off

    InitTimer1 Osc, PS1_8
    SetTimer 1, 1
    StartTimer 1

    InitTimer2 PS2_16, PS2_16
    SetTimer 2, 255
    StartTimer 2

    'Manually set Timer2Overflow to create a second event
    'this will event will be handled by the Interrupt sub routine
    TMR2IE = 1          ' <<< enables a second interrupt with no On Interrupt handler registered
    end

    Sub Interrupt
      Set PORTB.2 On
      TMR2IF = 0
    End Sub

    Sub Overflowed
      Set PORTB.1 On
      TMR1IF = 0
    End Sub

Key line: TMR2IE = 1 — enables the Timer2 overflow interrupt with no matching On Interrupt line, so it falls through to the default Interrupt subroutine, while the explicitly-registered Timer1 overflow event still runs Overflowed instead.

See Also:

  • On Interrupt — registering a handler for a specific interrupt event
  • IntOff — globally disabling interrupts
  • IntOn — globally re-enabling interrupts
  • InitTimer1 — configuring Timer1, as used in both examples above