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

📄 hcs635.asm

📁 source for the microchip transponder for LF 125KHz.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	CALL	EEREAD		; READ BYTE FROM EEPROM
	MOVWF	INDF		; COPY INTO REQUIRED BUFFER
	DECF	FSR,F		; POINT TO NEXT BYTE IN BUFFER
	BTFSC	FSR,0		; IF NOT YET AT A
	BTFSS	FSR,1		; . 4 BYTE BOUNDARY
	GOTO	BLK_NEXT	; ... THEN READ NEXT BYTE
	RETLW	0

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION     	: EEREAD ()	      			
;
; DESCRIPTION  	: READ 8 BIT VALUE FROM INTERNAL EEPROM 
;
; PAGE		: 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
EEREAD1
	BTFSC	FLAGS,TX_NUM	; IF SECOND TRANSMITTER IS SELECTED
	IORLW	80H		; ... THEN MARK OFFSET REQUIRED FLAG

EEREAD0
	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

EEREAD
	BSF	STATUS,RP0	; Select Bank 1
	BSF	EECON1,RD	; Command read
	INCF	EEADR,F		; POINT TO NEXT ENTRY IN EEPROM
	MOVFW	EEDATA		; GET THE VALUE READ FROM EEPROM
	BCF	STATUS,RP0	; Select Bank 0
	RETURN			; RETURN 

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION     	: EEWRITE ()	      			
;
; DESCRIPTION  	: WRITE 8 BIT VALUE TO INTERNAL EEPROM 
;
; PAGE		: 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
EEWRITEI
	BSF	STATUS,RP0	; Select Bank 1
	BSF	FSR,5		; POINT TO DATA EEPROM
	MOVFW	INDF		; GET DATA AT INDIRECT POINTER
	DECF	EEADR,F		; FIX EEPROM ADDRESS FROM LAST INCREMENT

EEWRITE
	BSF	STATUS,RP0	; Select Bank 1
	MOVWF	EEDATA		; STORE NEW VALUE IN EEPROM DATA REGISTER
	BSF	EECON1,WREN		; Command Write Enable
	MOVLW	55H
	MOVWF	EECON2			; Write 55H
	MOVLW	0AAH
	MOVWF	EECON2			; Write AAH
	BSF	EECON1,WR		; Command Write

WR_WAIT
	CLRWDT
	BTFSC	EECON1,WR		; Wait for write to complete
	GOTO	WR_WAIT
	BCF	EECON1,WREN		; Disable writes
	INCF	EEADR,F		; POINT TO NEXT ADDRESS IN EEPROM
	BCF	STATUS,RP0		; Select Bank 0
	RETLW	0H

IFDEF	NoEncryption
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION     	: Get2ndSerialNumber ()	      			
;
; DESCRIPTION  	: Replace KeeLoq hopping code with value at KEY1 in EEPROM
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Get2ndSerialNumber
	bsf	STATUS,RP0	; select Bank 1
	bcf	STATUS,RP1
	movlw	EE_KEY		; GET OFFSET OF SEED IN EEPROM
	movwf	EEADR
	movlw	NSR0		; OFFSET TO Last BYTE KeyLoq buffer
	movwf	FSR
G2SN_0
	bsf	EECON1,RD	; EE read
	movfw	EEDAT
	movwf	INDF		; move KEY to Transmission Buffer
	incf	EEADR		; point to next EE byte
	incf	FSR		; point to next Trans Buffer
	btfss	FSR,2
	goto	G2SN_0		;  loop
	bcf	STATUS,RP0	; select Bank 0
	bcf	STATUS,RP1
	movfw	CNT2
	xorlw	0x70		; if buttons S0,S1, and S2 are not pressed,
	btfsc	STATUS,Z	;  then,
	goto	Send2ndSerialNumber	; send a 32-bit auxilary serial number
Send12bitVariable
	movfw	UserDefined
	movwf	NSR2
	movfw	UserDefined+1
	andlw	0x0F
	iorwf	CNT2,w
	movwf	NSR3
Send2ndSerialNumber
	RETLW	0H
ELSE
	#include Encrypt.inc
ENDIF
IFDEF	NoEncryption
CNTR_READ
	retlw	0
ELSE
	#include CounterCode.inc
ENDIF

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
;
; FUNCTION     	: DEBOUNCER ()
;
; DESCRIPTION  	: LOAD SYSTEM CONFIG, DEBOUNCE INPUTS, LOAD TRANSMITTER CONFIG
;
; PAGE		: 1
;
;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
DEBOUNCER

; ****** LOAD SYSTEM CONIGURATION FROM EEPROM *********************************

	MOVLW	EE_CFG2		; OFFSET OF LOWER BYTE OF SYSTEM CONFIG #1
	CALL	EEREAD0		; READ BYTE FROM EEPROM
	ANDLW	3FH		; MASK OUT LOWER 6 BITS
	MOVWF	SYSCFG1		; LOAD SYSTEM CONFIGURATION OPTIONS #1

	MOVLW	EE_CFG0		; OFFSET OF LOWER BYTE OF SYSTEM CONFIG #0
	CALL	EEREAD0		; READ BYTE FROM EEPROM
	ANDLW	3FH		; MASK OUT LOWER 6 BITS
	MOVWF	SYSCFG0		; LOAD SYSTEM CONFIGURATION OPTIONS #0

; ***** SETUP FUNCTION CODE BUTTON MASK REGISTER ***********

	BTFSS	RFENSEL		; IF RFEN SELECTED
	goto	$+3
	bsf	STATUS,RP0
	bcf	RFENtris	; ... THEN MAKE RFEN AN OUTPUT
	bsf	STATUS,RP0
	movfw	TRISA
	bcf	STATUS,RP0
	BTFSC	INDSEL		; IF SHIFT INPUT ENABLED
	ANDLW	B'00111011'	; ... THEN REMOVE SHIFT INPUT FROM BUTTON MASK
IFDEF P16F639
	andlw	b'00111101'	; take LFData Interrupt out of mask
ENDIF
	MOVWF	B_MASK		; LOAD BUTTON MASK REGISTER

; ****** CHECK FOR 20MS DEBOUNCE TIME ********

	MOVLW	3FH		; COMPENSATE FOR WAKEUP TIME & OVERHEAD = 6x8 = 48us
	MOVWF	TMR1H		; LOAD RTCC COUNTER WITH 3636H
	MOVWF	TMR1H		; TO SIMPLIFY 20MS TEST AT 4000H WITH ONLY .2% ERROR

; ****** DEBOUNCE BUTTON INPUTS *****************************************

DEBOUNCE1
	CALL	EEREAD		; DELAY WHILE UPDATING DC/DC OUTPUTS
	BTFSS	TMR1H,6		; CHECK IF WE REACHED 20MS BUTTON DEBOUNCE TIMEOUT
	GOTO	DEBOUNCE1	; ... NO, THEN CONTINUE WAITING

	CLRF	FLAGS		; START WITH ALL FLAGS CLEARED
IFDEF pullup
	BTFSS	SHIFT
ELSE
	BTFSC	SHIFT		; IF SHIFT BUTTON PRESSED
ENDIF
	BSF	FLAGS,TX_NUM	; ... THEN SAVE SELECTION

	BTFSS	RFENSEL		; IF RFEN OUTPUT ENABLED
	BTFSS	INDSEL		; . OR NOT DUAL TRANSMITTER 
	BCF	FLAGS,TX_NUM	; ... THEN FORCE TO FIRST TRANSMITTER

IFDEF pullup
	comf	PORTA,w
ELSE
	MOVFW	PORTA		; [1/1] READ GENERAL I/O PORT
ENDIF
	ANDWF	B_MASK,W	; MASK OUT THE FUNCTION CODE, SET Z IF NO BUTTON
	MOVWF	BUTTON		; STORE BUTTON CODE IN TEMP REGISTER

; ****** LOAD SYSTEM CONIGURATION FROM EEPROM *********************************

	MOVLW	EE_DISC		; OFFSET OF LOWER BYTE OF TX0'S CONFIGURATION
	CALL	EEREAD1		; READ BYTE FROM EEPROM
	bsf	STATUS,RP0
	RRF	EEDATA,F	; ROTATE BYTE READ FROM EEPROM
	RRF	EEDATA,W	; ROTATE BYTE READ FROM EEPROM
	bcf	STATUS,RP0
	ANDLW	03FH		; MASK OUT LOWER 6 BITS FROM BYTE
	MOVWF	TX_CFG0		; LOAD TRANSMITTER CONFIGURATION OPTIONS #1

	MOVLW	EE_CFG0		; OFFSET OF LOWER BYTE OF TX0'S CONFIGURATION
	BTFSC	FLAGS,TX_NUM	; CHECK IF SECOND TRANSMITTER IS SELECTED
	MOVLW	EE_CFG2		; ... YES, THEN USE TX1'S CONFIGURATION

	CALL	EEREAD0		; READ BYTE FROM EEPROM
	ANDLW	0C0H		; MASK OUT UPPER 2 BITS FROM BYTE
	IORWF	TX_CFG0,F	; COPY INT TRANSMITTER CONFIGURATION OPTIONS #0

	MOVLW	EE_CFG3		; OFFSET OF LOWER BYTE OF TX0'S CONFIGURATION
	BTFSC	FLAGS,TX_NUM	; CHECK IF SECOND TRANSMITTER IS SELECTED
	MOVLW	EE_CFG1		; ... YES, THEN USE TX1'S CONFIGURATION

	CALL	EEREAD0		; READ BYTE FROM EEPROM
	MOVWF	TX_CFG1		; LOAD TRANSMITTER CONFIGURATION OPTIONS #1
	
	MOVLW	EE_SEED		; OFFSET OF UPPER BYTE OF SEED TRANSMISSION
	CALL	EEREAD1		; READ BYTE FROM EEPROM

IFDEF P16F639
	btfss	ValidLFIFF	; if AFE initialsed OK, check data out pin
	goto	NoLFIFactive
	bcf	ValidLFIFF
	movlw	PKE_Code	; offset to PKE function code
	CALL	EEREAD0		; READ BYTE FROM EEPROM
	andlw	0x3C		; mask out all but PKE code
	movwf	BUTTON
	goto	XmitNOW		; else, ignore it
NoLFIFactive
ENDIF
	MOVFW	BUTTON		; GET BUTTON PRESSED
	ANDWF	B_MASK,W	; MASK OUT THE FUNCTION CODE, SET Z IF NO BUTTON
	
	BTFSC	STATUS,Z	; IF NO BUTTON PRESSED
	GOTO	M_SLEEP		; ... THEN RETURN TO SLEEP MODE

; ***** CHECK IF A SEED TRANSMISSION IS REQUIRED ***********

XmitNOW
	bsf	STATUS,RP0
	SWAPF	EEDATA,W	; GET BYTE READ FROM EEPROM
	bcf	STATUS,RP0
	ANDLW	0FH		; MASK SEED BITS OUT OF BUTTON CODE

	XORWF	BUTTON,W	; COMPARE WITH BUTTON PRESSED

	MOVLW	0F0H		; GET SEED OPTIONS MASK
	BTFSS	STATUS,Z	; IF NOT CORRECT BUTTON PRESS
	ANDWF	TX_CFG1,F	; ... THEN CLEAR SEED OPTIONS
	BTFSC	STATUS,Z	; ELSE
	BSF	FLAGS,SEEDNOW	;... SET SEND SEED TRANSIMISSION NOW FLAG

	BTFSS	SDTM0		; IF DELAYED SEED ENABLED WITH EITHER
	BTFSC	SDTM1		; . OF THE DELAY SEED BITS
	BCF	FLAGS,SEEDNOW	; ... THEN STOP SEED TX NOW

	BTFSC	SDMD		; IF PRODUCTION SEED MODE ENABLED
	BCF	FLAGS,SEEDNOW	; ... THEN STOP SEED TX NOW
	BSF	FLAGS,BUT_DWN	; SET BUTTON PRESSED FLAG
	BSF	FLAGS,VLOWBAT	; DISABLE LED UNTIL AFTER VLOW TEST
	
	clrf	QUEUE

	GOTO	MAIN		; START MAIN LOOP

IFDEF P16F639
;--------------
; SGAFE Specific 
ClampON		equ	0x00
ClampOFF	equ	0x20
EnterSLEEP	equ	0x40
AGCPresON	equ	0x60
AGCPresOFF	equ	0x80
SoftRESET	equ	0xA0
ReadCommand	equ	0xC0
WriteCommand	equ	0xE0

GeneralOptions	equ	0x00
LCXtune		equ	0x02
LCYtune		equ	0x04
LCZtune		equ	0x06
LCXLCYsens	equ	0x08
LCZsensMOD	equ	0x0A
ColParity	equ	0x0C
AFEStatus	equ	0x0E

;******************************************************************************************
; Analogue Front End Configuration Table
;******************************************************************************************
; SGAFE Default Register Values
;		Default Mode:Wake-up filter disabled. MODSIG= 0, Enable Ch-X only. 25% mod depth.
;	Register 0: 1010-0001 - 0 (parity)
	#define	AFEConfig0	b'101000001'	; filter=enabled --> 2ms+2ms

;	Register 1: 0000-0000 - 1 (parity) 
	#define	AFEConfig1	b'000000001'

;	Register 2: 0000-0000 - 1 (parity)
	#define	AFEConfig2	b'000000001'

;	Register 3: 0000-0000 - 1 (parity)
	#define	AFEConfig3	b'000000001'

;	Register 4: 0000-0000 - 1 (parity)
	#define	AFEConfig4	b'000000001'

;	Register 5: 0001-0000 - 0 (parity)
	#define	AFEConfig5	b'000100000'	; modulation depth, default = 75%

;	Register 6: 0100-1111 - 0 (Parity) ;  column parity bits
	#define	AFEConfig6	b'010011110'	; column parity at defalt mode (75%)

	ORG	((HIGH $)+1)*256
 ;--------------------------------------------------------------------------------------------------

Check_LFDATA_Pin
	BCF	STATUS,RP0	
	bcf	ValidLED	; turn on LED
	CLRF	TMR1H
	CLRF	TMR1L
	BSF	T1CON, TMR1ON	
First_LFDATA_Hi
	btfss	LFDATA		; Is the LFDATA input pin  high ?
	goto	timeout_hi
	goto	First_Lo_time_check
timeout_hi
	BTFSS	TMR1H,4		; SKIP IF GREATER THAN 6.5  msec long ?
	goto	First_LFDATA_Hi
	bsf	ValidLED	; turn off LED
	retlw	0x07		; time expired. Exit this loop
;-----------------------------------------
First_Lo_time_check
	CLRF	TMR1H
	CLRF	TMR1L
	BSF	T1CON, TMR1ON	

First_LFDATA_Lo
	btfsc	LFDATA		; yes, it was hi, now looking for lo (less than 4ms)
	goto	check_time_out
	goto	HIGH4ms
check_time_out
	BTFSS	TMR1H,4		; SKIP IF GREATER THAN 6.5  msec long ?
	goto	First_LFDATA_Lo
	bsf	ValidLED	; turn off LED
	retlw	0x08		; time expired. Exit this loop

HIGH4ms
Validate500uSLOW
;--------------------------------
		CLRF	TMR1H
		CLRF	TMR1L
		BSF	T1CON, TMR1ON
;--------------------------------
		movlw	.8
		movwf	TEMP2
;		movlw	.18		; 1 cycle 50us loop
		movlw	.07		; 1 cycle 50us loop
		movwf	TEMP1		; 1 cycle
	; time=((X*5)+7)*(1/(Fosc/4))
		btfsc	LFDATA		; 2 cycles
		goto	RecvLF_FAIL500us	; 2 cycles
		decfsz	TEMP1, f	; 1 cycle
		goto	$-3		; 2 cycles
		decfsz	TEMP2,f
		goto	$-7
Val_500uSLOW_hi
		btfss	LFDATA		; 2 cycles, wait for rising edge
		goto	check500us_timeover
		goto	Validate2mSheaderHIGH
check500us_timeover
		BTFSS	TMR1H,4		; SKIP IF GREATER THAN 6.5  msec long ?
		goto	Val_500uSLOW_hi	
		goto	RecvLF_FAIL500us	; 2 cycles
		
Validate2mSheaderHIGH
;--------------------------------
		CLRF	TMR1H
		CLRF	TMR1L
		BSF	T1CON, TMR1ON
;--------------------------------
		movlw	.37
		movwf	TEMP2
		movlw	.07		; 1 cycle 50us loop
		movwf	TEMP1		; 1 cycle
	; time=((X*5)+7)*(1/(Fosc/4))
		btfss	LFDATA		; 2 cycles
		goto	RecvLF_FAIL2msH	; 2 cycles
		decfsz	TEMP1, f	; 1 cycle
		goto	$-3		; 2 cycles
		decfsz	TEMP2,f
		goto	$-7
wait_2msHd_low
		btfsc	LFDATA		; 2 cycles, wait for falling edge
		goto	check2msHi_timeover	
		goto	Validate2mSheaderLOW	
check2msHi_timeover
		BTFSS	TMR1H,4		; SKIP IF GREATER THAN 6.5  msec long ?
		goto	wait_2msHd_low	
		goto	RecvLF_FAIL2msH	; 2 cycles

Validate2mSheaderLOW
;--------------------------------
		CLRF	TMR1H
		CLRF	TMR1L
		BSF	T1CON, TMR1ON
;--------------------------------
		movlw	.37
		movwf	TEMP2
		movlw	.05		; 1 cycle 50us loop
		movwf	TEMP1		; 1 cycle
	; time=((X*5)+7)*(1/(Fosc/4))
		btfsc	LFDATA		; 2 cycles
		goto	RecvLF_FAIL2msL	; 2 cycles
		decfsz	TEMP1, f	; 1 cycle
		goto	$-3		; 2 cycles
		decfsz	TEMP2,f
		goto	$-7
wait_startbit_hi
		btfss	LFDATA		; 2 cycles, wait for rising edge
		goto	check_2msLo_timeover
		goto	now_for_next_bits
check_2msLo_timeover
		BTFSS	TMR1H,4		; SKIP IF GREATER THAN 6.5  msec long ?
		goto	wait_startbit_hi
		goto	RecvLF_FAIL2msL	

now_for_next_bits
	clrf	RXTX_REG	; clear receive register
	movlw	.4		; number of bits to receive
	movwf	COUNTER		; load number of bits into counter register
	call	ReceiveNext
	movfw	RXTX_REG
	andlw	0xF0
	xorlw	0x50
	btfsc	STATUS,Z
	goto	Its_Correct_Data
	bsf	ValidLED		; turn off D5
	retlw	0x07
Its_Correct_Data
	bcf	LED		; turn on LED for correct LFDATA

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -