Thanks again Joe. That code worked very well and of course thanks to Darrel Taylor for his DT_INTS code.
The final code is posted here should anyone need it:
Code:'------------------------------------- ' STARTUP CODE '------------------------------------- 'MPASM generates an warning because of tabs around the macro (this prevents it) @ errorlevel -207 'Config settings for MPASM @ __CONFIG _CONFIG1, _HS_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLR_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF & _CCP1_RB0 'Using a 20Mhz XTAL define OSC 20 'Register setup ADCON1 = %00000111 ' Disable A/D converter ANSEL = %00000000 ' all analog pins to digital CCP1CON = %00000000 ' Disable CCP Module CMCON = %00000111 ' Turn off comparator INTCON = %00000000 ' Interrupts disabled 'Setup & Clear the ports TRISA = %00000000 'All O/P's TRISB = %00001101 'All O/P's PORTA = 0 'Zero PortA O/P's PORTB = 0 'Zero PortB O/P's '----------------------------------------------------------------------------- INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ; Include if using PBP interrupts ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? INT_Handler RX_INT, _INT_Serin, PBP, no endm INT_CREATE ; Creates the interrupt processor ENDASM @ INT_ENABLE RX_INT ; enable external (INT) interrupts '----------------------------------------------------------------------------- 'Setup the hardware USART for 9600 baud DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 DEFINE HSER_SPBRG 129 ' 9600 Baud @ 0.16% DEFINE HSER_CLROERR 1 ' Clear overflow automatically 'Define the LCD Define LCD_DREG PORTA DEFINE LCD_DBIT 0 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 0 DEFINE LCD_EREG PORTA DEFINE LCD_EBIT 4 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 1500 DEFINE LCD_DATAUS 50 'Alias & Vars RCIF VAR PIR1.5 ' Receive interrupt flag (1=full , 0=empty) TXIF VAR PIR1.4 ' Transmit interrupt flag (1=empty, 0=full) OERR VAR RCSTA.1 ' Alias OERR (USART Overrun Error Flag) CREN VAR RCSTA.4 ' Alias CREN (USART Continuous Receive Enable) BufMax CON 64 ' Sets the size of the ring buffer, set up from 32 Buffer VAR BYTE[BufMax] ' Array variable for holding received characters Ptr_in VAR BYTE ' Pointer - next empty location in buffer Ptr_out VAR BYTE ' Pointer - location of oldest character in buffer Bufchar VAR BYTE ' Stores the character retrieved from the buffer ErrFlag VAR BYTE ' Holds error flags ptr_in = 0 ' Clear buffer pointer (in) ptr_out = 0 ' Clear buffer pointer (out) Errflag = 0 ' Clear error flag 'Skip over the interupt handler & subroutines goto ShowSplash '------------------------------------- ' INTERUPT HANDLER '------------------------------------- INT_Serin: ' Serial Interrupt routine IF OERR Then usart_error ' Check for USART errors ptr_in = (ptr_in + 1) ' Increment ptr_in pointer (0 to 63) IF ptr_in > (BufMax-1) Then ptr_in = 0 'Reset pointer if outside of buffer IF ptr_in = ptr_out Then Buffer_Error ' Check for buffer overrun HSerin [buffer[ptr_in]] ' Read USART and store data in next empty location IF RCIF Then INT_Serin ' Check for another character while we're here @ INT_RETURN ; Return to program Buffer_Error: ' Error - Run out of buffer space 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. ptr_in = (ptr_in - 1) MIN (BufMax - 1) HSerin [buffer[ptr_in]] ' Overwrite the last data stored (clear the int.) USART_Error: ' Error - USART has overrun (data too fast?) errflag.0 = 1 ' Set the error flag for hardware @ INT_RETURN ; Return to program '------------------------------------- ' Subroutines '------------------------------------- GetBuf: ' move the next character in buffer to bufchar @ INT_DISABLE RX_INT ; Dont want to interupt this, Disable interupts ptr_out = (ptr_out + 1) ' Increment ptr_out pointer (0 to 63) IF ptr_out > (BufMax-1) Then ptr_out = 0 ' Reset pointer if outside of buffer bufchar = buffer[ptr_out] ' Read buffer location @ INT_ENABLE RX_INT ; All done, Enable interupts Return '------------------------------------- ' SPLASH SCREEN '------------------------------------- ShowSplash: pause 60 'Power up delay 'Display a splash screen for 2 seconds LCDOUT $FE,1,"RS232 to LCD" LCDOUT $FE,$C0,"Display Test" pause 2000 'Now ready for COMMS... LCDOUT $FE,1,"Waiting for PC" LCDOUT $FE,$C0,"to send data..." '------------------------------------- ' RS232 TO LCD '------------------------------------- MainLoop: IF errflag Then ErrorHandler ' Handle error if needed IF ptr_in = ptr_out Then MainLoop ' loop if nothing in buffer GoSub getbuf ' Get a character from buffer (stored in bufchar) LCDOut bufchar ' Send the character to LCD goto MainLoop 'Loop forever '------------------------------------- ' Error Handler '------------------------------------- ErrorHandler: ' Display error message if buffer has overrun IF errflag.1 Then ' Determine the error LCDOut $FE,$1,"Buffer Overflow" ' Display buffer error Else LCDOut $FE,$1,"USART Overrun" ' Display usart error EndIF errflag = 0 ' Reset the error flag CREN = 0 ' Disable continuous receive to clear overrun flag CREN = 1 ' Enable continuous receive GoTo MainLoop ' Errors cleared, time to work.




Bookmarks