Syntax
INTERRUPT SUB name
Description
INTERRUPT SUB indicates to the compiler this SUB will be used as an
interrupt routine.
The address of the interrupt sub can be loaded into the interrupt hardware
using the ADDRESSOF operator.
This requires firmware 7.30 or later and compiler version 7.44 or later.
This will be the way interrupts will be supported on Cortex M0,M3 parts, the
ON construct will be maintained for backward compatibility, but will not be
expanded.
There are example programs for interrupts in the \Program Files
(x86)\Coridium\Examples directory . These examples cover TIMER,
GPIO, RITIMER and EINT interrupts.
PRINT statements are useful for debugging. However
PRINT statements should NOT be used inside INTERRUPT routines, as the PRINT
routine is not re-entrant, in other words a PRINT inside an interrupt will
interfere with a PRINT or many string expressions outside the interrupt.
You can use it just to see if the INTERRUPT occurs, but beyond that expect it to
cause problems in your program.
Example
'
ARM7 -- LPC21xx of ARMmite, PRO, ARMweb
' Test EINT0 on PWM02
' For
ARMmite connect PWM02 to P17
' The program will poll for a "0" or "1" on
RXD0
' Receiving a "0" will clear output P17, a "1" will set the output
' triggering an EINT0 interrupt
#define LPC2103
#include
"LPC21xx.bas"
dim e0 as integer
dim s0 as integer
dim rx as
integer
INTERRUPT SUB EINT0IRQ
SCB_EXTINT = 1 ' Clear interrupt
VICVectAddr = 0 '
Acknowledge Interrupt
e0 = e0 + 1
ENDSUB
SUB ON_EINT0(rise_edge, dothis)
' Setup MUST
be done before enabling the interrupt
PCB_PINSEL1 =
PCB_PINSEL1 or psfEINT0 ' select pin function
SCB_EXTINT = 1 ' clear interrupt
SCB_EXTMODE =
SCB_EXTMODE or 1 ' enable edge mode
if
rise_edge
SCB_EXTPOLAR =
SCB_EXTPOLAR or 1 ' trigger on rise edge
else
SCB_EXTPOLAR =
SCB_EXTPOLAR & &HFFFFFFFE ' trigger on fall edge (default)
endif
VICVectAddr4 =
dothis ' set function of VIC 4
VICVectCntl4 =
&H2e ' use it for EINT0 Interrupt:
VICIntEnable
= &H4000 ' enable EINT0 Interrupt:
VICVectAddr = 0 ' Acknowledge all Interrupts
ENDSUB
main:
print "EINT0 Interrupt Test"
print "Enter 0 to clear EINT0 input, 1
to set input"
ON_EINT0(1, ADDRESSOF EINT0IRQ) 'set up for rising edge
e0 = 0
s0 = 0
rx = 0
OUTPUT (12)
OUT(12) = 0
WHILE (1)
rx = RXD0
if rx
> 0 then
TXD0 = rx
if rx = "0" then OUT(12) = 0
if rx = "1" then OUT(12) = 1
endif
if s0 <> e0 then
s0 = e0
print "Received EINT0 "
endif
LOOP
'
Cortex M3 example -- PROplus SuperPRO
' Test EINT0 on C10
(P2.10)
' For ARMmite connect C10 to P18
' The program will poll for a "0"
or "1" on RXD0
' Receiving a "0" will clear output P18, a "1" will set the
output
' triggering an EINT0 interrupt
#include
"LPC17xx.bas"
dim e0 as integer
dim s0 as integer
dim rx as
integer
INTERRUPT SUB EINT0IRQ
SCB_EXTINT = 1 ' Clear
interrupt
e0 = e0 + 1
ENDSUB
SUB ON_EINT0(rise_edge,
dothis)
PCB_PINSEL4 =
&H00100000 ' EINT0 on
P2.10
SCB_EXTMODE = SCB_EXTMODE or 1 ' Enable edge mode
SCB_EXTINT =
1
' Clear interrupt
if rise_edge
SCB_EXTPOLAR =
SCB_EXTPOLAR or 1 ' trigger on
rise edge
else
SCB_EXTPOLAR = SCB_EXTPOLAR &
&HFFFFFFFE ' trigger on fall edge (default)
endif
EINT0_ISR = dothis or
1
'set vector in the VIC
VICIntEnable = VICIntEnable or (1<<18)
'&H00040000 'Enable interrupt
ENDSUB
main:
print
"EINT0 Interrupt Test"
print "Enter 0 to clear EINT0 input, 1 to set
input"
ON_EINT0(0, ADDRESSOF EINT0IRQ) 'set up for rising
edge
e0 = 0
s0 = 0
rx = 0
OUTPUT(18)
OUT(18) = 0
WHILE (1)
rx = RXD0
if rx > 0
then
TXD0 =
rx
if rx = "0" then OUT(18) =
0
if rx = "1" then OUT(18) =
1
endif
if s0
<> e0 then
s0 =
e0
print "Received EINT0
"
endif
LOOP
Cortex M series parts are running in Thumb code, which uses 16 bit
instructions. Addresses used for the PC (program counter) indicate Thumb
mode by setting the LSB of the address. That is why you see the vectors
such as
EINT0_ISR = dothis or
1
'set vector in the VIC
If you do not set this bit,the program will crash in the LPC11xx, LPC17xx
parts. Do not set it for LPC21xx parts.
Differences from other BASICs
- no equivalent in Visual BASIC
- no equivalent in PBASIC
See also