;BACKUP\MINT.014 ; ; NEED TO MAKE ONE SECOND TIMER BE INSIDE THE TENTH SECOND TIMER ; AND NEED TO MAKE THE TENTH SECOND TIMER TO HAVE 0xF0 INSTEAD OF 0x18, ; BECAUSE F0 (240) IS 10 TIMES A SECOND, AND I BET 24 WOULD BE 100 TIMES ; A SECOND. yeah! WE WANT THAT TOO i THINK. SO WE SHOULD MAKE A 100HERTZ ; SUB, THEN IN THAT, EVERY TEN TIMES DO THE 1/10, AND INSIDE OF *THAT* ; DO EVERT TENTH TIME AGAIN FOR THE ONE SECOND INT. ; NOTES: ; 'M' LETS YOU SET A VALUE FOR MOTORSEEK ; 'S' DISPLAYS MOTORPOS ; 'C' CENTERS THE SERVO ; 'E' AND 'e' SHOULD ADD/SUBTRACT 15 FROM MOTORSEEK ; 'P' AND 'p' SHOULD ENABLE/DISABLE SEEK ACTIVE ; 'R' forces WDT reset ; 'D' AND 'd' turns on and off DRIVE MOTOR ; ;------------------------------------------------------------------ ; 4/20/2001 JESSE GORDON ; LIST P=16C84 INCLUDE "P16C84.INC" COMST EQU 3 ;bits to be used on COMSTAT. "All bits sent" COMSS EQU 4 ;"Has started start bit" COMRP EQU 5 ;receive in proggress. ;COMR EQU 6 ;receive done <-- outdated: USE GENSTAT,GENR instead COMB EQU 7 ;set this to tell it to send the byte that is in BYTEOUT. Also, this stays set till the byte is all sent. so check to make sure this is low before writing to BYTEOUT. GENSD EQU 7 ;send was dropped to take an incoming byte GENR EQU 6 ;Receive done, byte ready.. DETECTRP EQU 7 ;DETECT IF DEVICE WAS RESET OR POWERED UP.. MOTCENT EQU 6 ;'MOTOR CENTER REQUEST' FLAG PRESCALERVALUE EQU 0x08 ;MOTOR POSITION PRESCALER ONESECONDTIMERPRELOAD EQU .10 ;COUNTER VALUE FOR THE ONE SECOND TIMER TENTHSECONDTIMERPRELOAD EQU 0x78 ;COUNTER VAL FOR THE TENTH SECOND TIMER SEEKACTIVE EQU 5 ;GENSTAT BIT. 1= DO SEEK MOTOR TO FOLLOW MOTORSEEK. 0 IS NOT TO FOLLOW. BELLON EQU 4 ;TOO BEEP OR NOT TO BEEP. (IF SET, BUZZER RUNS) GENWFR EQU 3 ;TOO WAIT OR NOT TO WAIT: CAUSES BLOCKINGPRINT TO NOT PRINT UNTIL A BYTE HAS BEEN RECEIVED. RCVACTIVE EQU 2 ;TO RECEIVE OR NOT TO RECEIVE.. PBSCRATCH EQU 0x0C ;PORTB scratch pad, for using as a temp when working with port B SCRATCH EQU 0x0D ;scratchpad W_TEMP EQU 0x0E ;where ISR (int sub rut) saves W register STATUS_TEMP EQU 0x0F ;where ISR saves STATUS register SCRATCH2 EQU 0x10 ;another gen purp reg TIMELEFT EQU 0x11 ;holds the value that is loaded into TMR0 every time the int on TMR0 overlow happens, this is where we adjust the frequency. INTTEMP EQU 0x12 ;temp var for usein the ISR COMSTAT EQU 0x13 ;Communication Status register. bits 0-3 count ; how many bits have been sent. 3 (COMST) also is the "all bits sent" flag. ; if both 3 and 0 are set, then stopbit has been sent and the whole byte ; send process is over. bit 4 (COMSS) means start bit set(started). ; bit 7 (COMB) set when send is in progress, and also, after loading ; byte to be sent into BYTEOUT, then you set COMSTAT,COMB and it then ; starts sending, and when its done with that byte it clears COMB. ; NOTE: the above was a long line that caused mpalc to not work BYTEIN EQU 0x14 ;var to hold received byte BYTEOUT EQU 0x15 ;var to hold byte to be sent. note that the data in BYTEOUT is right shifted 8 times durring transmit, so should be write only, because data will be currupted after a send. BYTEOUTTEMP EQU 0x16 ;var to hold byte while sending.. this one gets corrupted instead of BYTEOUT. GENSTAT EQU 0x17 ;GENERAL STATUS: HOLDS DIFFERENT BITS.. BYTEINTEMP EQU 0x18 ;TEMP FOR INBYTE, SO WE CAN READ THE LAST BYTE UP TILL THE VERY MOMENT THE NEW ONE IS READY DETECTRPREG EQU 0x19 ;TO SEE IF DEVICE WAS RESET OR POWERED UP. MOTORPOS EQU 0x1A ;CURRENT POSITION OF MOTOR MOTORSEEK EQU 0x1B ;DESIRED MOTOR POSITION MOTORSTAT EQU 0x1C ;MOTOR STATUS BITS PORTBCOMP EQU 0x1D ;SNAPSHOT RAM FOR PORTB4:7 PIN CHANGE COMPARISION (FIND OUT WHICH PIN WAS CHANGED) MOTORTIMEOUTLOW EQU 0x1E ;COUNTER FOR FIRST 8 BITS OF MOTOR MAX TIME COUNTER MOTORTIMEOUTHIGH EQU 0x1F ;COUNTER FOR LAST 8 BITS MOTORPRESCALER EQU 0x20 MOTORSEEK2 EQU 0x21 ; DRIVETIME EQU 0x22 ;HOW MANY TENTHS OF A SECOND LEFT TO RUN THE DRIVE TENTHSECONDTIMER EQU 0x23 ;COUNTER TO COUNT DOWN TILL THE NEXT TENTH OF A SECOND ONESECONDTIMER EQU 0x24 ;COUNTER TO COUNT DOWN TILL NEXT SECOND ODLOW EQU 0x25 ; ODOMOTER (EACH COUNT IS TWO INCHES) ODHIGH EQU 0x26 ; ODOMOTER ERRORREG EQU 0x27 ;REG TO HOLD ERROR CODE ON A FORCED RESET PAHSCRATCH EQU 0x28 ;Print As Hex SCRATCH PABSCRATCH EQU 0x29 ;Print As Binary SCRATCH HONKTIME EQU 0x2A ;TIME LEFT TO HONK BYTEIN2 EQU 0x2B ;THE SECOND BYTEIN, TO COMPARE WITH BYTEIN.. REDLEDTTL EQU 0x2C ;TIME TO LIVE FOR RED LED BLUELEDTTL EQU 0x2D ;TTL FOR BLUE ORG 0 ;the beginging.. GOTO INIT ;go right to where out main init code is.. ORG 4 ;START OF ISR (int sub rutine) THAT IS CALLED 2400 TIMES A SEC, ;WHEN TMR0 OVERFLOWS AND ALSO WHEN RB0 IS TRIPPED, ;IF AND WHEN ITS A SERIAL INPUT LINE. ;NEED TO SAVE W AND STATUS FIRST.. SWAPF DOES NOT AFFECT ANY FLAGS MOVWF W_TEMP ; Copy W to TEMP register, ;MOVWF doesnt change any flags either,.. SWAPF STATUS,W ; Swap status to be saved into W MOVWF STATUS_TEMP ; Save status to STATUS_TEMP register MOVFW TIMELEFT BTFSS INTCON,RBIF ;IF PB47 IS NOT ACTIVE THEN: GOTO COMCODE ;GO TO THE SEND/RECEIVE STUFF.. ;ELSE DO THE PB47 STUFF, THEN EXIT ISR ;----------------------- START OF PORT B PINS 4:7 CHANGE INT CODE ----------- NOP ;THE PB47 STUFF.. MOVFW PORTB ;LOAD PORTB ANDLW B'11110000' ;MASK OUT THE 4 LOWER BITS XORWF PORTBCOMP,F ;XOR WITH UPPER FOUR BITS FROM LAST TIME, SAVE IN PORTBCOMP ;PORTCOMP SHOULD NOW HAVE ONLY BITS 4:7 SET, DEPENDING ON WHICH PIN CHANGED STATES. BTFSS PORTBCOMP,5 ;IF SERVO FEEDBACK CHANGED THEN GOTO PB5END ;(IF NOT, SKIP) BUT OTHERWISE: BTFSS MOTORSTAT,MOTCENT ;IF CENTER REQUEST IS SET THEN: GOTO PB5A1 ;(IF NOT, SKIP) OTHERWISE: BCF PORTA,2 ;TURN OFF BCF PORTA,3 ;SERVO BTFSC PORTB,5 ;IF SERVO IS RIGHT OF CENTER THEN: GOTO PB5A1 ;SET MOTORPOS TO 128, CLR CNTR RQST ELSE: BSF PORTA,3 ;SET MOTOR TO RUN TORWARDS RIGHT OF CENTER. GOTO PB5A2 ;AND SET MOTORPOS TO 128 BUT DONT CLR CNTR RQST PB5A1 BCF MOTORSTAT,MOTCENT ;SIGNAL THAT CENTER IS DONE BSF GENSTAT,SEEKACTIVE ;ENABLE SEEK ACTIVE PB5A2 CLRF MOTORPOS ;NOW THAT THE MOTOR HAS PASSED CENTER, BSF MOTORPOS,7 ;SET MOTOR POS TO 128 (RIGHT OF CENTER) CLRF MOTORPRESCALER ;AND CLEAR PRESCALER... INCF MOTORPRESCALER ;(WE GOTTA LEAVE PRESCALER READY TO TAKE A DECF AND STILL NOT BE LESS THEN 0) PB5END NOP ; BTFSS PORTBCOMP,4 ;IF OD HAS CHANGED GOTO PB6END ;(IF NOT, SKIP.) OTHERWISE: INCF ODLOW ;BUMP THE ODOMOTER BTFSC STATUS,Z ;IF FIRST 8 BITS ROLL OVER THEN INCF ODHIGH ;INC LAST 8 BITS ; MOVLW 0x44 ;'D' ; MOVWF BYTEOUT ; BSF COMSTAT,COMB ; BCF PORTB,3 BTFSC PORTB,4 BSF PORTB,3 PB6END NOP PB47A1END NOP MOVFW PORTB ;READ PORTB SO WE CAN BCF INTCON,RBIF ;CLEAR THE RBIF FLAG MOVFW PORTB ;LOAD THE PORTB 4:7 VALUES FOR NEXT COMPARE ANDLW B'11110000' ;AND THEM SO WE ONLY GET THE UPPER FOUR MOVWF PORTBCOMP ;SAVE TO THE COMPARE REGISTER.. ENDOFPB47 GOTO INTENDPB47 ;-------------------- END OF PB47 CODE -------------------- ;-------------------- START OF COM/TIMER CODE ---------------- COMCODE NOP MOVWF TMR0 ;LOAD TIMER WITH NEW DELEY ;-------------------- START OF MOTOR POS CALCULATING CODE ------ ; Some notes about why we have to DECF on MOTORPRESCALER when we load it with ; full value or why we have to INCF it when we clear it.: ; We need to always leave it ready to INCF or DECF, without it ever going over ; the prescaler value or less then 0 (would roll over to 0xFF). ; So by never leaving it more then one less the preload value, ; it can always be INCF'd and not be higher then preload value, ; and it can always be DECF'd and not be lower then 0. BTFSS PORTA,3 ;IF MOTOR IS TURNING RIGHT THEN GOTO MPC1A ;(IF NOT SKIP, OTHERWISE) MOVFW MOTORPOS ;SEE IF MOTORPOS IS ALREADY 0xFF XORLW 0xFF BTFSC STATUS,Z ;IF MATCHES 0xFF THEN GOTO MPC1A ;SKIP THIS PART.. MOVLW B'01111111' ;If servo is moving from left to right, torwards XORWF MOTORPOS,W ;right of center, but is still left of center, but MOTORPOS is about to roll over to right of center while servo has not yet reached right of center, we dont want to INCF motorpos. BTFSC STATUS,Z ;IF MOTORPOS IS NOT 127 THEN CONTINUE.. BTFSC PORTB,5 ;IF SERVO IS RIGHT OF CENTER, THEN CONTINUE.. GOTO MPC1B ;CONTINUE.. GOTO MPC1A ;MOTORPOS IS 127 AND SERVO IS STILL TO THE LEFT OF CENTER, SO WE DONT INCF ON MOTORPOS.. MPC1B INCF MOTORPRESCALER ;INC THE LOW FEW BITS OF THE MOTOR POSITION COUNTER SYSTEM (MOTORPRESCALER) MOVFW MOTORPRESCALER ;LOAD CURRENT PRESCALER COUNT INTO W XORLW PRESCALERVALUE ;SEE IF PRESCALER HAS REACHED THE RIGHT NUMBER BTFSS STATUS,Z ;IF PRESCALER HAS REACHED SET VALUE, THEN: GOTO MPC1A ;(IF NOT THEN SKIP, ELSE:) CLRF MOTORPRESCALER ;CLEAR THE PRESCALER INCF MOTORPRESCALER INCF MOTORPOS ;INC MOTORPOS... AND MOVFW MOTORPOS ;CHECK IF MOTORPOS HAS REACHED 0xFF XORLW 0xFF ; BTFSS STATUS,Z ;IF MOTORPOS IS 0xFF, THEN: GOTO MPC1A ;(IF NOT, THEN SKIP, ELSE:) BCF PORTA,3 ;TURN OFF SERVO BCF PORTA,2 ; MPC1A NOP BTFSS PORTA,2 ;IF MOTOR IS TURNING LEFT GOTO MPC2A ;(IF NOT SKIP, OTHERWISE) MOVFW MOTORPOS ;MAKE SURE MOTORPOS ISN'T ALREADY TO 0 XORLW 0 ;IF IT IS, JUST SKIP THIS PART. BTFSC STATUS,Z ;SEE IF IT MATCHED 0... GOTO MPC2A ;SO LETS SKIP.. MOVLW B'10000001' ;IF MOTORPOS IS ABOUT TO SAY LEFT OF CENTER, BUT XORWF MOTORPOS,W ;SERVO IS STIL RIGHT OF CENTER, THEN BTFSC STATUS,Z ;(IS ABOUT TO READ LEFT OF CENT) BTFSS PORTB,5 ;(IS RIGHT OF CENTER) GOTO MPC2B ;THEN SKIP.... GOTO MPC2A ;ELSE CONTINUE... MPC2B DECF MOTORPRESCALER ;DEC THE LOW FEW BITS OF THE MOTOR POSITION COUNTER SYSTEM (MOTORPRESCALER) BTFSS STATUS,Z ;IF PRESCALER HAS GONE DOWN TO 0 THEN: GOTO MPC2A ;(IF NOT THEN SKIP, ELSE:) MOVLW PRESCALERVALUE ;GET PRESCALER VALUE AND MOVWF MOTORPRESCALER ;SAVE IT TO THE PRESCALER DECF MOTORPRESCALER ;(PRESCALER -1, THAT IS......) DECF MOTORPOS ;DEC MOTORPOS... AND BTFSS STATUS,Z ;IF MOTORPOS HAS GONE DOWN TO 0 THEN: GOTO MPC2A ;(IF NOT, THEN SKIP, ELSE:) BCF PORTA,3 ;TURN OFF SERVO BCF PORTA,2 ; MPC2A NOP MPCEND NOP ;------------------ END OF MOTOR POS CALC CODE ----------- ;----------------- START OF MOTORPOS FOLLOWING MOTORSEEK CODE (FMx[xxxxxx]) --------- BTFSS GENSTAT,SEEKACTIVE GOTO FMEND MOVFW MOTORPOS SUBWF MOTORSEEK,W ;IF MOTORSEEK MINUS MOTORPOS IS: BTFSC STATUS,Z ;IS ZERO THEN GOTO FMSTOP ;GOTO FMISZERO WHERE WE STOP THE SERVO, ELSE: BTFSC STATUS,C ;IS CARRY/BARROW THEN GOTO FMTR ;TURN RIGHT, ELSE FMTL BSF PORTA,2 ;TURN LEFT BCF PORTA,3 ; GOTO FMEND ; FMSTOP BCF PORTA,2 ;TURN OFF MOTOR BCF PORTA,3 GOTO FMEND FMTR BSF PORTA,3 ;START TURNNING RIGHT... BCF PORTA,2 FMEND NOP ;------------------ END OF MOTORPOS FOLLOWING MOTORSEEK CODE ------- ;------------------- SERVO TIMEOUT CODE ------------------- BTFSC PORTA,2 ;IF SERVO IS GOING ONE DIRECTION THEN GOTO MTOA ;GOTO TIMEOUT SUB BTFSC PORTA,3 ;IF SERVO IS GOIN OTHER DIRECTION THEN GOTO MTOA ;GOTO TIMEOUT SUB ELSE CLRF MOTORTIMEOUTLOW ;CLEAR OUT THE COUNTERS CLRF MOTORTIMEOUTHIGH ; GOTO MTOEND ;MOTOR IS NOT ACTIVE... SKIP TIMEOUT SUB MTOA NOP INCF MOTORTIMEOUTLOW ;INC THE LOW COUNTER.. BTFSC STATUS,Z ;IF LOW COUNTER ROLLS OVER, THEN INCF MOTORTIMEOUTHIGH ;INC THE HIGH BYTE BTFSS MOTORTIMEOUTHIGH,4 ;CHECK IF MAX COUNT HAS BEEN REACHED GOTO MTOEND ;NO TIMEOUT YET.. SKIP BCF PORTA,2 ;TURN OFF BCF PORTA,3 ;THE SURVO MOVFW MOTORPOS ;GET THE MOTORPOS AND MOVWF MOTORSEEK ;SAVE IT TO MOTORSEEK SO IT STOPS TRYING TO MOVE.. CLRF MOTORTIMEOUTLOW ;CLEAR THE TIMEOUT REG CLRF MOTORTIMEOUTHIGH ;CLEAR THE TIMEOUT REG CLRF COMSTAT ;TEMP CODE TO MOVLW 0x54 ;PRINT 'T' IF MOVWF BYTEOUT ;MOTOR TIMEOUT BSF COMSTAT,COMB ;HAPPENS. MTOEND NOP ;------------------ END OF SERVO TIMEOUT CODE --------------- ;---------------- TOGGLE PORTA,4 TO BEEP SPEAKER ------------------------ BTFSS INTCON,T0IF ;CHECK IF THIS WAS TIMER TRIPPED GOTO PA4TIC ;NOPE.. SKIP.. BTFSC PORTA,4 ;TOGGLE PORTA,4 ON AND OFF GOTO PA4TIS ;SO WE KNOW HOW FAST THE INT IS HAPPENING. BSF PORTA,4 ;NO POWER TO SPEAKER (TOGGLE SPEAKER) GOTO PA4TIC ; PA4TIS BTFSC GENSTAT,BELLON ;IF BELLON IS SET THEN BCF PORTA,4 ;GIVE POWER TO SPEAKER PA4TIC NOP ;END OF TOGGLE CODE ;-----------------END OF TOGGLE PORTA,0 CODE------------------ ;---------------- RECEIVING THE BITS.. ------------------- BTFSC INTCON,T0IF ;SKIP THIS IF TIMER DIDNT RUN OUT BTFSS COMSTAT,COMRP ;SEE IF RECEIVE IS IN PROGRESS.. GOTO ENDOFRECEIVE ;NOPE.. SO SKIP.. ELSE: BTFSS COMSTAT,COMSS ;CHECK IF STARTBIT HAS BEEN RECEIVED.. GOTO ENDOFRECEIVE ;NOT SET, SKIP... (ACTUALLY, THIS IS REDUNDANT) ;-----CHECK FOR LAST BIT SENT---- BTFSS COMSTAT,COMST ;Check to see if last bit was sent last time.. GOTO SENDNEXTBIT ;More to send.. Do that.. NOP ;Okay.. time to clean up after send is done.. stop bit should be happening now BCF PORTB,3 ;jesseg temp BCF INTCON,INTF ;CLEAR THE 'HAPPENED' BIT BTFSC GENSTAT,RCVACTIVE ;IF RECEIVE ACTIVE IS SET THEN BSF INTCON,INTE ;ENABLE INT ON RISING EDGEOF RB0 MOVFW BYTEINTEMP ;LOAD THE NEW BYTE MOVWF BYTEIN ;SAVE IT TO BYTEIN... BSF GENSTAT,GENR ;SET "byte received -- done" CLRF COMSTAT ;CLEAR COMSTAT... BTFSS PORTB,0 ;SEE IF STOPBIT IS LOW LIKE IT SHOULD BE.. GOTO RCV801 ;YES, IS LOW.. CONTINUE MOVLW 0x5A ;'Z' MOVLW BYTEOUT ;SAVE Z TO SHOW STOP BIT WAS BAD BSF COMSTAT,COMB ;START SEND GOTO ENDOFRECEIVE RCV801 NOP BTFSS GENSTAT,GENSD ;CHECK TO SEE IF A SEND WAS CANCLED.. GOTO ENDOFRECEIVE ;NOPE.,.. SO NOW SHOULD BE ALL DONE WITH XCV MOVLW 0x58 ;'X' TO INDICATE A BYTE WAS LOST... MOVWF BYTEOUT ;SEE LINE ABOVE. BOTH ARE TEMP BSF COMSTAT,COMB ;GIVE THE SIGNAL TO START SENDING THE POSTPONED BYTE.. BCF GENSTAT,GENSD ;SET FALSE TO "CANCLED BYTE WAITING TO BE SENT" GOTO ENDOFRECEIVE ;ALL DONE RECEIVING.. SENDNEXTBIT NOP RRF BYTEINTEMP ;PREPARE VAR FOR NEXT BIT TO BE SAVED BTFSS PORTB,0 ;SEE IF INPUT IS HI OR LOW GOTO RCV001 ; COPY THE INVERSED BIT BCF BYTEINTEMP,7 ; FROM PORTB,0 TO BYTEINTEMP,0 GOTO RCV002 ; RCV001 BSF BYTEINTEMP,7 ; RCV002 NOP ; DONE WITH BIT COPY INCF COMSTAT,F ;RECORD THAT WE'VE SAVED ANOTHER BIT BTFSS PORTB,3 ;TEMP CODE TO TOGLE SPEAKER OUT GOTO RCV901 ; WHEN A BIT IS RECEIVED. BCF PORTB,3 GOTO RCV902 RCV901 BSF PORTB,3 RCV902 NOP ENDOFRECEIVE NOP ;---------------- CHECK FOR RISING EDGE ON PB0 ----------------------- ; Disabling PB0/INT interrupt only causes int to not happen on PB0 ; rising edge.. the FLAG still gets set,when pb0 goes high! ; thats why we need to check here if receive is already started PB0INTCHECK NOP BTFSS GENSTAT,RCVACTIVE ;ONLY DO THIS PART IF RECEIVE ACTIVE BIT IS SET GOTO ENDOFINTB BTFSS INTCON,INTF ;CHECK TO SEE IF INTB WAS TRIPPED.. GOTO ENDOFINTB ;NO, SO SKIP BTFSC COMSTAT,COMRP ; NO NEED TO BE HERE DURRING RECEIVE GOTO ENDOFINTB BTFSC COMSTAT,COMB ;SEE IF SEND WAS HAPPENING BSF GENSTAT,GENSD ;RECORD THAT A SEND WAS DROPPED FOR RCV CLRF COMSTAT ;ERASE ANY INFO LEFT FROM SEND BSF COMSTAT,COMRP ;SET RECEIVE IN PROGRESS BSF COMSTAT,COMB ;SET COM TO BUISY, SO PROGRAMS KNOW NOT TO SEND. BCF INTCON,INTE ;DISABLE INT PB0 TILL RECEIVE IS DONE BSF COMSTAT,COMSS ;SET "HAS RECEIVED START BIT" BCF PORTA,1 ;TURN OFF THE SERIAL OUTPUT CLRF TMR0 ;CAUSE TIMER TO TRIP IN 1.25 TIMES THE NORMAL TIME, ONCE..(SO WE'RE FOR SURE INTHE BIT, WHERE WE CAN READ IT) BSF PORTB,3 ;temp jesseg ENDOFINTB NOP ;NOW WE SHOULD BE READY TO READ FIRST BIT, NEXTTIME ;-------------------------- END OF RECEIVE CODE ------------------- ;-------------------------- SEND BYTE CODE STARTS HERE ---------------------------------------------------- BTFSS INTCON,T0IF ;IF NOT TIMER THEN GOTO ENDBYTESEND ;DONT SEND A BIT BTFSS COMSTAT,COMRP ;DONT SEND A BYTE IF REVEICE IS IN PROGRESS.. JUST WAIT.. BTFSS COMSTAT,COMB ;SEE IF SEND/RCV (COMB) IS ACTIVE(SET) GOTO ENDBYTESEND ;NO, SO SKIP SENDING.. BTFSC COMSTAT,COMST ;CHECK IF Last data bit has been sent.. GOTO SENDBYTEALLDONE ;YES; So go check to see if start bit has been started and or stopped. BYTESENDBEGING NOP BTFSC COMSTAT,COMSS ;ACTIVE. CHECK IF THE START BIT HAS BEEN SENT. GOTO DONTSETSB ;START BIT IS ALREADY SET. BSF COMSTAT,COMSS ;RECORD THAT WE'VE SENT THE STARTBIT BSF PORTA,1 ;START THE START BIT... BCF COMSTAT,0 ; CLEAR THE BITS SENT COUNTER.. BCF COMSTAT,1 BCF COMSTAT,2 MOVFW BYTEOUT ; MOVWF BYTEOUTTEMP ; GOTO ENDBYTESEND ;NOTHING ELSE TO DO TILL THE STARTBIT IS DONE DONTSETSB NOP ;Lets send the next bit.. BTFSS BYTEOUTTEMP,0 ;SINCE RS232 IS IVERTED, LOW=1 AND HIGH=0 GOTO INTTEMP1IS0 ;WE LOAD THE BIT FROM THE BYTEOUTTEMP THEN BCF PORTA,1 ;INVERT ITS VALUE AND PUT IT ON THE RS232 GOTO INTTEMP1IS1 ;OUTPUT PIN. INTTEMP1IS0 BSF PORTA,1 INTTEMP1IS1 NOP INCF COMSTAT ;RECORD WHAT BIT WE JUST SENT..When last byte ; is sent, it INCs COMSTAT from xxxx0111 to xxxx1000, ; and since bit 3 is the ALL BITS SENT flag, it ; automatically gets set. When ALL BITS SENT ; and COMSTAT,0 are both set, then every thing ; is done. RRF BYTEOUTTEMP,F ;GET NEXT BIT READY TO SEND.. GOTO ENDBYTESEND SENDBYTEALLDONE NOP BTFSS COMSTAT,0 ;Check if start bit has been started... GOTO STARTSTOPBIT ;No, so go start it.. CLRF COMSTAT ;Yes, so clear the comstat reg, which sets it all ready to send another byte GOTO ENDBYTESEND ;Byte all sent.. ready for next.. STARTSTOPBIT NOP BCF PORTA,1 ;START STOP BIT.. INCF COMSTAT ;TO SHOW THAT THE STOP BIT HAS BEEN STARTED. ENDBYTESEND NOP ;------------ END OF SEND BYTE CODE ------------------- ;------------ START OF TENTH SECOND CODE ----------- DECFSZ TENTHSECONDTIMER ;DEC F, SKIP IF ZERO GOTO TENTHSECONDTIMEREND ;HASNT RUN OUT, SKIP.. MOVLW TENTHSECONDTIMERPRELOAD ; MOVWF TENTHSECONDTIMER ; GET READY FOR NEXT TENTH SECOND MOVFW DRIVETIME ;LOAD DRIVETIME (TENTHS OF A SECOND LEFT TO RUN) BTFSC STATUS,Z ;IF IS ZERO, STOP MOTOR BSF PORTB,1 ;TURN OFF DRIVE MOTOR BTFSC STATUS,Z ;IF IS ZERO THEN GOTO DRIVETIMEEND ;END THIS.. ELSE: BCF PORTB,1 ;TURN ON MOTOR DECF DRIVETIME BTFSC STATUS,Z ; IF WE JUST REACHED 0, THEN BSF PORTB,1 ;TURN OFF MOTOR DRIVETIMEEND NOP MOVFW REDLEDTTL ;LOAD VALUE BTFSC STATUS,Z ;IF ZERO GOTO REDLEDTTLEND ;SKIP. ELSE DECF REDLEDTTL ;DEC IT, BTFSC STATUS,Z ;IF NOW ZERO THEN BCF PORTB,2 ;TURN OFF RED LED REDLEDTTLEND MOVFW BLUELEDTTL ;LOAD VALUE BTFSS STATUS,Z ;IF ZERO GOTO BLUELEDTTLEND ;SKIP. ELSE DECF BLUELEDTTL ;DEC IT, BTFSC STATUS,Z ;IF NOW ZERO THEN BCF PORTB,3 ;TURN OFF BLUE LED BLUELEDTTLEND MOVFW HONKTIME BTFSC STATUS,Z ;IF ZERO THEN BCF GENSTAT,BELLON ;TURN OFF BELL BTFSC STATUS,Z ;IF NOT ZERO THEN GOTO HONKTIMEEND ;SKIP ELSE BSF GENSTAT,BELLON ;TURN ON BELL DECF HONKTIME BTFSC STATUS,Z ;IF JUST REACHED 0 THEN BCF GENSTAT,BELLON ;TURN BELL OFF HONKTIMEEND NOP ;------------- START OF ONE SECOND CODE ----------- DECFSZ ONESECONDTIMER ;DEC F, SKIP IF ZERO.. GOTO ONESECONDTIMEREND ;HASN'T RUN OUT.. MOVLW ONESECONDTIMERPRELOAD MOVWF ONESECONDTIMER ;GET READY FOR NEXT SECOND.. BCF PORTB,3 ;TURN OFF BLUE led IF STILL ON.. ; BTFSS PORTA,1 ;TOGGLE PORTA,1 ON AND OFF ; GOTO OSTTEMP0IS0 ;SO WE KNOW HOW FAST THE ONE SECOND TIMER IS HAPPENING.. ; BCF PORTA,1 ;part of toggle code.., ; GOTO OSTTEMP0IS1 ;part of toggle code.. ;OSTTEMP0IS0 BSF PORTA,1 ;part of toggle code.. ;OSTTEMP0IS1 NOP ;END OF TOGGLE CODE ONESECONDTIMEREND NOP ;-------------- END OF ONE SECOND CODE ------------ TENTHSECONDTIMEREND NOP ;------------- END OF TENTH SECOND CODE ----------- ; START RESTORE INTEND BCF INTCON,T0IF ;CLEAR THE OVERFLOW INT FLAG FOR TIMER0 INTENDPB47 NOP ;ENTRY POINT FOR PORT B 4:7 PIN CHANGE RETURN SWAPF STATUS_TEMP,W ; Swap nibbles in STATUS_TEMP register MOVWF STATUS ; Move W into STATUS register SWAPF W_TEMP,F ; Swap nibbles in W_TEMP and place result in W_TEMP SWAPF W_TEMP,W ; Swap nibbles in W_TEMP and place result into W RETFIE ;SHOULD AUTOMATCIALLY RE ENABLE GIE BIT.. INIT CLRWDT CLRF HONKTIME MOVLW TENTHSECONDTIMERPRELOAD MOVWF TENTHSECONDTIMER MOVLW ONESECONDTIMERPRELOAD MOVWF ONESECONDTIMER CLRF DRIVETIME CLRF MOTORTIMEOUTLOW CLRF MOTORTIMEOUTHIGH CLRF MOTORPRESCALER CLRF MOTORPOS BSF MOTORPOS,7 CLRF MOTORSEEK BSF MOTORSEEK,7 CLRF MOTORSEEK2 BSF MOTORSEEK2,7 CLRF GENSTAT BCF GENSTAT,GENWFR CLRF PORTA BSF PORTA,4 ;TURN OFF SPEAKER.. CLRF PORTB BSF PORTB,1 ;TURN OF MOTOR... CLRF COMSTAT CLRF BYTEIN CLRF BYTEOUT CLRF BYTEOUTTEMP CLRF BYTEINTEMP CLRF INTTEMP ; MOVLW OX4A ; This is for 2400baud with a 3.579545 xtal ; MOVLW 0X34 ; This is for 2400baud with a 4.000 Mhz xtal ; MOVLW 0x1A ; This is for 2400baud with a 4.5 Mhz xtal ; MOVLW 0x36 ; LAST VALUE FOR 2400 @ 4.000MHZ. NOW WE GOTTA SWITCH TO 1200.. MOVLW 0x33 MOVWF TIMELEFT MOVWF TMR0 BSF STATUS,RP0 ;SELECT BANK 1 BCF OPTION_REG,PSA ;SET PRESCALER FOR TIMER0 BCF OPTION_REG,T0CS ;SET TIMER0 TO RUN ON OSC/4. SEEMS TO RUN AT OSC.. DO THE MATH.. BCF OPTION_REG,PS2 ;SET PRESCALER TO 010 FOR 1:8 BCF OPTION_REG,PS1 ; ^^^^^^^^ BSF OPTION_REG,PS0 ; ^^^^^^^^ CLRF INTCON ;DISABLE ALL INTERRUPS BSF INTCON,T0IE ;ENABLE INT ON TIMER0 OVERFLOW BSF OPTION_REG,INTEDG ;SET INT/PB0 INT TO RISING EDGE BCF INTCON,INTE ;DISABLE INT ON PB0 RISING EDGE BSF INTCON,RBIE ;ENABLE PB4:7 PIN CHANGE INT BSF INTCON,GIE ;ENABLE GLOBAL INTS MOVLW B'11110001' MOVWF TRISB ;SET PORTB I/O MOVLW B'11100000' MOVWF TRISA ;SET PORTA I/O BCF STATUS,RP0 ;SELECT BANK0 CLRF PBSCRATCH CLRF SCRATCH CLRF SCRATCH2 BSF GENSTAT,SEEKACTIVE ;ENABLE SERVO TO SEEK AFTER MOTORSEEK BSF GENSTAT,BELLON ;START TO BEEP WHILE PRINTING RESET OR POWER STARTUPSTRING ;PRINT A FEW EXTRA CHARS TO GET THE RECEIVER ADJUSTED.. MOVLW .10 MOVWF SCRATCH STRTPST MOVLW '@' CALL BLOCKINGPRINT MOVLW '@' CALL BLOCKINGPRINT MOVLW '@' CALL BLOCKINGPRINT MOVLW '@' CALL BLOCKINGPRINT CALL NEWLINE MOVWF SCRATCH2 DECF SCRATCH BTFSS STATUS,Z GOTO STRTPST CALL NEWLINE CALL NEWLINE BTFSC DETECTRPREG,DETECTRP GOTO DETECTRESETPOWER CALL NEWLINE MOVLW 0x52 ;R CALL BLOCKINGPRINT MOVLW 0x45 ;E CALL BLOCKINGPRINT MOVLW 0x53 ;S CALL BLOCKINGPRINT MOVLW 0x45 ;E CALL BLOCKINGPRINT MOVLW 0x54 ;T CALL BLOCKINGPRINT MOVLW 0x20 CALL BLOCKINGPRINT ;' ' MOVFW ERRORREG CALL PRINTASHEX CALL NEWLINE CLRF ERRORREG GOTO ENDDETECTRESET DETECTRESETPOWER NOP CALL NEWLINE MOVLW 0x50 ;P CALL BLOCKINGPRINT MOVLW 0x4F ;O CALL BLOCKINGPRINT MOVLW 0x57 ;W CALL BLOCKINGPRINT MOVLW 0x45 ;E CALL BLOCKINGPRINT MOVLW 0x52 ;R CALL BLOCKINGPRINT CALL NEWLINE CLRF ERRORREG CLRF ODLOW CLRF ODHIGH ENDDETECTRESET NOP BCF DETECTRPREG,DETECTRP ;RECORD THAT WE HAVE BEEN TURNED ON.. BCF GENSTAT,BELLON ;TURN OFF BUZZER BSF PORTA,4 ;TURN OFF POWER TO SPEAKER GOTO STARTBINARYMODE LOOP CLRWDT BTFSS GENSTAT,GENR ;SEE IF NEW BYTE IS READY GOTO LOOP ;NOPE.. KEEP CHECKING.. BCF GENSTAT,GENR ;**TEMP** SO IT ONLY SENDS NEW BYTES.. MOVLW "O" ;THE NOP PART.. YOU CAN SEND LOTS OF O'S AND NOTHING HAPPENS, BUT IT KEEPS THE RECEIVER ADJUSTED.. I HOPE ANYWAY,.... XORWF BYTEIN,W BTFSC STATUS,Z GOTO LOOP MOVFW BYTEIN ;LOAD THE NEW INPUT BYTE XORLW 0x43 ;SEE IF IT'S 'C' BTFSS STATUS,Z;SEE IF THE RESULT WAS 0 GOTO LOOPC BCF GENSTAT,SEEKACTIVE ;TURN OFF AUTO SEEK... BSF MOTORSTAT,MOTCENT ;REQUEST THE MOTOR TO BE CENTERED. BCF PORTA,2 ;TURN OFF BCF PORTA,3 ;SERVO BTFSS PORTB,5 ;SEE IF SERVO IS RIGHT OR LEFT GOTO LOOPC1 BSF PORTA,2 ;TURN ONE WAY GOTO LOOPC LOOPC1 BSF PORTA,3 ;TURN OTHER LOOPC NOP MOVLW B'11111100' ANDWF BYTEIN,W XORLW B'00110000' BTFSS STATUS,Z GOTO LOOPB BCF PORTA,2 BCF PORTA,3 BTFSC BYTEIN,0 BSF PORTA,3 BTFSC BYTEIN,1 BSF PORTA,2 LOOPB NOP MOVFW BYTEIN XORLW 0x53 ;'S' BTFSS STATUS,Z GOTO LOOPB2B CALL NEWLINE MOVFW MOTORPOS CALL PRINTASHEX MOVFW MOTORPOS CALL PRINTASBINARY CALL NEWLINE GOTO LOOP LOOPB2B NOP MOVFW BYTEIN XORLW 0x4F ;'O' TO SHOW ODOMETER READING BTFSS STATUS,Z GOTO ODSHOWEND CALL NEWLINE MOVLW 0x4F CALL BLOCKINGPRINT MOVLW 0x44 CALL BLOCKINGPRINT MOVLW 0x20 CALL BLOCKINGPRINT MOVFW ODHIGH CALL PRINTASHEX MOVFW ODLOW CALL PRINTASHEX CALL NEWLINE GOTO LOOP ODSHOWEND NOP MOVFW BYTEIN XORLW 0x4D ;'M' BTFSS STATUS,Z GOTO LOOPB2C CALL NEWLINE MOVLW 0x3E ;'>' CALL BLOCKINGPRINT LOOPB2BA CLRWDT BTFSS GENSTAT,GENR GOTO LOOPB2BA BCF GENSTAT,GENR MOVFW BYTEIN MOVWF MOTORSEEK CALL PRINTASHEX MOVFW MOTORSEEK CALL PRINTASBINARY CALL NEWLINE GOTO LOOP LOOPB2C NOP MOVLW 0x45 ;'E' TURN ON AND OFF SEEK ACTIVE XORWF BYTEIN,W BTFSC STATUS,Z BSF GENSTAT,SEEKACTIVE MOVLW 0x65 ;'e' XORWF BYTEIN,W BTFSC STATUS,Z BCF GENSTAT,SEEKACTIVE MOVLW 0x50 ;'P' TEMP CODE: XORWF BYTEIN,W ;ADD OR SUBTRACT 15 (0xF) FROM MOTORSEEK. BTFSS STATUS,Z ;THIS COULD CAUSE ALL SORTS OF TROUBLE GOTO LOOPB2DD ;BUT SHOULD BE ACTIVATED BY P AND p MOVLW 0XF ADDWF MOTORSEEK2,F MOVFW MOTORSEEK2 MOVWF MOTORSEEK GOTO LOOPB2D LOOPB2DD NOP MOVLW 0x70 ;'p' MORE TEMP CODE LIKE ABOVE.. XORWF BYTEIN,W BTFSS STATUS,Z GOTO LOOPB2D MOVLW 0xF SUBWF MOTORSEEK2,F MOVFW MOTORSEEK2 MOVWF MOTORSEEK LOOPB2D NOP MOVLW "B" XORWF BYTEIN,W BTFSC STATUS,Z GOTO STARTBINARYMODE MOVLW 0x5B ;'[' CALL BLOCKINGPRINT MOVFW BYTEIN CALL BLOCKINGPRINT ; MOVLW 0x5D CALL BLOCKINGPRINT ;']' MOVFW BYTEIN CALL PRINTASHEX ; MOVFW BYTEIN ; CALL PRINTASBINARY MOVLW 0x44 ;'D' DRIVE ON AND OFF XORWF BYTEIN,W BTFSS STATUS,Z GOTO DRVOFFCHK MOVLW .20 MOVWF DRIVETIME DRVOFFCHK MOVLW 0x64 ;'d' XORWF BYTEIN,W BTFSC STATUS,Z CLRF DRIVETIME MOVLW 0x48 ;'H' HONK OR HORN XORWF BYTEIN,W BTFSS STATUS,Z GOTO HONKOFFCHECK MOVLW B'00000011' MOVWF HONKTIME HONKOFFCHECK MOVLW 0x68 ;'h' TURN OF HORN... XORWF BYTEIN,W BTFSC STATUS,Z CLRF HONKTIME MOVLW 0xFF ;FORCE WDT RESET, WITH ERROR CODE 0xFF MOVWF ERRORREG MOVLW 0x52 ;'R' FORCE WDT RESET XORWF BYTEIN,W BTFSC STATUS,Z LOOPRST GOTO LOOPRST GOTO LOOP ;----------- START OF BINARY MODE HANDLING CODE ---------- STARTBINARYMODE NOP CALL NEWLINE MOVLW "E" CALL BLOCKINGPRINT MOVLW "N" CALL BLOCKINGPRINT MOVLW "T" CALL BLOCKINGPRINT MOVLW "E" CALL BLOCKINGPRINT MOVLW "R" CALL BLOCKINGPRINT MOVLW "I" CALL BLOCKINGPRINT MOVLW "N" CALL BLOCKINGPRINT MOVLW "G" CALL BLOCKINGPRINT MOVLW " " CALL BLOCKINGPRINT MOVLW "B" CALL BLOCKINGPRINT MOVLW "I" CALL BLOCKINGPRINT MOVLW "N" CALL BLOCKINGPRINT MOVLW "A" CALL BLOCKINGPRINT MOVLW "R" CALL BLOCKINGPRINT MOVLW "Y" CALL BLOCKINGPRINT MOVLW " " CALL BLOCKINGPRINT MOVLW "M" CALL BLOCKINGPRINT MOVLW "O" CALL BLOCKINGPRINT MOVLW "D" CALL BLOCKINGPRINT MOVLW "E" CALL BLOCKINGPRINT CALL NEWLINE CALL NEWLINE BSF GENSTAT,RCVACTIVE ;ENABLE RECEIVING BSF INTCON,INTE ;ENABLE PB0 RISING EDGE ; BSF STATUS,RP0 ;SELECT BANK0 ; BCF INTCON,GIE ;DISABLE GLOBAL INTS ; BCF STATUS,RP0 ;SELECT BANK0 ; BCF GENSTAT,GENR BINLOOPBLANKREDLED BCF PORTB,2 BINLOOP CALL BLOCKINGREAD MOVFW BYTEIN XORLW '_' ;THE 'COMMAND FOLLOWS' CODE BTFSS STATUS,Z GOTO BINLOOP CALL BLOCKINGREAD CALL BLOCKINGREAD COMF BYTEIN2,W ;COMPLIMENT BYTEIN2, SAVE RESULTES IN W XORWF BYTEIN,W ;XOR THE COMP'D OLD BYTE WITH THE NEW BYTE. SHOULD MATCH. BTFSS STATUS,Z GOTO BINLOOPBLANKREDLED MOVLW 0x1 ;.5 SECONDS MOVWF REDLEDTTL BSF PORTB,2 ;------------------------------- ; MOVLW 0x7 ;^G, RETURN FROM BINARY MODE ; XORWF BYTEIN,W ; ; BTFSS STATUS,Z ; ; GOTO BINEND ; GO BACK TO ASCII MODE.. ;------------------------------- MOVFW BYTEIN ;GET READY IN CASE IT'S FOR MOTORSEEK.. BTFSS BYTEIN,0 ;IF BIT0 IS 0, THEN IT'S FOR MOTORSEEK.. MOVWF MOTORSEEK ;LOAD MOTORSEEK WITH NEW VALUE ;------------------------------- MOVLW B'00000011' ;SEE IF IT'S DRIVETIME UPDATE ANDWF BYTEIN,W ; XORLW B'00000001' ; BTFSS STATUS,Z ; GOTO BLNOTDRIVE ; MOVFW BYTEIN ; MOVWF DRIVETIME ;LOAD IN NEW DRIVE TIME BLNOTDRIVE NOP ; ;------------------------------- MOVLW B'00000111' ;CHECK FOR HONK UPDATE ANDWF BYTEIN,W ; XORLW B'00000011' ; BTFSS STATUS,Z ; GOTO LBNOTHONK ; MOVFW BYTEIN ; MOVWF HONKTIME ; LBNOTHONK NOP ; ;------------------------------- MOVFW BYTEIN ;CHECK IF CENTER IS REQUESTED XORLW B'00001111' ; BTFSS STATUS,Z ; GOTO BLNOTCENTER ; BCF GENSTAT,SEEKACTIVE ;TURN OFF AUTO SEEK... BSF MOTORSTAT,MOTCENT ;REQUEST THE MOTOR TO BE STOPPED AT CENTER.. BCF PORTA,2 ;TURN OFF BCF PORTA,3 ;SERVO BTFSS PORTB,5 ;SEE IF SERVO IS RIGHT OR LEFT GOTO BLCNTRA ; BSF PORTA,2 ;TURN ONE WAY GOTO BLNOTCENTER ; BLCNTRA BSF PORTA,3 ;TURN OTHER BLNOTCENTER NOP ; ;------------------------------- BLPRINTONLY ; ; MOVFW BYTEIN ; ; CALL BLOCKINGPRINT ; ; MOVFW BYTEIN2 ; ; CALL BLOCKINGPRINT ; ;------------------------------- GOTO BINLOOP BINEND CALL NEWLINE MOVLW "E" CALL BLOCKINGPRINT MOVLW "N" CALL BLOCKINGPRINT MOVLW "T" CALL BLOCKINGPRINT MOVLW "E" CALL BLOCKINGPRINT MOVLW "R" CALL BLOCKINGPRINT MOVLW "I" CALL BLOCKINGPRINT MOVLW "N" CALL BLOCKINGPRINT MOVLW "G" CALL BLOCKINGPRINT MOVLW " " CALL BLOCKINGPRINT MOVLW "A" CALL BLOCKINGPRINT MOVLW "S" CALL BLOCKINGPRINT MOVLW "C" CALL BLOCKINGPRINT MOVLW "I" CALL BLOCKINGPRINT MOVLW "I" CALL BLOCKINGPRINT MOVLW " " CALL BLOCKINGPRINT MOVLW "M" CALL BLOCKINGPRINT MOVLW "O" CALL BLOCKINGPRINT MOVLW "D" CALL BLOCKINGPRINT MOVLW "E" CALL BLOCKINGPRINT CALL NEWLINE GOTO LOOP MOVLW 0x1 MOVWF ERRORREG ;RECORD THAT WE WERE HERE ERRORTRAP01 GOTO ERRORTRAP01 ;WE SHOULD NEVER GET HERE.. SO FORCE RESET BLOCKINGPRINT ; BSF STATUS,RP0 ;SELECT BANK0 ; BCF INTCON,GIE ;DISABLE GLOBAL INTS ; BCF STATUS,RP0 ;SELECT BANK0 ; BCF COMSTAT,COMB ; BCF GENSTAT,GENR BPRINT2 CLRWDT NOP ;THIS IS ADJUSTED FOR EXACTALLY 40,000 HERTZ NOP ;ON THE PORTA,0 PIN, WITH ALL INTS DISABLED. NOP ;THE HERTZ WITH INTS ENABLED WILL BE SOMEWHAT BPRINT3 BTFSS PORTA,0 ;LOWER, BUT THE ACTUAL HERTZ DURRING EACH BITLENGTH GOTO BPTAIC ;WILL STILL BE 40Khz, EXCEPT WHEN ONE OF THE NON TIMER BCF PORTA,0 ;INTS HAPPENS... GOTO BPTAIS BPTAIC BSF PORTA,0 BPTAIS CLRWDT BTFSC COMSTAT,COMB GOTO BPRINT2 BTFSS GENSTAT,GENWFR GOTO BPLETSGO BTFSS GENSTAT,GENR GOTO BPRINT3 BPLETSGO MOVWF BYTEOUT BSF COMSTAT,COMB RETURN BLOCKINGREAD MOVFW BYTEIN MOVWF BYTEIN2 ;SAVE OLD BYTEIN TO BYTEIN2 BLOCKINGREAD2 CLRWDT ;WAIT TILL A BYTE COMES IN, THEN RETURN.. NOP ;THIS IS ADJUSTED FOR EXACTALLY 40,000 HERTZ NOP ;ON THE PORTA,0 PIN, WITH ALL INTS DISABLED. NOP ;THE HERTZ WITH INTS ENABLED WILL BE SOMEWHAT BTFSS PORTA,0 ;LOWER, BUT THE ACTUAL HERTZ DURRING EACH BITLENGTH GOTO BRTAIC ;WILL STILL BE 40Khz, EXCEPT WHEN ONE OF THE NON TIMER BCF PORTA,0 ;INTS HAPPENS... GOTO BRTAIS ;Blocking Read Toggle A Is Clear... BRTAIC BSF PORTA,0 BRTAIS NOP BTFSS GENSTAT,GENR ;IF NO NEW INPUT BYTE THEN GOTO BLOCKINGREAD2 ;GOTO THE LOOP.. ELSE BCF GENSTAT,GENR ;CLR THE BIT, SO WE STOP HERE NEXT TIME... RETURN PRINTASHEX CLRWDT MOVWF PAHSCRATCH SWAPF PAHSCRATCH,F MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x78 ;'x' CALL BLOCKINGPRINT MOVFW PAHSCRATCH ANDLW 0x0F ;DROP THE FIRST 4 BITS FOR NOW.. BTFSC PAHSCRATCH,1 GOTO PAS1C BTFSC PAHSCRATCH,2 GOTO PAS1C GOTO PAS1A PAS1C BTFSS PAHSCRATCH,3 GOTO PAS1A ADDLW 0x37 ;A-F (REMEMBER THAT 'W' IS ALREADY HIGH AS 10..) GOTO PAS1B PAS1A ADDLW 0x30 ;0-9 PAS1B CALL BLOCKINGPRINT SWAPF PAHSCRATCH,F MOVFW PAHSCRATCH ;NOW TO DO THE LEAST SIG NIBBLE ANDLW 0x0F ;DROP THE FIRST 4 BITS FOR NOW.. BTFSC PAHSCRATCH,1 GOTO PAS2C BTFSC PAHSCRATCH,2 GOTO PAS2C GOTO PAS2A PAS2C BTFSS PAHSCRATCH,3 GOTO PAS2A ADDLW 0x37 ;A-F (REMEMBER THAT 'W' IS ALREADY HIGH AS 10..) GOTO PAS2B PAS2A ADDLW 0x30 ;0-9 PAS2B CALL BLOCKINGPRINT MOVLW 0x20 CALL BLOCKINGPRINT RETURN NEWLINE MOVLW 0x0D ;\r CALL BLOCKINGPRINT MOVLW 0x0A ;\n CALL BLOCKINGPRINT RETURN PRINTASBINARY MOVWF PABSCRATCH MOVLW 0x42 ;'B' CALL BLOCKINGPRINT MOVLW 0x27 ;"'" CALL BLOCKINGPRINT MOVLW 0x31 ;'1' BTFSS PABSCRATCH,7 MOVLW 0x30 ; '0' CALL BLOCKINGPRINT MOVLW 0x31 ;'1' BTFSS PABSCRATCH,6 MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x31 ;'1' BTFSS PABSCRATCH,5 MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x31 ;'1' BTFSS PABSCRATCH,4 MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x31 ;'1' BTFSS PABSCRATCH,3 MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x31 ;'1' BTFSS PABSCRATCH,2 MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x31 ;'1' BTFSS PABSCRATCH,1 MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x31 ; '1' BTFSS PABSCRATCH,0 MOVLW 0x30 ;'0' CALL BLOCKINGPRINT MOVLW 0x27 CALL BLOCKINGPRINT MOVLW 0x20 CALL BLOCKINGPRINT RETURN END