Hi, I'm going mad for the past few days here since my interrupts are not working. I am trying to make a interrupt driven buffered serial input but without success since my program doesn't do anything when it should deal with the interrupts (it just stays on that "While CounterA <= 70 : WEND" forever) (nothing is printed out when I send something to it's serial port). Here is my code (part of it at least that deals with the serial part)
Any input is appreciated!Code:DEFINE OSC 20 DEFINE HSER_TXSTA 24h DEFINE HSER_RCSTA 90h DEFINE HSER_BAUD 19200 DEFINE HSER_SPBRG 64 ' 19200 Bauds DEFINE HSER_CLROERR 1 RCIF VAR PIR1.5 ' Alias RCIF (USART Receive Interrupt Flag) OERR VAR RCSTA.1 ' Alias OERR (USART Overrun Error Flag) CREN VAR RCSTA.4 ' Alias CREN (USART Continuous Receive Enable) LED VAR PORTD.0 ' Alias LED to PORTD.0 buffer_size CON 32 ' Sets the size of the ring buffer buffer VAR BYTE[buffer_size] ' Array variable for holding received characters index_in VAR BYTE ' Pointer - next empty location in buffer index_out VAR BYTE ' Pointer - location of oldest character in buffer bufchar VAR BYTE ' Stores the character retrieved from the buffer i VAR BYTE ' loop counter errflag VAR BYTE ' Holds error flags CMCON=%00000111 ' Disable Comparators TRISA=%00000000 ' PORTA all set to Output TRISB=%11111111 ' PORTB all set to Input T0CON=%00000111 ' OFF,16BIT,PRESCALE=256 ADCON0 = 0 CMCON=7 INTCON.5=1 'T0IE : TMR0 Overflow Interrupt Enable bit ON interrupt GOTO GestIntrerupts ' Deal with interrupts ReadSerial: DataRec var byte[5] : DataRec = 0 PIE1.5 = 1 ' Enable interrupt on USART While CounterA <= 70 : WEND PIE1.5 = 0 ' Disable interrupt on USART FOR COUNTERB=0 to COUNTERA SEROUT2 SerWRT,16416,[SerDATA(COUNTERB)] NEXT COUNTERB Goto ReadReadyLoop ' Subroutines Disable ' Don't check for interrupts in this section getbuf: ' move the next character in buffer to bufchar index_out = (index_out + 1) ' Increment index_out pointer (0 to 63) IF index_out > (buffer_size-1) Then index_out = 0 ' Reset pointer if outside of buffer bufchar = buffer[index_out] ' Read buffer location Return error: ' Display error message if buffer has overrun errflag = 0 ' Reset the error flag CREN = 0 ' Disable continuous receive to clear overrun flag CREN = 1 ' Enable continuous receive GoTo display ' Carry on buffer_error: errflag.1 = 1 ' Set the error flag for software ' Move pointer back to avoid corrupting the buffer. MIN insures that it ends up within the buffer. index_in = (index_in - 1) MIN (buffer_size - 1) HSerin [buffer[index_in]] ' Overwrite the last character stored (resets the interrupt flag) usart_error: errflag.0 = 1 ' Set the error flag for hardware Resume ' Return to program GestIntrerupts: IF INTCON.2 = 1 then T0CON.0 = 0 ' Disable timer TMR0L = 0 ' Reset timer TMR0H = 0 ' Reset timer TimeCount = TimeCount + 1 T0CON.0 = 1 ' Enabled timer INTCON.2 = 0 ELSE : IF RCIF = 1 THEN IF OERR Then usart_error ' Check for USART errors index_in = (index_in + 1) ' Increment index_in pointer (0 to 63) IF index_in > (buffer_size-1) Then index_in = 0 'Reset pointer if outside of buffer IF index_in = index_out Then buffer_error ' Check for buffer overrun HSerin [buffer[index_in]] ' Read USART and store character to next empty location SEROUT2 SerWRT,16416,[buffer(index_in)] SerData(CounterA)=buffer(index_in) CounterA = CounterA + 1 IF RCIF Then GestIntrerupts ' Check for another character while we're here ENDIF : ENDIF resume ENABLE





Bookmarks