📄 hcs635.asm
字号:
BSF COMP,2 ; OVERHEAD COMPENSATION FOR LOOKING UP VLOW TRIP POINT
CALL TE_DELAY ; DO 1 TE DELAY
BTFSC LEDL ; IF SINGLE LED BLINK ON VLOW IS ENABLED
BCF LED ; ... YES, THEN SWITCH LED ON
BCF LEDL ; MARK THAT THE FIRST LED BLINK OCCURRED
BTFSC WSEL1 ; IF 33.3% DUTY CYCLE
CALL TE_DELAY ; ... THEN WAIT ANOTHER TE
BTFSC WSEL0 ; IF 16.6% DUTY CYCLE
CALL TE_DELAY ; ... THEN WAIT ANOTHER TE
BTFSC WSEL0 ; IF 16.7% DUTY CYCLE
CALL TE_DELAY ; ... THEN WAIT ANOTHER TE
BTFSC WSEL0 ; IF 16.7% DUTY CYCLE
CALL TE_DELAY ; ... THEN WAIT ANOTHER TE
BSF COMP,1 ; TURN OUTPUT OFF WITH CORRECT CALIBRATION TIME
BSF RFOUT ; SET RF OUTPUT HIGH
CALL TE_DELAY ; DO 1 TE DELAY
MOVLW D'3' ; PRELOAD A HEADER OF 4xTE
BTFSC HSEL ; CHECK IF HEADER OPTION BIT IS SET
MOVLW D'9' ; ... YES, THEN USE A HEADER OF 10xTE
BTFSS CLK_50,1 ; IF TIMED MODE COMPLETE SKIP TIME MODE TEST
BTFSC FLAGS,FIRST ; IF TIMED LONG PREAMBLE MODE
DECFSZ CNT1,F ; . OR NOT ALL PREAMBLE PULSES HAVE BEEN SENT
GOTO TX_PRE2 ; ... THEN DO NEXT PULSE
; ***** SEND TRANSMISSION'S HEADER BITS ********************
BSF COMP,1 ; TURN OUTPUT OFF WITH CORRECT CALIBRATION TIME
BCF RFOUT ; CLEAR RF OUTPUT LOW
CALL TE_DEL03 ; DO 1 TE DELAY
TX_SYNC2
BSF COMP,1
CALL TE_DELAY ; DO 1 TE DELAY
BSF FLAGS,FIRST ; FLAG THAT FIRST PREAMBLE HAS BEEN SENT
BSF CSR6,0 ; PRELOAD MANCHESTER/PPM START BIT INTO TRANSMIT BUFFER
MOVLW D'128' ; LOAD TOTAL NUMBER OF BITS TO TRANSMIT *2
BTFSC STRTSEL ; IF MANCHESTER/PPM START BIT REQUIRED
MOVLW D'130' ; ... THEN USE EXTRA START BIT
DECFSZ CNT3,F ; IF MORE HEADER TE CYCLES REQUIRED
GOTO TX_SYNC2 ; ... THEN DO NEXT
; ***** SET TRANSMISSION'S LENGTH ( 32 HOP + 32 FIX ) ******
CALL TX_BITS ; SEND TRANSMISSION BITS
MOVFW FLAGS ; GET VLOW BIT IN LSB
CALL TX_1BIT ; SEND VLOW BIT
BSF CNT1,2 ; PRELOAD TX BIT COUNTER FOR 2 BITS *2
MOVFW CRC ; GET CRC BITS
CALL TX_BITW ; SEND CRC BITS
BSF CNT1,2 ; PRELOAD TX BIT COUNTER FOR 2 BITS *2
MOVFW QUEUE ; GET QUEUE BITS
BTFSC QUEN ; IF THE QUEUE COUNTER IS ENABLED
CALL TX_BITW ; SEND QUEUE BITS
CLRF CNT1
BTFSC STRTSEL ; IF MANCHESTER/PPM STOP BIT REQUIRED
CALL TX_BITH ; ... THEN SEND STOP BIT
RETLW 0H
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION : MAIN ()
;
; DESCRIPTION : MAIN PROGRAM LOOP
;
; PAGE : 0
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
MAIN:
; ***** CONVERT BUTTON INPUTS TO FUNCTION CODE **************
BCF FLAGS,BUT_REL ; BUTTON NOT RELEASED YET
IFDEF P12F635
movfw BUTTON
movwf CNT2
bcf STATUS,C
rrf CNT2,F
rrf CNT2,F
SWAPF CNT2,W ; MOVE BUTTON COMBINATION INTO TRANSMIT POSITION
ENDIF
IFDEF P16F636
movfw BUTTON
btfss BUTTON,0
goto $+4
movlw S4_Button_Code ; offset to S4 function code
CALL EEREAD0 ; READ BYTE FROM EEPROM
andlw 0x3C ; mask out all but S4 code
btfss BUTTON,1
goto $+4
movlw S5_Button_Code ; offset to S5 function code
CALL EEREAD0 ; READ BYTE FROM EEPROM
andlw 0x3C ; mask out all but S5 code
movwf CNT2
bcf STATUS,C
rrf CNT2,F
rrf CNT2,F
SWAPF CNT2,W ; MOVE BUTTON COMBINATION INTO TRANSMIT POSITION
ENDIF
IFDEF P16F639
movfw BUTTON
btfss BUTTON,0
goto $+4
movlw S4_Button_Code ; offset to S4 function code
CALL EEREAD0 ; READ BYTE FROM EEPROM
andlw 0x3C ; mask out all but S4 code
; btfss BUTTON,1
; goto $+4
; movlw S5_Button_Code ; offset to S5 function code
; CALL EEREAD0 ; READ BYTE FROM EEPROM
; andlw 0x3C ; mask out all but S5 code
movwf CNT2
bcf STATUS,C
rrf CNT2,F
rrf CNT2,F
SWAPF CNT2,W ; MOVE BUTTON COMBINATION INTO TRANSMIT POSITION
ENDIF
ANDLW 0F0H ; GET RID OF GARBAGE BITS
MOVWF CNT2 ; STORE IN BANK INDEPENDENT MEMORY SPACE
BTFSC CNT2,7 ; IF S3 IS PRESSED
BSF CNT2,3 ; ... THEN SET OUT OF ORDER S3 BIT
RLF CNT2,F ; ROTATE THE BUTTON CODE INTO FINAL POSITION
BCF CNT2,0 ; GET RID OF BARBAGE FROM ROTATE
; ***** ASK/FSK PLL ENABLE MODE OPTION ********************
BTFSS PLLSEL ; CHECK IF FSK MODE SELECTED
BSF RFEN ; SWITCH RFEN LINE ON IF IT IS AN OUTPUT (HCS365 OPTION)
BTFSC PLLSEL ; CHECK IF ASK MODE SELECTED
BSF RFOUT ; SET RF OUTPUT HIGH
; ***** INCREASE 16 BIT RAM SYNC COUNTER AND LOAD DISCRIMINATION BITS ***
MOVFW SYSCFG0 ; GET COUNTER SELECT (16/20 BIT) OPTION
CALL CNTR_READ ; READ COUNTER, TEST LIMITED SEED, INCREMENT
; ***** ENCRYPT HOPCODE PORTION OF TRANSMISSION ************
IFDEF NoEncryption
call Get2ndSerialNumber
ELSE
CALL ENCRYPT0 ; ENCRYPT COUNTER & DISCRIM VALUE WITH TX# KEY
ENDIF
; ***** LOAD SERIAL NUMBER AND FUNCTION CODE *****
CALL COPY_SER ; COPY TX# SERIAL NUMBER INTO TRANSMISSION BUFFER
BTFSC XSER ; IF THE EXTENDED SERIAL NUMBER OPTION IS NOT SET
GOTO M_SEED ; ... THEN SKIP INSERTING BUTTON CODE
MOVLW 0FH ; MASK FOR UNENCRYPTED BUTTON CODE
ANDWF NSR7,W ; FORCE MSN OF SERIAL NUMBER TO ZERO
IORWF CNT2,W ; GET BUILD FUNCTION NIBBLE
MOVWF NSR7 ; STORE READY TO TRANSMIT
; ***** SEND SEED TRANSMISSION INSTEAD OF HOPPING CODE *****
M_SEED
BTFSS FLAGS,SEEDNOW ; IF NOT SEED TRANSMISSION
GOTO M_START ; ... THEN SKIP LOADING SEED
M_SEED1
BCF FLAGS,DO_GUARD ; DO NOT WAIT FOR GUARD TIME ON FIRST SEED
MOVLW 0F0H ; GET SEED OPTIONS MASK
ANDWF TX_CFG1,F ; CLEAR SEED OPTIONS TO PREVENT RELOADING SEED
MOVLW NSR7 ; OFFSET OF SERIAL NUMBER IN CSR BUFFER
MOVWF FSR ; LOAD FILE SELECT REGISTER AND BANK #1
MOVLW EE_SEED ; GET OFFSET OF SEED IN EEPROM
CALL BLK_ADDR ; COPY FIRST 4 SEED BYTES INTO TX BUFFER
CALL BLK_NEXT ; COPY SECOND 4 SEED BYTES INTO TX BUFFER
MOVLW 0F0H ; FORCE FUNC CODE TO BE 1111
IORWF NSR7,F ; COPY BUTTON CODE INTO CSR BUFFER
; ***** RESET TIMER AND STORE EVENT TIME AS LED TIME ON ****
M_START
BCF FLAGS,SEEDNOW ; MTX NOT COMPLETE, END OF SEED DETECT
; ***** SET THE MININUM NUMBER OF CODEWORDS ****************
MOVLW 1H ; PRELOAD MINIMUM CODEWORDS WITH 1
BTFSC MTX1 ; IF MSB OF MTX OPTION SET
MOVLW 4H ; ... THEN PRELOAD MINIMUM CODEWORDS WITH 4
MOVWF CNT0 ; LOAD LOOP COUNTER
BTFSC MTX0 ; IF LSB OF MTX OPTION SET
ADDWF CNT0,F ; ... THEN DOUBLE THE COUNTER
; ***** RESET TIMERS ***************************************
CLRF TMR1L ; RESET REAL TIME CLOCK TO MARK LED SWITCH ON
CLRF TMR1H ; RESET REAL TIME CLOCK TO MARK LED SWITCH ON
CLRF CLK_50 ; RESET 50MS CLOCK COUNTER
CLRF CLK_LED ; RESET LED FLASH CLOCK COUNTER
CLRF CLK_HI ; RESET 50MS OVERFLOW COUNTER
MOVLW D'48' ; SET 10MS TE LOW DEBOUNCE
BTFSC BSL1 ; CHECK IF BSL1 BIT IS SET
MOVLW D'12' ; SET 10MS TE LOW DEBOUNCE
MOVWF CSR5
BTFSS BSL0 ; CHECK IF BSL0 BIT IS SET
ADDWF CSR5,F ; YES, THEN FIX 5MS DEBOUNCE
M_TIME
BTFSS FLAGS,DO_GUARD ; IF FIRST TRANSMISSION NOT COMPLETED
GOTO M_TRANS ; ... THEN SKIP OVER GUARD TIME
; ***** SETUP GUARD TIME OUT PERIOD ************************
BTFSC GSEL1 ; IF MSB OF GUARD SELECT BITS SET
GOTO M_GUARD ; ... THEN JUMP TO LONG PREAMBLE SECTION
MOVLW D'32' ; LOAD TIME OUT FOR 6.4MS
BTFSC GSEL0 ; IF LSB OF GUARD SELECT BITS SET
GOTO M_GUARD1 ; ... THEN WAIT FOR 32 x 200US = 6.4MS
CALL TE_DELAY ; WAIT FOR ONE RF TE CYCLE
CALL TE_DELAY ; WAIT FOR ONE RF TE CYCLE
GOTO M_TRANS ; JUMP OVER OTHER DELAY OPTIONS
M_GUARD
MOVLW 0 ; PRELOAD COUNTER FOR 245
CALL DLY_200US ; WAIT 256*200US = 51.2MS
BTFSC GSEL0 ; IF LSB OF GUARD SELECT BITS SET
M_GUARD1
CALL DLY_200US ; WAIT ANOTHER 256*200US, TOTAL = 102.4MS
; the lines below were moved from their previous position to improve the time before seed
; precision.
MOVLW D'8' ; DEFAULT DELAYED SEED TIME
BTFSC SDTM1 ; IF MSB OF SDTM SET
MOVLW D'32' ; ... THEN DO 4X TE
MOVWF TEMP ; STORE TE MULTIPLIER TEMPORARILY
BTFSC SDTM0 ; IF LSB OF SDTM SET
ADDWF TEMP,F ; ... THEN DOUBLE TE
MOVFW TEMP
BCF STATUS,C ; CLEAR CARRY BIT
BTFSS TEMP,3 ; IF SDTM IS NOT 00
SUBWF CLK_50,W ; ... TEST IF CURRENT TIME GREATER THAN SEED TIME
BTFSC STATUS,C ; IF SDTM IS NOT 00 AND TIME IS > SEED TIME
GOTO M_SEED1 ; ... THEN PREPARE AND SEND SEED
; ***** SEND TRANSMISSION OUT ON RFOUT PIN *****************
M_TRANS
BSF FLAGS,DO_GUARD ; MAKE SURE THAT WE DO A GUARD TIME ON FUTURE TX
CALL TRANSMIT ; SEND TRANSMISSION OUT ON RFOUT PIN
; ***** CHECK IF TRANSMISSION TIMEOUT REACHED **************
; MOVLW D'8' ; DEFAULT DELAYED SEED TIME
; BTFSC SDTM1 ; IF MSB OF SDTM SET
; MOVLW D'32' ; ... THEN DO 4X TE
; MOVWF TEMP ; STORE TE MULTIPLIER TEMPORARILY
; BTFSC SDTM0 ; IF LSB OF SDTM SET
; ADDWF TEMP,F ; ... THEN DOUBLE TE
; MOVFW TEMP
; BCF STATUS,C ; CLEAR CARRY BIT
;
; BTFSS TEMP,3 ; IF SDTM IS NOT 00
; SUBWF CLK_50,W ; ... TEST IF CURRENT TIME GREATER THAN SEED TIME
; CALL VLOW_DELAY ; ADD A LITTLE TIME BEFORE CLEARING OUTPUT
; BCF PORTB,RFOUT ; CLEAR RF OUTPUT LOW FOR VPWM
; BTFSC STATUS,C ; IF SDTM IS NOT 00 AND TIME IS > SEED TIME
; GOTO M_SEED1 ; ... THEN PREPARE AND SEND SEED
;M_OUT1
RLF CLK_50,W ; GET THE 50MS CLOCK COUNTER * 2
ANDLW 0F0H ; GET RID OF LOWER NIBBLE
MOVWF TEMP ; STORE IN TEMP REGISTER
SWAPF TEMP,F ; DIVIDE BY 16
SWAPF CLK_HI,W ; GET UPPER NIBBLE FROM OVERFLOW REGISTER
IORWF TEMP,F ; STORE NEW COUNTER OF 400MS TICKS SINCE POWERUP
;MOVLW 0AH DEFAULT TEST FOR 4 SECOND TIMEOUT
;BTFSC TSEL1 IF 16 OR 32 SECOND TIMEOUT
;MOVLW 28H ... THEN TEST FOR 16 SECOND TIMEOUT
;SUBWF TEMP,F SUBTRACT FROM CUMLATIVE TIME
;BTFSC TSEL0 IF 8 OR 32 SECOND TIMEOUT
;SUBWF TEMP,F ... THEN SUBTRACT AGAIN
movlw 2 ; .8s timeout
btfsc TSEL0 ; 3.2s timeout
movlw 8
subwf TEMP,F
movlw 30 ;12.8s timeout
btfsc TSEL0
movlw 56 ;25.6s timeout
nop ;
bcf RFOUT ; CLEAR RF OUTPUT LOW FOR VPWM
btfsc TSEL1
subwf TEMP,F
BTFSS TEMP,7 ; IF TIMEOUT TIME REACHED (TEMP>=0)
GOTO M_SLEEP ; ... THEN TERMINATE TRANSMISSIONS
M_QUE0
BTFSC BUTTON,7 ; WAS THE DOUBLE PRESS BIT CLEAR
BTFSS QUEN ; . OR THE QUEUEING DISABLED
GOTO M_QUE2 ; ... THEN FINISH MIN CODEWORDS
M_QUE
bcf FLAGS,DO_GUARD ; eliminate first guard time delay after new queue button
BCF BUTTON,7 ; CLEAR THE DOUBLE PRESS BIT
INCF QUEUE,F ; INCREMENT QUEUE COUNTER
BTFSC QUEUE,2 ; IF THE COUNTER > 3
DECF QUEUE,F ; ... THEN COUNTER = 3
GOTO MAIN ; DO THE NEXT SET OF CODEWORD TRANSMISSIONS
M_QUE2
DECFSZ CNT0,F ; CHECK IF MININUM CODE WORDS COMPLETED
GOTO M_TIME ; ... NO, THEN SEND NEXT CODE WORD
INCF CNT0,F ; KEEP RECOGNIZING MTX COMPLETE NEXT LOOP
BTFSC SDMD ; IF IN PRODUCTION MODE AND SEED BUTTON AND COUNT<128
GOTO M_SEED1 ; ... THEN PREPARE AND SEND SEED
BTFSC BUTTON,7 ; IF DOUBLE PRESS BUT QUEUEING DISABLED
GOTO M_QUE ; ... THEN DO QUEUED TRANSMISSION NOW
BTFSS FLAGS,BUT_REL ; IF THE BUTTON IS STILL PRESSED
GOTO M_TIME ; ... THEN KEEP ON TRANSMITTING
MOVFW BUTTON ; GET BUTTON CODE TRANSMITTED
BTFSS STATUS,Z ; IF DOING LF CODE HOPPING COMMAND
BTFSS QUEN ; . OR QUEUEING IS DISABLED
GOTO M_SLEEP ; ... THEN SHUTDOWN THE DEVICE
bcf FLAGS,FIRST ; to do a new wake-up when queue buttons are after MTX
MOVLW 1
MOVWF PORTA ; SWITCH LED AND STEP UP REGULATOR OFF
BCF RFEN ; TURN OFF RFEN
MOVLW D'192' ; SET UP 2 SECOND DELAY
MOVWF CNT0 ; COUNTER
M_QUE3
CLRF CNT2 ; MAKE DELAY 10.4 MILLISECONDS
M_QUE4
GOTO $+1 ; WASTE TIME
DECFSZ CNT2,1 ; IF MORE LOOPS REQUIRED
GOTO M_QUE4 ; ... THEN DO NEXT
CALL TE_DEL30 ; CHECK FOR BUTTONS
BTFSC BUTTON,7 ; IF DOUBLE BUTTON PRESS
GOTO M_QUE0 ; ... THEN GOTO STOP LOOPING
DECFSZ CNT0,F ; IF MORE LOOPS REQUIRED
GOTO M_QUE3 ; ... THEN KEEP ON LOOPING
; ***** ENTER SLEEP/SHUTDOWN MODE **************************
M_SLEEP
bsf LED ; SWITCH LED OFF
IFDEF P16F639
bsf ValidLED ; turn off LED
ENDIF
bcf RFEN ; SWITCH RFEN OFF
MOVFW PORTA ; MAKE SLEEP OUTPUT HIGH, SETUP WAKEUP LATCHES
bcf INTCON,RAIF
bsf INTCON,RAIE
IFNDEF ICEmul
sleep
ENDIF
IFDEF ICEmul
btfss INTCON,RAIF
goto $-1
ENDIF
nop
bcf INTCON,RAIF
bcf INTCON,RAIE
IFDEF P16F639
bcf ValidLFIFF
btfss AFEOK ; if AFE initialsed OK, check data out pin
goto NoLFWakeUp ; else, ignore it
btfss LFDATA ; check to see if LF data pin high
goto NoLFWakeUp
call Check_LFDATA_Pin
xorlw 0xAA ; if return value indicates a LF event
btfsc STATUS,Z
bsf ValidLFIFF
NoLFWakeUp
goto NEWBUTTON
ELSE
goto RESET
ENDIF
FILL (SLEEP), COPY_SER-$
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
; PAGE #1
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
ORG 200H
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION : COPY_SER ()
;
; DESCRIPTION : COPY SERIAL NUMBER IN TRANSMISSION BUFFER
;
; PAGE : 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
COPY_SER
MOVLW NSR7 ; OFFSET OF SERIAL NUMBER IN CSR BUFFER
MOVWF FSR ; LOAD FILE SELECT REGISTER
MOVLW EE_SER ; GET OFFSET OF SERIAL NUMBER IN EEPROM
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION : BLK_READ ()
;
; DESCRIPTION : READ BLOCK OF UP TO 4 BYTES OF DATA FROM EEPROM
;
; PAGE : 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
BLK_ADDR
BTFSC FLAGS,TX_NUM ; CHECK IF SECOND TRANSMITTER IS SELECTED
IORLW 80H ; ... THEN MARK OFFSET REQUIRED FLAG
BLK_READ
BSF STATUS,RP0 ; Select Bank 1
MOVWF EEADR ; SET EEPROM ADDRESS POINTER
MOVLW 96H ; GET EEPROM OFFSET + 80H FOR SECOND TRANSMITTER
BTFSC EEADR,7 ; IF OFFSET REQUIRED
ADDWF EEADR,F ; ... THEN ADD OFFSET AND CLEAR OFFSET FLAG
BLK_NEXT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -