📄 secsys14.asm
字号:
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,CARRY ; [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
; 3 FOR RCV11
; TOTAL 10 INSTRUCTIONS BETWEEN EDGE AND ENTERING DL1
; THEREFORE SUBTRACT 10/4 = 2.5 => 3 DL1 LOOPS TO COMPENSATE FOR
;*************************************************************************
DL1
CLRWDT ; [1] RESET WATCHDOG TIMER
DECFSZ CNT2,1 ; [1] [2, IF SKIP]
GOTO DL1 ; [2] CNT0 X 4 us
SAMPLE1
BTFSS PORTA,RFIN ; [2] INPUT HIGH? FIRST SAMPLE
GOTO RMT01 ; [0] NO--ERROR
MOVF CNT0,W ; [1] CALIBRATION COUNTER
MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE)
DECF CNT2,1 ; [1] SUBTRACT 2 FROM FINAL CALIB COUNTER TO COMPENATE FOR THIS
GOTO $+1 ; [2]
NOP ; [1]
; TOTAL = 8 => 1 LOOP COUNTER
DL2
CLRWDT ; [1] RESET WATCHDOG TIMER
GOTO $+1 ; [2] WAISTE TIME
GOTO $+1 ; [2] WAISTE TIME
DECFSZ CNT2,1 ; [1]
GOTO DL2 ; [2] CNT0 X 8 us [ CNT0 x Te ]
SAMPLE2
BCF FLAGS1,BITIN ; [1] CLEAR BIT POSITION
BTFSS PORTA,RFIN ; [1.5] LEAVE 0 IF LINE HIGH
BSF FLAGS1,BITIN ; [0.5] MAKE 1 IF LINE LOW
; SUB TOTAL = 3 CYCLES
CALL ROT_SHIFT ; [11]+[2] CSR SHIFT + CALL
BCF CSR8,7 ; [1]
BTFSC FLAGS1,BITIN ; [1.5]
BSF CSR8,7 ; [0.5]
; SUB TOTAL = 16 CYCLES
MOVF CNT0,W ; [1] CALIBRATION COUNTER
MOVWF CNT2 ; [1] (NOMINALLY 75 FOR 300 us PULSE)
MOVLW 3 ; [1] SEE CALCULATION BELOW
SUBWF CNT2,1 ; [1]
NOP ; [1]
; SUB TOTAL = 5 CYCLE
; TOTAL = 24 => 24/8 = 3 LOOP COUNTERS
;*************************************************************************
; TOTAL = 24 INSTRUCTIONS
; SUBTRACT 24/8 = 3 TO COMPESATE FOR UPDATEING CSR AND OTHER PROCESSING
; AFTER DATA SAMPLE IS TAKEN.
;*************************************************************************
DL3
GOTO $+1 ; [2] WAISTE TIME
GOTO $+1 ; [2] WAISTE TIME
CLRWDT ; [1] RESET WATCHDOG TIMER
DECFSZ CNT2,1 ; [1]
GOTO DL3 ; [2] CNT0 X 8 us [ CNT0 X Te ]
SAMPLE3
BTFSC PORTA,RFIN ; [2] INPUT LOW? THIRD SAMPLE
GOTO RMT0 ; [0] NO--RECEIVE ERROR
CALL TST_RTCC ; [11] CHECK RTCC
DECFSZ CNT1,1 ; [1] LAST BIT?
GOTO RCV8 ; [2] ... NO, GET NEXT BIT
; TOTAL = 14 CYCLES
GOTO RMT21 ; [2] ... YES, ALL BITS RECEIVED
RMT_0
BSF CNT1,4 ; [1] HEADER ERROR--FORCE COUNTER > 11
RMT0 ; [1] HERE IF NOT ALL BITS RECEIVED OK
DECF CNT1,1 ; [1] COMPENSATE FOR ROTATE BEFORE DL3
; ***** JUMP TO HERE IF NOT ALL 66 BITS RECEIVED OK *****
RMT01
CALL TST_RTCC ; [11] CHECK RTCC
MOVLW 11D ; TEST FOR NTQ106 TRANSMISSION
SUBWF CNT1,W ; IF CARRY FLAG SET (RX NOT OK)
BTFSC STATUS,CARRY ; CARRY SET IF FORMAT INVALID
RETLW 0 ; HERE IF NOT ALL BITS RECEIVED OK
BSF FLAGS,NTQ106 ; INDICATE NTQ106 TX RECEIVED
; ***** ROTATE FOR ANOTHER 6 TIME TO LINE-UP CSR *****
RMT21
MOVLW 6H ; ADDITIONAL 6 BIT ROTATION REQUIRED
ADDWF CNT1,1 ; ADD TO WHAT LEFT IN COUNTER
RMT22
CLRC
CALL ROT_SHIFT ; COMPLETE 64-BIT SHIFT
DECFSZ CNT1,1 ; COMPLETE 64-BIT SHIFT
GOTO RMT22
BTFSS FLAGS,NTQ106 ; TEST FOR NTQ106 TRANSMISSION
GOTO RMT1
CLRF SER_0 ; ... YES, THEN CLEAR UPPER BYTE OF SN
CLRF CSR8
RMT1
BCF FLAGS1,BAT_LOW ; CLEAR VLOW BIT
BTFSC CSR8,0 ; TEST VLOW BIT IN TRANSMISSION
BSF FLAGS1,BAT_LOW ; INDICATE TX BATERY LOW BIT SET
RMT11
; BSF PORTA,LED ; VALID TRANSMISSION FORMAT, LED ON
NOP
RMT3
MOVLW 0FH ; FORCE OPEN BUTTON CODES TO ZERO
ANDWF SER_0,1
RMT4 CLRC ; VALID SERIAL NUMBER => VALID TX
RETLW E_OK ; RETURN WITH 1
;**************************************************************************
;
; FUNCTION : DECRYPT ()
;
; DESCRIPTION : DECRYPTS 32 BIT [HOP1:HOP4] USING [CSR0:CSR7]
;
; PAGE : 0 ( NOTE : MUST BE LOWER HALF OF PAGE )
;
;**************************************************************************
DECRYPT
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
BTFSC STATUS,ZERO ; 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
BTFSS STATUS,ZERO ; 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
CALL TST_RTCC
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 : TST_RTCC ()
;
; DESCRIPTION : TEST RTCC COUNTER AND UPDATE OUTPUT IF REQUIRED
;
; PAGE : 0
;
;**************************************************************************
TST_RTCC1
CLRWDT ; RESET WATCHDOG TIMER
MOVFW STATUS
XORWF RTCC,W
ANDLW 080H
BTFSS STATUS,ZERO
GOTO TST_RTCC2 ; TEST FOR 32MS TIMEOUT ON RTCC MSB
RETLW 0H ; ... DO QUICK RETURN TO RECEIVE ROUTINE
; **** INCREASE 16 BIT CLOCK TIMER *******
TST_RTCC2
BCF STATUS,OVF
MOVFW RTCC
ANDLW 080H
IORWF STATUS,F
INCF CNT_LW,F ; INCREASE 16 COUNTER
BTFSC STATUS,ZERO ; INCREASE UPPER BYTE IF ZERO ( OVERFLOW )
INCF CNT_HI,F
BSF FSR,5 ; SELECT RAM BANK 1
INCF CNT1_LW,F ; INCREASE REPEAT DEBOUNCE TIMER
INCF CNT2_LW,F ; INCREASE 2 SECOND PANIC TIMER
BCF FSR,5 ; SELECT RAM BANK 0
MOVLW RDCFG ; UPDATE TRI-STATE REGISTER FOR PORTA
TRIS PORTA
MOVLW TRISB ; UPDATE TRI-STATE REGISTER FOR PORTB
TRIS PORTB
MOVLW TRISC ; UPDATE TRI-STATE REGISTER FOR PORTC
TRIS PORTC
; *********** UPDATE LED IF REQUIRED ********
TST_LED
BTFSS FLAGS,LFLASH
GOTO TST_PLIGHT
BTFSS CNT_LW,4
GOTO TST_LED1
BSF PORTB,LED ; LED HIGH FOR 524MS
GOTO TST_PLIGHT
TST_LED1
BCF PORTB,LED ; LED LOW FOR 524MS
; *********** UPDATE PLIGHT IF REQUIRED ********
TST_PLIGHT
BTFSS FLAGS,PFLASH
GOTO TST_30
BTFSS CNT_LW,4
GOTO TST_PLIGHT1
BSF PORTB,PLIGHT ; PLIGHT HIGH FOR 524MS
GOTO TST_30
TST_PLIGHT1
BCF PORTB,PLIGHT ; PLIGHT LOW FOR 524MS
; ********* TEST FOR 30 S LEARN TIMEOUT *************
TST_30 BTFSC FLAGS,NORMAL ; TIMEOUT USE ONLY WITH LEARN
GOTO TST_RPT
BTFSS CNT_HI,2
GOTO TST_RPT ; TEST FOR LEARN TIMEOUT
GOTO WIPE_TX ; IF LEARN TIMEMOUT ABORT
; ********* TEST REPEAT TIMEOUT *************
TST_RPT
BSF FSR,5 ; SELECT RAM BANK 1
BTFSS CNT1_LW,4
GOTO TST_PANIC ; REPEAT TIMEMOUT OF 0.5 SEC
BCF FSR,5
BCF FLAGS,RPT
; ********* TEST PANIC TIMEOUT *************
TST_PANIC
BCF FSR,5
BTFSS FLAGS,RPT
GOTO TST_END
BSF FSR,5
MOVLW 48D ; PANIC TIME OF 2 SEC
SUBWF CNT2_LW,W
BTFSS STATUS,CARRY
GOTO TST_END
BCF FSR,5 ; SELECT RAM BANK 0
BCF FLAGS,RPT
BSF STATUS,PA1 ; SELECT PAGE #2
GOTO ALARM
TST_END
BCF FSR,5 ; SELECT RAM BANK 0
RETLW 0H
;**************************************************************************
;
; FUNCTION : TST_LEARN ()
;
; DESCRIPTION : TEST AND HANDLE LEARN BUTTON
;
; PAGE : 0
;
;**************************************************************************
TST_LEARN1
CLRWDT ; RESET WATCHDOG TIMER
BTFSS PORTC,LEARN ; CHECK FOR LEARN BUTTON PRESSED
RETLW 0 ; ... IF NOT RETURN
BTFSC FLAGS,PASS2
GOTO TST_LEARN7 ; ALREADY IN LEARN
TST_LEARN2
MOVLW ALARMS ; CHECK IF IN ALARM STATE
XORWF RAMS,W
BTFSC STATUS,ZERO ; ... NO, CONTINUE
RETLW 0 ; ... YES, RETURN
CLRF CNT_HI ; RESET EVENT COUNTER
CLRF CNT_LW
BCF FLAGS,LFLASH ; CLEAR LED FLASH MODE
TST_LEARN3
MOVLW 080H ; CHANGE LED STATE
XORWF PORTB,F ; USED TO FLASH LED AT 25KhZ
CALL TST_RTCC ; CALL RTCC UPDATE ROUTINE
BTFSC CNT_HI,0
GOTO TST_LEARN4 ; TEST FOR ERASE TIMEMOUT ( 8.2 SEC )
BTFSS PORTC,LEARN
GOTO TST_LEARN5 ; WAIT FOR LEARN BUTTON LIFT
GOTO TST_LEARN3 ; ... IF NOT WAIT FOR LEARN KEY LIFT
TST_LEARN4
BSF STATUS,PA0 ; SELECT PAGE #1
GOTO ERASE ; ERASE ALL LEARNED TRANSMITTERS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -