INTERRUPT Examples | Syntax |
This example shows how to create an RTCC rollover interrupt to create the modulation frequency for an infrared LED.
' ------------------------------------------------------------------------- ' Program Description ' ------------------------------------------------------------------------- ' ' This program modules an IR LED using the interrupt handler to toggle the ' IR LED state at a rate of 38.5 kHz. Since the program requires two ' changes of state at this rate, the ISR rate is doubled to 77,000. ' ' When an object reflects the IR from an the LED to the detector the Alarm ' LED will illuminate. ' ------------------------------------------------------------------------- ' Device Settings ' ------------------------------------------------------------------------- DEVICE SX28, OSCXT2, TURBO, STACKX, OPTIONX FREQ 4_000_000 ID "ISR LED" ' ------------------------------------------------------------------------- ' IO Pins ' ------------------------------------------------------------------------- IrLed VAR RB.0 ' IR LED control Detect VAR RB.1 ' detector input Alarm VAR RB.2 ' alarm LED output ' ------------------------------------------------------------------------- INTERRUPT NOPRESERVE 77_000 ' ------------------------------------------------------------------------- ISR_Start: IrLed = ~IrLed ' toggle IR LED RETURNINT ' ========================================================================= PROGRAM Start ' ========================================================================= ' ------------------------------------------------------------------------- ' Program Code ' ------------------------------------------------------------------------- Start: LOW IrLed ' make output, off LOW Alarm ' make output, off Main: Alarm = ~Detect ' check detector PAUSE 50 GOTO Main
This example shows how to create an RTCC rollover interrupt to create a "background" serial receiver that runs up to 19.2 kBaud (with a 4 MHz clock), N81, true mode. A blinking LED indicates "foreground" activity while serial data is being received.
' ------------------------------------------------------------------------- ' Program Description ' ------------------------------------------------------------------------- ' ' This program demonstrates the construction of an ISR to receive serial ' data "in the background" using a 16-byte circular buffer. ' ' Note: Requires SX/B 1.2 or later ' ------------------------------------------------------------------------- ' Device Settings ' ------------------------------------------------------------------------- DEVICE SX28, OSCXT2, TURBO, STACKX, OPTIONX FREQ 4_000_000 ID "ISR UART" ' ------------------------------------------------------------------------- ' IO Pins ' ------------------------------------------------------------------------- Sin VAR RA.0 ' serial in Blinker VAR RB.0 ' blinking LED LEDs VAR RC ' eight LEDs (7-segs) TRIS_LEDs VAR TRIS_C ' ------------------------------------------------------------------------- ' Constants ' ------------------------------------------------------------------------- B1200 CON 64 ' 1200 Baud B2400 CON 32 ' 2400 Baud B4800 CON 16 ' 4800 Baud B9600 CON 8 ' 9600 Baud B19K2 CON 4 ' 19.2 kBaud (max @ 4 MHz) BitTm CON B19K2 ' samples per bit BitTm15 CON 3*BitTm/2 ' 1.5 bits ' ------------------------------------------------------------------------- ' Variables ' ------------------------------------------------------------------------- rxHead VAR Byte ' available slot rxTail VAR Byte ' next byte to read rxByte VAR Byte ' serial byte rxCount VAR Byte ' bits to receive rxTimer VAR Byte ' bit timer for ISR rxBuf VAR Byte(16) ' circular buffer tmpB1 VAR Byte ' parameter ' ------------------------------------------------------------------------- INTERRUPT NOPRESERVE ' ------------------------------------------------------------------------- ' ISR is setup to receive N81, true mode. ISR_Start: ASM MOVB C, Sin ' sample serial input TEST rxCount ' receiving now? JNZ RX_Bit ' yes if rxCount > 0 MOV W, #9 ' start + 8 bits SC ' skip if no start bit MOV rxCount, W ' got start, load bit count MOV rxTimer, #BitTm15 ' delay 1.5 bits RX_Bit: DJNZ rxTimer, ISR_Exit ' update bit timer MOV rxTimer, #BitTm ' reload bit timer DEC rxCount ' mark bit done SZ ' if last bit, we're done RR rxByte ' move bit into rxByte SZ ' if not 0, get more bits JMP ISR_Exit RX_Buffer: MOV FSR, #rxBuf ' get buffer address ADD FSR, rxHead ' point to head MOV IND, rxByte ' move rxByte to head INC rxHead ' update head CLRB rxHead.4 ' keep 0 - 15 ENDASM ISR_Exit: RETURNINT 52 ' 13 uS @ 4 MHz ' ========================================================================= PROGRAM Start ' ========================================================================= ' ------------------------------------------------------------------------- ' Subroutine Declarations ' ------------------------------------------------------------------------- GET_BYTE SUB 0 ' returns byte from buffer ' ------------------------------------------------------------------------- ' Program Code ' ------------------------------------------------------------------------- Start: TRIS_LEDs = %00000000 ' make LED pins outputs OPTION = $88 ' interrupt, no prescaler Main: IF rxHead <> rxTail THEN ' if buffer has data LEDs = GET_BYTE ' get byte from buffer ENDIF TOGGLE Blinker ' blink LED PAUSE 50 ' small pause GOTO Main ' ------------------------------------------------------------------------- ' Subroutine Code ' ------------------------------------------------------------------------- ' Use: aVar = GET_BYTE ' -- if data is in buffer, the next byte is move to 'aVar' ' -- if called when buffer empty, code waits for character to arrive GET_BYTE: DO WHILE rxHead = rxTail ' wait while empty LOOP tmpB1 = rxBuf(rxTail) ' get first available INC rxTail ' update tail position \ CLRB rxTail.4 ' keep 0 - 15 RETURN tmpB1
This example shows how to use a port B edge detection interrupt to determine which button was pressed first.
' ------------------------------------------------------------------------- ' Program Description ' ------------------------------------------------------------------------- ' ' On reset the 7-segment LED is cleared to a dash and the program waits ' for a button press (RB.0 - RB.3) -- the "winner" (first pressed) will ' be displayed on the display until reset. ' ------------------------------------------------------------------------- ' Device Settings ' ------------------------------------------------------------------------- DEVICE SX28, OSC4MHZ, TURBO, STACKX, OPTIONX FREQ 4_000_000 ID "ISRPORTB" ' ------------------------------------------------------------------------- ' IO Pins ' ------------------------------------------------------------------------- Buttons VAR RB ' button inputs TRIS_Btns VAR TRIS_B Display VAR RC ' 7-segment LED TRIS_Disp VAR TRIS_C ' ------------------------------------------------------------------------- ' Constants ' ------------------------------------------------------------------------- Dash CON %01000000 ' - Dig1 CON %00000110 ' 1 Dig2 CON %01011011 ' 2 Dig3 CON %01001111 ' 3 Dig4 CON %01100110 ' 4 LtrE CON %01111001 ' E(rror) ' ------------------------------------------------------------------------- ' Variables ' ------------------------------------------------------------------------- winner VAR Byte ' button pressed first ' ------------------------------------------------------------------------- INTERRUPT ' ------------------------------------------------------------------------- ISR_Start: WKPND_B = winner ' get winner Ch1: ' check channel IF winner <> %0001 THEN Ch2 ' if not, try next Display = Dig1 ' otherwise display GOTO ISR_Exit Ch2: IF winner <> %0010 THEN Ch3 Display = Dig2 GOTO ISR_Exit Ch3: IF winner <> %0100 THEN Ch4 Display = Dig3 GOTO ISR_Exit Ch4: IF winner <> %1000 THEN Uh_Oh Display = Dig4 GOTO ISR_Exit Uh_Oh: Display = LtrE ' something went wrong ISR_Exit: WKEN_B = %11111111 ' no ISR until reset RETURNINT ' ========================================================================= PROGRAM Start ' ========================================================================= ' ------------------------------------------------------------------------- ' Program Code ' ------------------------------------------------------------------------- Start: Display = Dash ' indicate ready with dash TRIS_Disp = %00000000 ' display port --> outputs WKPND_B = %00000000 ' clear pending WKED_B = %11111111 ' falling edge detect WKEN_B = %11110000 ' use bits 0..3 for inputs END