#include p16f77.inc __config h'3FF2' ORG 0X0 GOTO MAIN_PROGRAM RFPORT EQU PORTB RFTRIS EQU TRISB RFPIN EQU 7 DELAYT EQU H'21' BCOUNT EQU H'22' COUNTER EQU H'23' BIT EQU H'24' PKCOUNTER EQU H'25' PK1 EQU H'30' PK2 EQU H'31' PK3 EQU H'32' PK4 EQU H'33' PK5 EQU H'34' PK6 EQU H'35' ORG 0004 INTERPUT: MOVF RCREG,W MOVWF PORTB MOVF RCSTA,W MOVWF PORTD RETFIE ;---DELAY ROUTINE--------- DELAY: ;;delay is (delayt X 3) + 5 DECFSZ DELAYT,1 GOTO DELAY RETURN DELAY_HB ;DELAY HALF A BIT MOVLW D'40' MOVWF DELAYT DELAY_HB1 NOP NOP NOP DECFSZ DELAYT,F GOTO DELAY_HB1 RETURN DELAY_QB ;DELAY QUARTER A BIT MOVLW D'20' MOVWF DELAYT DELAY_QB1 NOP NOP NOP DECFSZ DELAYT,F GOTO DELAY_QB1 RETURN DELAY_10B ;DELAY 10TH A BIT MOVLW D'7' MOVWF DELAYT DELAY_10B1 NOP NOP NOP DECFSZ DELAYT,F GOTO DELAY_10B1 RETURN ;---------------CHECK BIT------------------- CHECK_BIT: ;START ROUTINE AT START OF BIT, LEAVES 11 CYCLES TO PLAY WITH CALL DELAY_QB ;IT WILL WAIT 1/4 OF BIT, THEN CHECK MIDDLE HALF ;TEST MULTIPLY TIME FOR MOST 1 OR 0'S MOVLW D'25' ;NUMBER OF TIMES TO COUNT MOVWF COUNTER CLRF BCOUNT ;INTIALISE 01 COUNTER CHECK_BIT_LOOP; ;SHOULD BE 1/4 WAY THOUGH BYTE, THIS SHOULD TAKE HALF A BYTE BTFSC RFPORT,RFPIN INCF BCOUNT,F NOP BTFSS RFPORT,RFPIN DECF BCOUNT,F NOP DECFSZ COUNTER,F GOTO CHECK_BIT_LOOP CHECK_BIT_PROCESS: MOVF BCOUNT,W ADDLW D'128' SKPNC BCF BIT,0 MOVF BCOUNT,W ADDLW D'128' SKPC BSF BIT,0 CALL DELAY_QB RETURN MAIN_PROGRAM: ;-------------START--------- NOP NOP NOP SETUP_PORTS: ;-------SETUP ASYNC SERIAL PORT------ BSF STATUS,RP0 ;MEM_1 BSF TXSTA,BRGH ;HIGH SPEED BAUD BCF TXSTA,TX9 ;8 BIT TRANSMITION BCF TXSTA,SYNC ;ASYNCRONOUS MODE MOVLW D'30' MOVWF SPBRG ;SET BAUD TO 19200(@ 9.6MHZ) BSF TRISC,6 ;ENABLE PORT BSF TRISC,7 BSF PIE1,RCIE ;ENABLE RECIVE INTERUPT BCF PIE1,TXIE ;DISABLE TRANSMIT INTERUPT BSF TXSTA,TXEN ;ENABLE TRANSMITION BCF STATUS,RP0 ;MEM_0 BSF INTCON,PEIE ;ENALBLE PERIFERAL INTERUPTS BSF INTCON,GIE ;ENABLE ALL INTERUPTS BSF RCSTA,SPEN ;ENABLE SERIAL PORT BCF RCSTA,TX9 ;8 BIT MODE BSF RCSTA,CREN ;ENABLE RECEPTION ;---------SET-UP PORT DIRECTIONS--- BCF STATUS,RP1 BSF STATUS,RP0 ;MEMORY PAGE 1*************** BSF RFPORT,RFPIN ;RF PIN AS INPUT BCF TRISD,0 BCF STATUS,RP0 ;MEMORY PAGE 0*************** MAIN: ;CALL T ;CALL CHECK_BIT ;NOP ;CALL CHECK_BIT ;CALL DELAY_10B ;CALL DELAY_HB ;CALL DELAY_HB ;CALL DELAY_HB ;CALL DELAY_HB ;BSF PORTD,0 ;CALL DELAY_HB ;CALL DELAY_HB ;CALL DELAY_HB ;CALL DELAY_HB ;CALL DELAY_HB ;CALL DELAY_HB ;BCF PORTD,0 IDLE_LOOP NOP NOP NOP BCF PORTD,0 BTFSS RFPORT,RFPIN GOTO IDLE_LOOP ;BCF PORTD,0 CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY BTFSS RFPORT,RFPIN GOTO IDLE_LOOP CALL DELAY_10B ;CHECK STAR BIT EVERY 10TH OF BIT OR VALIDITY MOVLW D'18' ;PASSED STARTBIT TEST!!!!!!!!!!!!! MOVWF DELAYT CALL DELAY ;--------------- CALL CHECK_BIT ;NOW CHECK NEXT BIT ADDRESS BITS, SHOULD BE 101 BTFSC BIT,0 GOTO IDLE_LOOP ;FAILED ADDRESS (0) NOP NOP NOP NOP NOP NOP NOP NOP NOP CALL CHECK_BIT ;NOW CHECK NEXT BIT ADDRESS BITS, SHOULD BE 101 BTFSS BIT,0 GOTO IDLE_LOOP ;FAILED ADDRESS (1) NOP NOP NOP NOP NOP NOP NOP NOP NOP CALL CHECK_BIT BTFSC BIT,0 GOTO IDLE_LOOP ;FAILED ADDRESS (0) NOP NOP NOP NOP NOP NOP NOP NOP NOP T: CALL CHECK_BIT BTFSS BIT,0 GOTO IDLE_LOOP ;FAILED ADDRESS (1) ;PASSED PRE PACKET STUFF NOP NOP NOP NOP NOP NOP NOP ;------------- DO_PK1: ;VERY INEFFICCENT, BUT GOT LOADS OF SPACE!! MOVLW D'8' MOVWF PKCOUNTER DO_PK1_LOOP: CALL CHECK_BIT RLF PK1 BTFSC BIT,0 BSF PK1,0 BTFSS BIT,0 BCF PK1,0 NOP NOP NOP DECFSZ PKCOUNTER GOTO DO_PK1_LOOP ;-------------- DO_PK2: ;VERY INEFFICCENT, BUT GOT LOADS OF SPACE!! MOVLW D'8' MOVWF PKCOUNTER DO_PK2_LOOP: CALL CHECK_BIT RLF PK2 BTFSC BIT,0 BSF PK2,0 BTFSS BIT,0 BCF PK2,0 NOP NOP NOP DECFSZ PKCOUNTER GOTO DO_PK2_LOOP DO_PK3: ;VERY INEFFICCENT, BUT GOT LOADS OF SPACE!! MOVLW D'8' MOVWF PKCOUNTER DO_PK3_LOOP: CALL CHECK_BIT RLF PK3 BTFSC BIT,0 BSF PK3,0 BTFSS BIT,0 BCF PK3,0 NOP NOP NOP DECFSZ PKCOUNTER GOTO DO_PK3_LOOP DO_PK4: ;VERY INEFFICCENT, BUT GOT LOADS OF SPACE!! MOVLW D'8' MOVWF PKCOUNTER DO_PK4_LOOP: CALL CHECK_BIT RLF PK4 BTFSC BIT,0 BSF PK4,0 BTFSS BIT,0 BCF PK4,0 NOP NOP NOP DECFSZ PKCOUNTER GOTO DO_PK4_LOOP DO_PK5: ;VERY INEFFICCENT, BUT GOT LOADS OF SPACE!! MOVLW D'8' MOVWF PKCOUNTER DO_PK5_LOOP: CALL CHECK_BIT RLF PK5 BTFSC BIT,0 BSF PK5,0 BTFSS BIT,0 BCF PK5,0 NOP NOP NOP DECFSZ PKCOUNTER GOTO DO_PK5_LOOP DO_PK6: ;VERY INEFFICCENT, BUT GOT LOADS OF SPACE!! MOVLW D'8' MOVWF PKCOUNTER DO_PK6_LOOP: CALL CHECK_BIT RLF PK6 BTFSC BIT,0 BSF PK6,0 BTFSS BIT,0 BCF PK6,0 NOP NOP NOP DECFSZ PKCOUNTER GOTO DO_PK6_LOOP ;SHOULD HAVE RECIVED A PACKET BY HERE :) MOVFW PK1 ;NOW DO ERROR CHECK XORWF PK2,W SUBWF PK5 BTFSS STATUS,Z ;CHECK ERROR1 ;NOP GOTO IDLE_LOOP ;ERROR!! MOVFW PK3 ;NOW DO ERROR CHECK XORWF PK4,W SUBWF PK6 BTFSS STATUS,Z ;CHECK ERROR2 ;NOP GOTO IDLE_LOOP ;ERROR!! MOVLW D'85' ;"UNXORING" PK1 AND PK3 TO GET ORIGINAL XORWF PK1,F MOVLW D'85' XORWF PK3,F ;ERROR CHECK PASSED!!!! AMAZZZZINGGGG MOVFW PK1 MOVWF TXREG CALL WAIT_TILL_TX_EMPTY MOVFW PK2 MOVWF TXREG CALL WAIT_TILL_TX_EMPTY MOVFW PK3 MOVWF TXREG CALL WAIT_TILL_TX_EMPTY MOVFW PK4 MOVWF TXREG CALL WAIT_TILL_TX_EMPTY GOTO MAIN WAIT_TILL_TX_EMPTY: BSF STATUS,RP0 ;MEM_1 BTFSS TXSTA,TRMT GOTO WAIT_TILL_TX_EMPTY BCF STATUS,RP0 ;MEM_0 RETURN end