I need some help with this serial interrupt... It's working but not so well because when the interrupt happens I receive the serial data and treat the information. The problem is when the program return from the 1st interrupt to the Loop, I can't do another interrupt. I send serial data but the interrupt not happens.
So, please, can anyone help me?
Thanks...
Here's my code..
define LOADER_USED 1 INCLUDE "modedefs.bas"
DEFINE OSC 4
RX VAR PORTC.7 'SERIAL'S RECEIVE BIT.
TX VAR PORTC.6 'SERIAL'S TRASMITTER BIT.
CMD VAR PORTD.2
CONT VAR BYTE
CMD = 0
CONT = 0
TRISC = 000000
TRISD = 000100
TRISE = 0
INTCON = 000000 ; GENERAL AND PERIPHERALS INTERRUPT
PIE1.5 = 1 ; " " " DE RECEPÇÃO DA USART
RCSTA.1 = 0 ; MANY BYTES RECEIVED WITHOUT READ
RCSTA.2 = 0 ; Stop Bit
RCSTA.4 = 1 ; CONTINOUS REVEICE
RCSTA.6 = 0 ; 8 BITS' RECEIVE
RCSTA.7 = 1 ; USART ACTIVATION
RCIF var PIR1.5 ; RECEIVE INTERRUPT
STATUSLED var PORTD.0 ; LED'S NOTIFICATION OF "PROCESS RUNNING"
USERLED var PORTD.1 ; LED CONTROLLED BY USER
DELAY var word
DISCARD var byte ; Clean the RCREG
FRAME VAR BYTE[10]
FRAME = 0
PORTD = 0
PORTC = 0
PORTE = 0
ON INTERRUPT GOTO USART_INTERRUPT
LOOP:
toggle statusled
for delay = 1 to 5000 ; use a loop delay to ensure
pauseUS 5 ; getting interrupt as fast as
next ; possible
goto LOOP
DISABLE
USART_INTERRUPT:
WHILE RCIF = 1
RCREG = DISCARD
WEND
SERIN2 RX,84,[WAIT("E"),STR FRAME\10]
IF FRAME[0] = "E" THEN
IF FRAME[1] = "B" THEN
IF FRAME[2] = "9" THEN
IF FRAME[3] = "0" THEN
SELECT CASE FRAME[4]
CASE "S"
IF FRAME[7] = "0" THEN
IF FRAME[5] = "E" THEN
IF FRAME[8] = "0" THEN
IF FRAME[6] = "P" THEN
WHILE FRAME[9] = "0" AND CMD = 0 AND CONT < 36
PORTC.0 = 1
PAUSE 2500
CONT = CONT + 1
WEND
ENDIF
ENDIF
ENDIF
ENDIF
CASE "L"
IF FRAME[5] = "V" THEN
IF FRAME[8] = "0" THEN
IF FRAME[6] = "A" THEN
IF FRAME[9] = "0" THEN
while FRAME[7] = "L" AND CMD = 0 AND CONT < 36
PORTC.1 = 1
PORTC.3 = 1
PAUSE 2500
CONT = CONT + 1
WEND
ENDIF
ENDIF
ENDIF
ENDIF
CASE "D"
IF FRAME[5] = "V" THEN
IF FRAME[8] = "0" THEN
IF FRAME[6] = "A" THEN
IF FRAME[9] = "0" THEN
WHILE FRAME[7] = "L" AND CMD = 0 AND CONT < 36
PORTC.2 = 1
PORTC.3 = 1
PAUSE 2500
CONT = CONT + 1
WEND
ENDIF
ENDIF
ENDIF
ENDIF
END SELECT
ENDIF
ENDIF
ENDIF
ENDIF
REVERSE CMD
CMD = 0
REVERSE CMD
FRAME = 0
PORTC.0 = 0
PORTC.1 = 0
PORTC.2 = 0
PORTC.3 = 0
CONT = 0
WHILE RCIF = 1
RCREG = DISCARD
WEND
RESUME
ENABLE
END
Bookmarks