***********************************************************
* INTEX.ASM
* This is a sample program to demonstrate the use of
* interrupts in a Motorola microcontroller.
*
* This code was written for the 68HC705P9 MCU, which has
* 5 sources of interrupts: IRQ', SWI, Input Capture, Output
* Compare, and Timer Overflow.
*
* For this example, assume that the software interrupt is
* not used (no SWI instructions) and the IRQ' interrupt is
* not used (tied high). We will use only the input capture
* and output compare interrupts, which share the timer
* interrupt vector.
*
* This example is intended to illustrate the programming of
* interrupts.
* It uses the input capture function to record the time of
* an external event on the TCAP pin, and toggle a Port A pin.
* The output compare function toggles the TCMP pin at a
* given interval, producing a square wave on the TCMP pin.
*
* If the TCMP pin is tied directly to the TCAP pin, then
* the falling edge of the TCMP signal (caused by every other
* output compare interrupt) triggers an input capture interrupt.
* The input capture interrupt records the timer value and
* toggles a pin on I/O port A. The result is a square wave on
* pin PA0 of half the frequency of the TCMP square wave.
***********************************************************
*----------------------------------------------------------
* Assembler equates
*----------------------------------------------------------
PORTA EQU $0000 ;Port A Data Register
DDRA EQU $0004 ;Port A Data Direction
APIN EQU 0 ;Toggle pin on Port A
FAULT EQU 1 ;Fault indicator pin
TCR EQU $0012 ;Timer Control Register
ICIE EQU 7 ;ICIE bit position in TCR
OCIE EQU 6 ;OCIE bit position in TCR
TOIE EQU 5 ;TOIE bit position in TCR
IEDG EQU 1 ;IC input edge bit
OLVL EQU 0 ;OC output level bit
TSR EQU $0013 ;Timer Status Register
ICF EQU 7 ;ICF bit position in TSR
OCF EQU 6 ;OCF bit position in TSR
ICRH EQU $0014 ;High byte of IC register
ICRL EQU $0015 ;Low byte of IC register
OCRH EQU $0016 ;High byte of IC register
OCRL EQU $0017 ;Low byte of IC register
ATRH EQU $001A ;Alternate timer register
ATRL EQU $001B
*----------------------------------------------------------
* RAM variables
*----------------------------------------------------------
ORG $0080 ;Start of RAM
InClock RMB 2 ;Clock value for IC event
OutDelay RMB 1 ;Delay value for OC event
*----------------------------------------------------------
* Start of program code
*----------------------------------------------------------
ORG $0100 ;Start of user EPROM
Startup BSET OCIE,TCR ;Enable OC interrupts
BSET ICIE,TCR ;Enable IC interrupts
BCLR TOIE,TCR ;Disable TO interrupts
* Setup Pin Toggle function
BSET APIN,DDRA ;Set toggle pin as output
BCLR APIN,PORTA ;Start pin low
* Setup Input Capture function to trigger on falling edge
BCLR IEDG,TCR ;Set IEDG bit (go low)
* Setup Output Compare function
BCLR OLVL,TCR ;Clear OLVL bit (go low)
LDA #$FF ;Setup delay variable
STA OutDelay
LDX ATRH ;Load current timer MSB
LDA ATRL ;Load current timer LSB
ADD OutDelay ;Add delay
BCC Continue ;Check for carry
INCX ;Compensate for carry
Continue STA OCRL ;Record OC value
STX OCRH
* Enable interrupts globally
CLI ;Start interrupt service
*----------------------------------------------------------
* Main loop; wait for interrupts
*----------------------------------------------------------
Loop BRA Loop
*----------------------------------------------------------
* Timer interrupt service routine
* Because either an input capture or output compare interrupt
* will be vectored to this routine, the software must
* determine the source of the interrupt.
*----------------------------------------------------------
TimerInt BRSET OCF,TSR,OCInt ;Check the OC flag
* If the OCF is clear,
* an input capture happened, so record the time of the event
ICInt LDA PORTA ;Toggle the port pin
EOR #$01
STA PORTA
LDA ICRH ;Record high byte
STA InClock
LDA ICRL ;Record low byte
STA InClock+1
LDX TSR ;Ensure clear ICF bit
RTI ;End of interrupt
* If we reach this point, an output compare event happened
* Toggle the OLVL bit for the next compare, and add new
* compare value
OCInt LDA TCR ;Load control register
EOR #$01 ;Toggle the OLVL bit
STA TCR ;Setup new OLVL value
LDA OCRL ;Get time of compare
ADD OutDelay ;Add delay value
BCC NoCarry
INC OCRH ;Compensate for carry
NoCarry LDX TSR ;Ensure clear OCF bit
STA OCRL
RTI ;End of interrupt
*----------------------------------------------------------
* One routine for unused interrupt vectors; return
*----------------------------------------------------------
UnusedInt RTI ;Simply return
*----------------------------------------------------------
* Another routine for unused interrupt vectors; toggle I/O
*----------------------------------------------------------
UnusedFault BSET FAULT,PORTA ;Toggle fault pin
BCLR FAULT,PORTA
RTI
*----------------------------------------------------------
* Vector Definitions
* address all vectors, used and unused
*----------------------------------------------------------
ORG $1FF8 ;Timer vector
FDB TimerInt ;Timer interrupt routine
ORG $1FFA ;IRQ' vector
FDB UnusedInt ;IRQ' interrupt not used
ORG $1FFC ;SWI vector
FDB UnusedInt ;SWI not used
ORG $1FFE ;Reset vector
FDB Startup ;Start of program flow
******************************************************************************
* *
* Motorola reserves the right to make changes without further notice to any *
* product herein to improve reliability, function, or design. Motorola does *
* not assume any liability arising out of the application or use of any *
* product, circuit, or software described herein; neither does it conveyany *
* license under its patent rights nor the rights of others. Motorola *
* products are not designed, intended, or authorized for use as components *
* in systems intended for surgical implant into the body, or other *
* applications intended to support life, or for any other application in *
* which the failure of the Motorola product could create a situation where *
* personal injury or death may occur. Should Buyer purchase or use Motorola *
* products for any such intended or unauthorized application, Buyer shall *
* indemnify and hold Motorola and its officers, employees, subsidiaries, *
* affiliatees, and distributors harmless against all claims, costs, damages, *
* and expenses, and reasonable attorney fees arising out of, directly or *
* indirectly, any claim of personal injury or death associated with such *
* unintended or unauthorized use, even if such claim alleges that Motorola *
* was negligent regarding the design or manufacture of the part. Motorola *
* and the Motorola Logo are registered trademarks of Motorola Inc. *
* *
******************************************************************************