Well I have this code and still get underflow errors... I have a pritty good idea of what the code does, but I can't understand why it gives me this undeflow error as it is called from the main loop.
Code:SERBUF var byte TEMP var byte COUNTS var byte ASM ; ******************************************************************** ; INCH ROUTINE ; THIS ROUTINE INPUTS RS232 DATA USING A 22K OHM RESISTOR, NO LEVEL- ; CHANGING INVERTER IS USED. GPIO,3 = RX (MARK = 0, SPACE = 1). ; THIS ROUTINE USES A 8-DATA BIT PER CHARACTER PROTOCOL. ; TO RECIEVE A CHARACTER, CALL inch. THE RECEIVED CHARACTER IS PLACED ; IN THE REG 'W' AND IN THE REG 'SERBUF'. ; CHARACTER WILL ECHO IF 'retlw 0' IS REM-ED OUT. ; VARIABLES USED: REG 'TEMP' AND REG 'SERBUF' BOTH VARIABLES ARE ; SHARED WITH THE 'outch' ROUTINE ; ROUTINES CALLED: 'half_baud' AND 'baud' FOR THE BAUD-RATE TIMING. ; ******************************************************************** inch: btfss GPIO,3 ; SKIP ON START BIT = "SPACE" (+RS232) goto inch ; ELSE KEEP LOOKING FOR A START BIT movlw d'08' ; START SERIAL INPUT SEQUENCE movwf _TEMP ; COLLECT 8 DATA BITS clrf _SERBUF ; CLEAR SERIAL CHARACTER BUFFER call half_baud ; DELAY FOR ONE HALF BAUD TIME btfss GPIO,3 ; FALL THRU IF START BIT STILL = "SPACE" goto inch ; ELSE IT WAS JUST A NOISE SPIKE, LOOP inch1: call baud ; DELAY ONE BAUD-BIT TIME ( = 1/BAUD-RATE) bcf STATUS,0 ; CLEAR THE CARRY BIT rrf _SERBUF,F ; ROTATE CRY -> MSB, ROTATE MSB RIGHT btfss GPIO,3 ; IS INPUT = "SPACE" (+RS232) ? bsf _SERBUF,7 ; ...SKIP IF YES, ELSE SET BIT TO LOGIC '1' decfsz _TEMP,F ; EIGHT COUNTS YET? goto inch1 ; ...NO, GET ANOTHER BIT call baud ; DELAY FOR THE FIRST STOP BIT movf _SERBUF,W ; Put the character in reg 'W' retlw 0 ; NOTE: REM THIS OUT IF YOU NEED AN "ECHO" ; ...AND FALL THROUGH TO THE 'OUTCH' ROUTINE ; ******************************************************************** ; BAUD ROUTINE @ 4 MHz ; BAUD RATE: CONSTANT: ; 1200 Baud D'137' ; 2400 Baud D'68' ; 4800 Baud D'34' ; 9600 Baud D'16' ; 19200 Baud D'8' ; 38400 Baud and up - use 'NOP' delays ; VARIABLES USED: REG 'COUNT' ; ROUTINES CALLED: NONE ; ******************************************************************** baud: ; AT 2400 BAUD THE PERIOD IS 416.6 US ; CLK = 4MHz movlw D'68' ; 1 US (BAUD RATE CONSTANT) movwf _COUNTS ; 1 US baud1: decfsz _COUNTS,F ; 1 US (+ 1 US MORE IF SKIP) goto baud1 ; 2 US ; FALL THRU...AFTER 1+1+3x68+1 = 207 US half_baud: movlw D'68' ; 1 US movwf _COUNTS ; 1 US hbaud1: decfsz _COUNTS,F ; 1 US (+ 1 US MORE IF SKIP) goto hbaud1 ; 2 US retlw 0 ; ...AFTER 1+1+3x68+1 = 207 US (X2=414 US) ENDASM high porta.0 loop: @ goto inch if SERBUF = 49 then low porta.0 goto loop END




Bookmarks