;
; 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
:
//
CBuild/
JavaScript 1.2-5.6/
Delifi6/
I2C /
AVR /
/
AHDL/
VHDL/
LPT EPP/ LPT ECP/ PCI/ COM port/ I2C/ RS-232/
Используются технологии uCoz
|