Serial interrupt on PicBasic Pro


+ Reply to Thread
Results 1 to 3 of 3
  1. #1
    Join Date
    Feb 2011
    Posts
    4

    Default Serial interrupt on PicBasic Pro

    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
    Attached Files Attached Files
    Last edited by mregisd; - 6th February 2012 at 13:17. Reason: Editing the code

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924

    Default Re: Serial interrupt on PicBasic Pro

    A good rule with interrupts is to get in and out as fast as possible.
    Try not doing all of the processing inside the interrupt routine and see if that helps.
    Dave
    Always wear safety glasses while programming.

  3. #3
    Join Date
    Feb 2011
    Posts
    4

    Default Re: Serial interrupt on PicBasic Pro

    Thanks mackrackit! I modified the program and just put a flag that i created inside of the interrupt routine. So the interrupt set that flag = 1 and go back to Loop and then if this flag = 1, the program goto to another routine and do all the processing. But don't solve the problem.
    I did a test that I remove the SERIN2 and leave all the IF's, CASE and WHILE inside the interrupt routine, then the problem was solved, I can interrupt normally. But i need to receive the data with 10 bytes when interrupt happens.
    So, I'm stuck on that problem. =/

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts