?? hcs302.asm
字號:
WRITE0 MOVLW 30H ; WRITE ENABLE COMMAND
MOVWF OUTBYT
CALL SENDC ; SEND COMMAND TO EEPROM
BCF PORTB,CS ; END COMMAND, DESELECT
; ******** WRITE 16-BIT WORD TO EEPROM *********
WRITE1 MOVFW ADDRESS ; GET EEPROM ADDRESS
MOVWF OUTBYT
BSF OUTBYT,6 ; WRITE COMMAND
CALL SENDC ; SEND COMMAND TO EEPROM
MOVLW 16D ; 16 DATA BITS
MOVWF CNT1
WRITE2
BTFSS TMP1,7 ; TEST MSB OF 16 BIT WORD
BCF PORTB,DIO ; SET DATA BIT
BTFSC TMP1,7 ; ... ELSE
BSF PORTB,DIO ; CLEAR DATA BIT
GOTO $+1 ; WAIT 2 US
RLF TMP2,F ; SHIFT LO BYTE
BSF PORTB,CLK ; CLOCK HIGH
GOTO $+1 ; WAIT 2 US
RLF TMP1,F ; SHIFT HI BYTE
BCF PORTB,CLK ; CLOCK LOW
DECFSZ CNT1,F
GOTO WRITE2 ; LOOP COUNTER
WAITACK
BCF PORTB,CS ; END OF WRITE COMMAND, DESELECT
MOVLW RDCFG
TRIS PORTB ; DIO = INPUT
BSF PORTB,CS ; CS HIGH TO WAIT FOR ACK
WRITE5
BTFSC PORTB,DIO ; CHECK FOR ACK
GOTO WRITE6 ; WDT RESET ON NO ACK
GOTO WRITE5
WRITE6 BCF PORTB,CS ; END OF ACK
; ******* EEPROM WRITE DISABLE ****************
MOVLW 000H ; WRITE DISABLE COMMAND
MOVWF OUTBYT
CALL SENDC
BCF PORTB,CS ; END OF DISABLE COMMAND, DESELECT
INCF ADDRESS,F ; POINT TO NEXT EEPROM ADDRESS ( BY DEFAULT )
RETLW 0H
;------------------------------------------------------------------------------
;
; FUNCTION : EEREAD ()
;
; DESCRIPTION : READ 16 BIT VALUE FROM EEPROM
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------
EEREAD
MOVFW ADDRESS
MOVWF OUTBYT
BSF OUTBYT,7 ; COMMAND = READ
CALL SENDC ; SEND COMMAND
MOVLW RDCFG
TRIS PORTB ; DIO = INPUT
MOVLW 16D ; 16 BITS TO READ
MOVWF CNT1
READ0 BSF PORTB,CLK ; CLOCK HIGH
RLF TMP2,F ; SHIFT LO BYTE
BCF TMP2,0 ; ASSUME BIT WILL BE 1
BTFSC PORTB,DIO ; READ DIO LINE
BSF TMP2,0 ; COPY BIT TO REGISTER
BCF PORTB,CLK ; CLOCK LOW
RLF TMP1,F ; SHIFT HI BYTE
DECFSZ CNT1,F ; LOOP COUNTER
GOTO READ0
BCF PORTB,CS ; END READ CYCLE
RETLW 0H
;------------------------------------------------------------------------------
;
; FUNCTION : DECRYPT ()
;
; DESCRIPTION : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------
; THE KEY USED IS A FIXED KEY WHICH IS NOT SERIAL NUMBER DEPENDANT
; THE USER MUST CHOOSE A KEY AND CHANGE THE CODE HERE TO REFLECT THAT KEY
DECRYPT
MOVLW 0EFH ; LOAD FIXED 64 BIT KEY LSB
MOVWF KEY0
MOVLW 0CDH
MOVWF KEY1
MOVLW 0ABH
MOVWF KEY2
MOVLW 089H
MOVWF KEY3
MOVLW 067H
MOVWF KEY4
MOVLW 045H
MOVWF KEY5
MOVLW 023H
MOVWF KEY6
MOVLW 01H ; LOAD FIXED 64 BIT KEY MSB
MOVWF KEY7
MOVLW 11+1 ; OUTER LOOP 11+1 TIMES
MOVWF CNT1 ; OUTER LOOP 11+1 TIMES
DECRYPT_OUTER
MOVLW 48 ; INNER LOOP 48 TIMES
MOVWF CNT0 ; INNER LOOP 48 TIMES
DECRYPT_INNER
CLRWDT ; RESET WATCHDOG TIMER
MOVFW CNT1 ; LAST 48 LOOPS RESTORE THE KEY
XORLW 1 ; LAST 48 LOOPS RESTORE THE KEY
SKPNZ ; LAST 48 LOOPS RESTORE THE KEY
GOTO ROTATE_KEY ; LAST 48 LOOPS RESTORE THE KEY
; THE LOOKUP TABLE IS COMPRESSED INTO IN 4 BYTES TO SAVE SPACE
; USE THE 3 LOW INDEX BITS TO MAKE UP AN 8-BIT BIT MASK
; USE THE 2 HIGH INDEX BITS TO LOOK UP THE VALUE IN THE TABLE
; USE THE BIT MASK TO ISOLATE THE CORRECT BIT IN THE BYTE
; PART OF THE REASON FOR THIS SCHEME IS BECAUSE NORMAL TABLE LOOKUP
; REQUIRES AN ADDITIONAL STACK LEVEL
CLRC ; CLEAR CARRY (FOR THE LEFT SHIFT)
MOVLW 1 ; INITIALISE MASK = 1
BTFSC HOP3,3 ; SHIFT MASK 4X IF BIT 2 SET
MOVLW 10000B ; SHIFT MASK 4X IF BIT 2 SET
MOVWF MASK ; INITIALISE MASK = 1
BTFSS HOP2,0 ; SHIFT MASK ANOTHER 2X IF BIT 1 SET
GOTO $+3
RLF MASK,F
RLF MASK,F
BTFSC HOP1,0 ; SHIFT MASK ANOTHER 1X IF BIT 0 SET
RLF MASK,F
; MASK HAS NOW BEEN SHIFTED 0-7 TIMES ACCORDING TO BITS 2:1:0
MOVLW 0 ; TABLE INDEX = 0
BTFSC HOP4,1
IORLW 2 ; IF BIT 3 SET ADD 2 TO THE TABLE INDEX
BTFSC HOP4,6
IORLW 4 ; IF BIT 4 SET ADD 4 TO THE TABLE INDEX
ADDWF PC,F ; ADD THE INDEX TO THE PROGRAM COUNTER
; [ MUST BE IN LOWER HALF OF PAGE ]
TABLE
MOVLW 02EH ; BITS 4:3 WERE 00
GOTO TABLE_END ; END OF LOOKUP
MOVLW 074H ; BITS 4:3 WERE 01
GOTO TABLE_END ; END OF LOOKUP
MOVLW 05CH ; BITS 4:3 WERE 10
GOTO TABLE_END ; END OF LOOKUP
MOVLW 03AH ; BITS 4:3 WERE 11
TABLE_END
ANDWF MASK,F ; ISOLATE THE CORRECT BIT BY ANDING WITH MASK
MOVLW 0 ; COPY THE BIT TO BIT 7
SKPZ ; COPY THE BIT TO BIT 7
MOVLW 10000000B ; COPY THE BIT TO BIT 7
XORWF HOP2,W ; ONLY INTERESTED IN BIT HOP2,7
XORWF HOP4,W ; ONLY INTERESTED IN BIT HOP4,7
XORWF KEY1,W ; ONLY INTERESTED IN BIT KEYREG1,7
MOVWF MASK ; STORE W TEMPORARILY (WE NEED BIT 7)
RLF MASK,F ; LEFT ROTATE MASK TO GET BIT 7 INTO THE CARRY
RLF HOP1,F ; SHIFT IN THE NEW BIT
RLF HOP2,F
RLF HOP3,F
RLF HOP4,F
ROTATE_KEY
CLRC ; CLEAR CARRY
BTFSC KEY7,7 ; SET CARRY IF LEFTMOST BIT SET
SETC ; SET CARRY IF LEFTMOST BIT SET
RLF KEY0,F ; LEFT-ROTATE THE 64-BIT KEY
RLF KEY1,F
RLF KEY2,F
RLF KEY3,F
RLF KEY4,F
RLF KEY5,F
RLF KEY6,F
RLF KEY7,F
DECFSZ CNT0,F ; INNER LOOP 48 TIMES
GOTO DECRYPT_INNER ; INNER LOOP 48 TIMES
DECFSZ CNT1,F ; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY)
GOTO DECRYPT_OUTER ; OUTER LOOP 12 TIMES (11 + 1 TO RESTORE KEY)
RETLW 0 ; RETURN
;------------------------------------------------------------------------------
;
; FUNCTION : LOAD_CNT_VALS()
;
; DESCRIPTION : LOAD COUNTERS INTO WRITE BUFFERS
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------
LOAD_CNT_VALS
MOVFW CNTR_HI ; LOAD MSB OF COUNTER
MOVWF TMP1
MOVFW CNTR_LW ; LOAD LSB OF COUNTER
MOVWF TMP2
RETLW 0
;------------------------------------------------------------------------------
;
; FUNCTION : RECEIVE()
;
; DESCRIPTION : RECEPTION ROUTINE FOR PWM TRANSMISSIONS
;
; NOTE : THIS ROUTINE MUST BE IN THE LOWER HALF OF THE PAGE
;
;------------------------------------------------------------------------------
RECEIVE
;******** WAIT FOR HEADER AND CALIBRATE *******************
BTFSS PORTA,RFIN ; INPUT LOW?
GOTO RMT_0 ; YES; RECEIVE ERROR
MOVLW 10 ; 10 ms TIMER
MOVWF CNT1
RCV0
MOVLW 200
MOVWF CNT0
RCV1
BTFSS PORTA,RFIN ; [2] INPUT HIGH?
GOTO RCV2 ; [0] NO, JUMP OUT OF LOOP
DECFSZ CNT0,1 ; [1] YES, CONTINUE WITH TIMING LOOP
GOTO RCV1 ; [2] 5 us X CNT0
DECFSZ CNT1,1 ; [0] DO 1 ms LOOP CNT1 TIMES
GOTO RCV0 ; [0]
RCV2
CLRF CNT0 ; [1] CLEAR CALIB COUNTER LOW BYTE
CLRF CNT1 ; [1] CLEAR CALIB COUNTER HIGH BYTE
;*************************************************************************
; 2.5 IS AVERAGE FOR DETECTING FALLING EDGE IN RCV1
; 2 INSTRUCTIONS FOR JUMP OUT RCV1 TO RCV2
; 2 INSTRUCTIONS FOR RCV2 - CLEAR CALIBRATION COUNTER
; TOTAL 6.5 INSTRUCTIONS < 1 CALIBRATION LOOP SO DISCARD
;*************************************************************************
RCV3
BTFSC PORTA,RFIN ; [2][2] INPUT HIGH?
GOTO RCV6 ; [0][0] YES--END CALIBRATION
INCF CNT0,1 ; [1] INCREMENT 16BIT COUNTER
SKPNZ ; [2]
INCF CNT1,1 ; [0]
CLRWDT ; [1] RESET WATCH DOG TIMER
NOP ; [1]
BTFSS CNT1,3 ; [1]
GOTO RCV3 ; [2]
GOTO RMT_0 ; [0]
; TOTAL = 10
RCV6
CLRC ; [1] DIVIDE CNT1:CNT0 BY 8 (600/8=75)
RRF CNT1,1 ; [1]
RRF CNT0,1 ; [1]
RRF CNT1,1 ; [1]
RRF CNT0,1 ; [1]
RRF CNT1,1 ; [1]
RRF CNT0,1 ; [1]
MOVLW MIN/80 ; [1]
SUBWF CNT0,W ; [1]
BTFSS STATUS,C ; [2] NEGATIVE?
GOTO RMT_0 ; [0] YES--HEADER SHORTER THAN MIN.
; TOTAL = 11
; ************* VALID HEADER RECEIVED *********************
RCV7
MOVLW NBITS ; [1] VALID START MARKER WAS RECEIVED
MOVWF CNT1 ; [1]
MOVF CNT0,W ; [1]
MOVWF CNT2 ; [1] CNT2 = CNT0
MOVLW 6H ; [1] SEE NOTE BELOW
SUBWF CNT2,1 ; [1]
GOTO DL1 ; [2] COMPENSATE FOR FIRST BIT
; TOTAL = 8
;**********************************************************************************
; 2.5 IS AVERAGE PLAY BETWEEN RISING EDGE AND JUMP OUT OF CALIBRATION LOOP.
; 2 FOR JUMP OUT OF RCV3 TO RCV6
; 11 INSTRUCTIONS FOR RVC6 - CAIBRATION COUNTER DIVIDE
; 8 INSTRUCTIONS FOR RCV7 - COMPENSATE FOR POST CALIBRATION CALCUATIONS
; TOTAL 22.5 INSTRUCTIONS BETWEEN RISING EDGE AND ENTERING DL1
; THEREFORE SUBTRACT 22.5/4 = 5.625 TO COMPENSATE FOR POST CALCULATION ON 1ST BIT
;**********************************************************************************
RCV8
MOVLW 4H ; [1] WAIT A MAXIMUM OF 4 Te
MOVWF TMP_CNT ; [1] SET TEMP LOOP COUNTER
RCV10A
MOVFW CNT0 ; [1] and CSR processing
MOVWF CNT2 ; [1] Refer to explanation above
RCV10B
BTFSC PORTA,RFIN ; [2] Wait for rising edge
GOTO RCV11 ; [0] Edge found--Process
CLRWDT ; [1] Clear watchdog Timer
BTFSC PORTA,RFIN ; [2] Wait for Next rising edge
GOTO RCV11 ; [0] Edge found--Process
DECFSZ CNT2,1 ; [1] Decrement Timeout counter
GOTO RCV10B ; [2] Loop Back
; TOTAL = 8, RFIN CHECKED EVERY 4uS ON AVERAGE
DECFSZ TMP_CNT,1 ; [1] ALL Te PERIODS
GOTO RCV10A ; [2] ... NO, THEN WAIT FOR NEXT ONE
GOTO RMT01 ; [0] ... YES, [0] TIMEOUT--no edge found
RCV11
MOVLW 3H ; [1] SEE NOTE BELOW
SUBWF CNT0,W ; [1]
MOVWF CNT2 ; [1]
;*************************************************************************
; 2 SETUP OF TEMP LOOP COUNTER ( ONLY ONCE )
; 2 SETUP TE LOOP COUNTER ( MAX 4 )
; 3 DECREMENT TEMP LOOP COUNTER ( MAX 4 )
; 4 IS THE AVERAGE PLAY BETWEEN EDGE AND EDJE BEING DETECTED IN RCV9
; 2 JUMP OUT OF RCV10B TO RCV11
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -