C and Assembly programs to increment Port A when the
timer overflows (using interrupts)
Assembly Program:
; Program to increment Port A every 32 ms ; using the timer overflow interrupt prog: equ $0800 data: equ $0900 int_vec: equ $0B10 TSCR: equ $0086 TMSK2: equ $008D TFLG2: equ $008F DDRA: equ $0002 PORTA: equ $0000 CODE: section .text ;The stuff which follows is program code org prog ;set program counter to 0x0800 lds #$0A00 ldaa #$FF staa DDRA ; Port A output clr PORTA ; 0 -> Port A ldaa #$80 staa TSCR ; Turn on timer ldaa #$82 staa TMSK2 ; Enable timer overflow interrupt; 32 ms overflow ldaa #$80 staa TFLG2 ; Clear TOI flag cli ; Enable interrupts loop: bra loop ; Repeat forever toi_isr: inc PORTA ; ldaa #$80 staa TFLG2 ; Clear TOI flag rti VEC: section .text ; Constant vectors org int_vec dc.w 0 ; BDLC dc.w 0 ; ATD dc.w 0 ; reserved dc.w 0 ; SCI0 dc.w 0 ; SPI dc.w 0 ; Pulse acc input dc.w 0 ; Pulse acc overflow dc.w toi_isr ; Timer overflow dc.w 0 ; Timer channel 7 dc.w 0 ; Timer channel 6 dc.w 0 ; Timer channel 5 dc.w 0 ; Timer channel 4 dc.w 0 ; Timer channel 3 dc.w 0 ; Timer channel 2 dc.w 0 ; Timer channel 1 dc.w 0 ; Timer channel 0 dc.w 0 ; Real time dc.w 0 ; IRQ dc.w 0 ; XIRQ dc.w 0 ; SWI dc.w 0 ; illegal dc.w 0 ; cop fail dc.w 0 ; cop clock fail dc.w $ff80 ; RESET
C Program:
Main Program toi.c
#include "hc12.h" main() { DDRA = 0xff; /* Make Port A output */ TSCR = 0x80; /* Turn on timer */ TMSK2 = 0x84; /* Enable timer overflow interrupt, set prescaler */ TFLG2 = 0x80; /* Clear timer interrupt flag */ enable(); /* Enable interrupts (clear I bit) */ while (1) { /* Do nothing - go into low power mode */ } } @interrupt void toi_isr(void) { PORTA = PORTA + 1; /* Increment Port A */ TFLG2 = 0x80; /* Clear timer interrupt flag */ }
Vector locations vector.c
/* INTERRUPT VECTORS TABLE 68HC12 */ void toi_isr(); /* character receive handler */ /* Vectors at 0xFFD0 on standard HC12; remapped to 0x0B10 with D-Bug 12 */ void (* const _vectab[])() = { 0, /* BDLC */ 0, /* ATD */ 0, /* reserved */ 0, /* SCI0 */ 0, /* SPI */ 0, /* Pulse acc input */ 0, /* Pulse acc overflow */ toi_isr, /* Timer overflow */ 0, /* Timer channel 7 */ 0, /* Timer channel 6 */ 0, /* Timer channel 5 */ 0, /* Timer channel 4 */ 0, /* Timer channel 3 */ 0, /* Timer channel 2 */ 0, /* Timer channel 1 */ 0, /* Timer channel 0 */ 0, /* Real time */ 0, /* IRQ */ 0, /* XIRQ */ 0, /* SWI */ 0, /* illegal */ 0, /* cop fail */ 0, /* cop clock fail */ (void *)0xff80, /* RESET */ };