; ; Dallas TouchMemory routines ; (c) 1997 Pavel Korensky <pavelk@dator3.anet.cz> ; ; Freely usable for non-commercional use. ; Commercional use strictly prohibited ; ; DS_PORT equ PORTA ; Dallas port DS_BIT equ 4 ; Dallas bit ; ; Dallas TouchMemory commands - Touch Multikey specifically ; READ_ROM equ 0x33 SKIP_ROM equ 0xCC MATCH_ROM equ 0x55 WRITE_SCR equ 0x96 READ_SCR equ 0x69 COPY_SCR equ 0x3C WRITE_PSW equ 0x5A WRITE_SUB equ 0x99 READ_SUB equ 0x66 FAM_MULTIKEY equ 0x02 ;***************************************************************** ; ; Some macros ; ;***************************************************************** DSIN macro ; Set Dallas as input bsf STATUS, RP0 bsf TRISA,DS_BIT bcf STATUS, RP0 endm DSOUT macro ; Set Dallas as output - 1 bsf STATUS, RP0 bcf TRISA, DS_BIT bcf STATUS, RP0 bsf DS_PORT, DS_BIT endm ;************************************************************ ; ; Touch Memory routines ; ;************************************************************ ;************************************************************ ; ; Delay 67 us - For PRESENCE routine ; ;************************************************************ D67us: movlw 6 movwf del4 D67l_4 movlw 1 movwf del3 D67l_3 movlw 1 movwf del2 D67l_2 movlw 5 movwf del1 D67l_1 decfsz del1 goto D67l_1 decfsz del2 goto D67l_2 decfsz del3 goto D67l_3 decfsz del4 goto D67l_4 retlw 0 ;************************************************************ ; ; Delay 498 us - For RESET pulse ; ;************************************************************ D498us: movlw 1 movwf del4 D498l_4 movlw 1 movwf del3 D498l_3 movlw 0x4d movwf del2 D498l_2 movlw 4 movwf del1 D498l_1 decfsz del1 goto D498l_1 decfsz del2 goto D498l_2 decfsz del3 goto D498l_3 decfsz del4 goto D498l_4 retlw 0 ;************************************************************ ; ; Delay 2 us - Recovery time etc. ; ;************************************************************ D2us: nop retlw 0 ;************************************************************ ; ; Touch_Reset - Reset memory and check presence ; ; Return: 0 if memory not present, 1 if present, 3 if short circuit ; ;************************************************************ Touch_Reset DSOUT ; Set DS for output bcf DS_PORT, DS_BIT ; 0 to 1-wire call D498us ; wait tRSTL bsf DS_PORT, DS_BIT ; 1 to 1-wire DSIN ; Set DS for input call D67us ; wait tPDH btfsc DS_PORT, DS_BIT ; Presence pulse ? retlw 0 ; Return 0 if not call D498us ; Wait some time btfsc DS_PORT, DS_BIT ; 1-wire back HI ? retlw 1 ; return 1 if so retlw 2 ; Probably short circuit ;************************************************************* ; ; Write_DS_Byte - write byte from W to 1-wire ; ;************************************************************* Write_DS_Byte DSOUT ; Set DS for output movwf Temp1 ; store W movlw 8 movwf Temp ; 8 bits wdsb1: bcf DS_PORT, DS_BIT ; 0 to 1-wire call D2us ; wait 2 usec rrf Temp1,F ; rotate right skpnc ; if not carry, 0 to 1-wire bsf DS_PORT, DS_BIT call D67us ; wait 67 usec bsf DS_PORT, DS_BIT ; 1 to 1-wire call D2us ; wait tREC decfsz Temp goto wdsb1 ; loop for 8 bits DSIN ; Set DS for input retlw 0 ;************************************************************** ; ; Read_DS_Byte - read byte from DS to W ; ;************************************************************** Read_DS_Byte movlw 8 movwf Temp clrf Temp1 rdsb1: DSOUT ; set DS for output bcf DS_PORT, DS_BIT ; Start pulse call D2us ; wait DSIN nop nop ; wait a bit clrc ; clear carry btfsc DS_PORT, DS_BIT ; bit is 0 ? setc ; set carry if not rrf Temp1,F ; carry to Temp1 call D67us ; wait 67 usec decfsz Temp ; cycle for 8 bits goto rdsb1 movf Temp1,W ; byte to W return ;************************************************************************ ; ; DS_CRC8 - Will calculate 8 bit CRC for DALLAS DS components ; ; Input: Byte for CRC in W ; Return: Byte in W, CRC in CRC8 ;************************************************************************ DS_CRC8 movwf del2 movwf Temp ; Save byte movlw 8 ; 8 bits movwf Temp1 ; store counter movf Temp,W ; byte to W CRC8_L1 xorwf CRC8,W ; xor movwf del1 ; temp store rrf del1,W movf CRC8,W ; fetch last CRC skpnc ; if not C, skip xorlw 0x18 ; xor with fixed movwf CRC8 ; store new CRC rrf CRC8,F ; update new CRC clrc ; clear carry rrf Temp,F ; next bit movf Temp,W decfsz Temp1 ; count bits goto CRC8_L1 ; movf del2,W ; fetch original to W return ;************************************************************************* ; ; DS_CRC16 - Will calculate 16bit CRC for DALLAS DS components ; ; Input: Byte for CRC in W ; Output: Original byte in W, ; CRC16_HI and CRC16_LO new value of CRC16 ; ;************************************************************************* DS_CRC16 movwf del1 movwf Temp ; store W movlw 8 ; 8 bits movwf Temp1 movf Temp,W ; fetch W Crc_Get_Bit rrf Temp,F ; bit in C movf Temp,W ; value to W skpnc goto Crc_In_1 btfss CRC16_LO,0 ; lowest bit set ? goto Crc_Cont ; goto count with C=0 setc goto Crc_Cont ; goto count with C=1 Crc_In_1 btfsc CRC16_LO,0 ; lowest bit zero ? clrc ; if no, C=0 = complement Crc_Cont skpc goto Crc_Shift ; if C=0 only shift btfsc CRC16_HI,6 ; complement 15th bit of CRC goto Crc1 bsf CRC16_HI,6 ; if clear, set goto Crc2 Crc1 bcf CRC16_HI,6 ; if set, clear Crc2 btfsc CRC16_LO,1 ; complement 2nd bit of CRC goto Crc3 bsf CRC16_LO,1 goto Crc_Shift Crc3 bcf CRC16_LO,1 Crc_Shift rrf CRC16_HI,F ; 16bit rotate rrf CRC16_LO,F movf Temp,W decfsz Temp1 goto Crc_Get_Bit movf del1,W ; fetch the original byte return ;**************************************************************************** ; ; Get_DS_Serial - Get Key serial number to buffer ; ; Argument - W=start of buffer ; Return - W=0x01 OK, W=0x02 bad button ; ;**************************************************************************** Get_DS_Serial movwf FSR clrf CRC8 ; clear CRC8 movlw READ_ROM call Write_DS_Byte ; Read ROM call Read_DS_Byte ; Fam. code call DS_CRC8 movwf INDF incf FSR call Read_DS_Byte ; Ser 1 call DS_CRC8 movwf INDF incf FSR call Read_DS_Byte ; Ser 2 call DS_CRC8 movwf INDF incf FSR call Read_DS_Byte ; Ser 3 call DS_CRC8 movwf INDF incf FSR call Read_DS_Byte ; ser 4 call DS_CRC8 movwf INDF incf FSR call Read_DS_Byte ; ser 5 call DS_CRC8 movwf INDF incf FSR call Read_DS_Byte ; ser 6 call DS_CRC8 movwf INDF incf FSR call Read_DS_Byte ; CRC call DS_CRC8 movf CRC8,W ; CRC to W iorlw 0 ; is 0 ? skpz retlw 2 ; if not, error retlw 1 ; else OK
file: /Techref/microchip/davidtait/button.txt, 7KB, , updated: 2001/4/17 12:15, local time: 2025/4/28 00:23,
13.58.121.29:LOG IN
|
©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://massmind.org/tecHREF/microchip/davidtait/button.txt"> microchip davidtait button</A> |
Did you find what you needed? |
Welcome to massmind.org! |
The Backwoods Guide to Computer Lingo |
.