?? p676_koq.asm
字號:
; 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
; 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] WASTE TIME
GOTO $+1 ; [2] WASTE TIME
DECFSZ CNT2,1 ; [1]
GOTO DL2 ; [2] CNT0 X 8 us [ CNT0 x Te ]
SAMPLE2
BCF FLAGS,BITIN ; [1] CLEAR BIT POSITION
BTFSS PORTA,RFIN ; [1.5] LEAVE 0 IF LINE HIGH
BSF FLAGS,BITIN ; [0.5] MAKE 1 IF LINE LOW
; SUB TOTAL = 3 CYCLES
CALL ROT_SHIFT ; [11]+[2] CSR SHIFT + CALL
BCF CSR7,7 ; [1]
BTFSC FLAGS,BITIN ; [1.5]
BSF CSR7,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] WASTE TIME
GOTO $+1 ; [2] WASTE 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
GOTO RMT1 ; TOTAL = 14 CYCLES
RMT_0
RMT0
RMT01 BSF STATUS,C ; INVALID TRANSMISSION
RETLW 1 ; RETURN
RMT1 BSF PORTA,LED ; VALID TRANSMISSION FORMAT, LED ON
MOVLW 0FH ; FORCE OPEN BUTTON CODES TO ZERO
ANDWF SER_0,1
CLRC ; VALID SERIAL NUMBER => VALID TX
RETLW 0 ; RETURN
;===========================================================================
;
; FUNCTION : M_LOOP ()
;
; DESCRIPTION : MAIN PROGRAM ROUTINE
;
;===========================================================================
M_LOOP
BCF PORTA,LED
BTFSS PORTA,LRN
GOTO LEARN ; TEST & HANDLE LEARN BUTTON
CALL TST_RTCC ; UPDATE TIMER
CALL TST_TIMER ; HANDLE TIMER - UPDATE OUTPUTS
CALL RECEIVE ; RECEIVE TRANSMISSION
BC M_LOOP ; CHECK IF TRANSMISSION VALID
M_SEARCH
CLRF TXNUM ; TEST FIRST POSITION
; ******* COMPARE LOWER WORD OF SERIAL NUMBER ********
M_SERIAL
CALL TX_LOOKUP ; GET TX BASE ADDRESS
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
CALL EEREAD ; READ LOWER 16-BITS OF SER# FROM EEPROM
MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES
XORWF SER_2,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT
MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_3,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT
; ******* COMPARE UPPER WORD OF SERIAL NUMBER ********
M_SERIAL2
INCF ADDRESS,F ; POINT TO NEXT ENTRY
CALL EEREAD ; READ UPPER 16-BITS OF SER# FROM EEPROM
MOVFW TMP1 ; COMPARE RX AND EEPROM VALUES
XORWF SER_0,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT
MOVFW TMP2 ; COMPARE RX AND EEPROM VALUES
XORWF SER_1,W
BNZ M_NEXT ; IF NOT EQUAL CHECK NEXT
BTFSS FLAGS,LRNF ; LEARN MODE
GOTO M_HOP ; FOUND TRANSMITTER - DECRYPT
BSF FLAGS,RELEARN ; SET RELEARN FLAG
GOTO LEARN_F ; FOUND TRANSMITTER - LEARN
; **** SEARCH NEXT POSITION FOR SERIAL NUMBER *****
M_NEXT
INCF TXNUM,F ; POINT TO NEXT TRANSMITTER POSITION
MOVLW MAX_USERS ; TEST FOR LAST POSITION
SUBWF TXNUM,W
BTFSS STATUS,C ; NOT FOUND IN MAP
GOTO M_SERIAL ; TRY NEXT POSITION
M_NF
BTFSS FLAGS,LRNF ; LEARN MODE
GOTO M_LOOP ; NO... INVALID SERIAL NUMBER
GOTO LEARN_NF ; NEW TRANSMITTER - USE POINTER FOR LEARN
; ********** DECRYPT HOPCODE *********************
M_HOP
CALL DECRYPT ; DECRYPT HOPCODE
; ********* TEST DICRIMINATION VALUE *************
M_DIS MOVFW SER_3 ; SERIAL NUBER LSB MUST BE EQUAL
XORWF CODEE,W ; TO DISCRIMINATION VALUE
BNZ M_LOOP
; *************** CHECK COUNTERS VALID ************
BCF FLAGS,SEC_CNT ; CHECK FIRST COUNTER
M_CNT
CALL TX_LOOKUP ; POINT LOWER 16 BIT COUNTER
BTFSC FLAGS,SEC_CNT ; IF SECOND COUNTER IS USED
INCF ADDRESS,F ; INCREMENT ADDRESS
CALL EEREAD ; READ LOWER 16 BIT COUNTER FROM EEPROM
; ************ CHECK COUNTER WINDOWS ***********
M_SUB
MOVFW TMP2 ; 16 BIT COUNTER SUBSTRACTION
SUBWF CNTR_LW,W
MOVWF TMP2
SKPC ; SKIP IF NO BORROW
INCF TMP1,F ; ... ELSE INCR HI BYTE
MOVFW TMP1
SUBWF CNTR_HI,W
MOVWF TMP1
BCF TMP1,0 ; MAKE ACCEPTED WINDOW 512
M_CHECK0
MOVFW TMP1 ; TEST IF IN WINDOW ( UPPER BYTE )
BTFSC STATUS,Z
GOTO M_CHECK2 ; GO AND CHECK LOWER BYTE
BTFSC FLAGS,SEC_CNT ; IF SECOND COUNTER
GOTO M_LOOP ; ERROR - GOTO MAIN LOOP
BSF FLAGS,SEC_CNT ; SET FLAG FOR SECOND COUNTER CHECK
GOTO M_CNT ; AND CHECK IT
M_CHECK2
MOVFW TMP2 ; CHECK LOWER BYTE
BZ M_TZERO ; IF REPEAT - RESET TIMEOUT COUNTER
; ************ UPDATE EEPROM COUNTER ***********
M_UPDATE
CALL TX_LOOKUP ; GET CURRENT TX BASE ADDRESS
CALL LOAD_CNT_VALS ; LOAD COUNTER VALUES
CALL EEWRITE ; UPDATE FIRST COUNTER
CALL LOAD_CNT_VALS ; LOAD COUNTER VALUES
CALL EEWRITE ; UPDATE SECOND COUNTER
; ******** UPDATE OUTPUT WITH CURRENT BUTTON CODE ********
M_OUTPUT
MOVLW 0F0H ; MASK ONLY BUTTON CODES
ANDWF FUNC,1
SWAPF FUNC,1 ; GET BUTTON CODE FROM FUNC BYTE
BTFSC FUNC,0 ; CHANGE BUTTON TO S-OUTPUT FORMAT
BSF FUNC,4 ; [ S2 S1 S0 S3 ]
CLRC
RRF FUNC,W
M_OUTPUT1
movwf flash_flags
btfss flash_flags,0
goto zhuiyu
movlw 0aah
movwf PORTC
goto M_TZERO
zhuiyu
clrf PORTC
M_TZERO
CLRF CNT_HI ; RESET RTCC CLOCK
CLRF CNT_LW
M_END
GOTO M_LOOP ; WAIT FOR NEXT TRANMISSION
;===========================================================================
;
; FUNCTION : LEARN ()
;
; DESCRIPTION : LEARN ROUTINE
;
;===========================================================================
LEARN
CLRF CNT_LW ; RESET TIMER
CLRF CNT_HI
LEARN1
BSF PORTA,LED ; LED ON
CALL TST_RTCC ; UPDATE TIMER
BTFSC PORTA,LRN ; TEST FOR BUTTON RELEASE
GOTO LEARN2 ; ENTER LEARN MODE
BTFSS CNT_HI,0 ; TEST FOR ERASE ALL
GOTO LEARN1 ; LOOP BACK
; ******* EEPROM ERASE ALL ******************
BCF PORTA,LED
ERASE_ALL
CLRWDT ; CLEAR WATCHDOG TIMER
MOVLW 40H
MOVWF COUNT_ERASE
MOVLW 00H
MOVWF ADDRESS
MOVLW 0FFH
MOVWF TMP1
MOVWF TMP2
CALL EEWRITE
DECFSZ COUNT_ERASE
GOTO $-2
CLRWDT
BTFSS PORTA,LRN
GOTO $-2
GOTO RESET ; START OVER
LEARN2
BCF PORTA,LED ; CLEAR LED
BSF FLAGS,LRNF ; SET LEARN FLAG
LEARN3
CALL TST_RTCC ; UPDATE TIMER
CALL TST_TIMER ; CHECK FOR LEARN TIMEOUT
CALL RECEIVE ; RECEIVE TRANSMISSION
BC LEARN3 ; CHECK IF TRANSMISSION VALID
GOTO M_SEARCH ; CHECK IF SERIAL NUMBER IS IN MAP
LEARN_NF
; *** IF SERIAL NOT IN MAP READ SELFLEARN POINTER ***
MOVLW LRNPTR
BSF STATUS,RP0
MOVWF EEADR
BSF EECON1,RD
MOVF EEDATA,W
BCF STATUS,RP0
MOVWF TXNUM
COMF TXNUM
BTFSS STATUS,Z
COMF TXNUM
LEARN_F
CALL TX_LOOKUP
BSF ADDRESS,1 ; ADD 2 TO BASE ADDRESS
MOVFW SER_2 ; GET LOWER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_3
MOVWF TMP2
CALL EEWRITE ; ... AND WRITE TO EEPROM
MOVFW SER_0 ; GET UPPER 16 BIT OF SERIAL NUMBER
MOVWF TMP1
MOVFW SER_1
MOVWF TMP2
CALL EEWRITE ; ... AND WRITE TO EEPROM
; *** DECRYPT HOP CODE ***
LEARN_DEC
CALL DECRYPT ; DECRYPTION ROUTINE
; *** CHECK DISCRIMINATION VALUE ***
LEARN_CHK
MOVFW SER_3 ; CHECK LOWER BYTE OF SERIAL NUMBER
XORWF CODEE,W ; AGAINST DISCRIMINATION VALUE
BZ LEARN_UP ; UPDATE LEARN POINTER
GOTO CANCEL_LEARN ; ERROR CANCEL LEARN MODE
; ********* UPDATE LEARN POINTER **********
LEARN_UP
CALL TX_LOOKUP ; GET CURRENT TX BASE ADDRESS
CALL LOAD_CNT_VALS
CALL EEWRITE ; WRITE LSB WORD OF COUNTER TO EEPROM
BTFSC FLAGS,RELEARN ; IF RELEARN
GOTO BYPASS_POINTER_WRITE ; DONT UPDATE POINTER
INCF TXNUM ; INCREMENT LEARN POINTER
MOVLW 0FH
ANDWF TXNUM,W ; ELSE USE TXNUM
MOVWF TMP1 ; FOR WRITE OPERATION
LEARN_UP1
MOVLW LRNPTR ; POINT TO LEARN POINTER
BSF STATUS,RP0
MOVWF EEADR
MOVF TMP1,W
MOVWF EEDATA
BSF EECON1,WREN
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,WR
WRIT_VERIFY1
CLRWDT
BTFSC EECON1,WR
GOTO $-2
MOVF EEDATA,W
BSF EECON1,RD
XORWF EEDATA,W
BTFSS STATUS,Z
GOTO LEARN_UP1
BCF STATUS,RP0
BYPASS_POINTER_WRITE
BSF PORTA,LED ; LED ON TO INDICATE VALID LEARN
CLRF CNT_LW ; CLEAR COUNTER LOW BYTE
SUCCESS
CALL TST_RTCC ; INDICATE SUCCESSFUL LEARN
BTFSS CNT_LW,4 ; LED ON FOR 0.5 SEC
GOTO SUCCESS ; LOOP BACK
CANCEL_LEARN
BCF FLAGS,LRNF ; CLEAR LEARN FLAG
BCF FLAGS,RELEARN ; CLEAR RELEARN FLAG
GOTO M_LOOP ; RETURN TO MAIN LOOP - LED OFF
;===========================================================================
; END OF FILE : SIMDEC10.ASM
;===========================================================================
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -