⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcs635.asm

📁 source for the microchip transponder for LF 125KHz.
💻 ASM
📖 第 1 页 / 共 5 页
字号:

	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 + -