;************************************************************************/ ;* */ ;* Access Dallas 1-Wire Devices */ ;* */ ;* Author: Peter Dannegger */ ;* danni@specs.de */ ;* */ ;************************************************************************/ $nosb xtal equ 11059 ;11059kHz w1_dio equ p2.3 w1w15 equ ( xtal + 799 ) / 800 ; 15 * xtal / 12000 w1w60 equ ( xtal + 199 ) / 200 ; 60 * xtal / 12000 w1w480 equ ( xtal + 24 ) / 25 ; 480 * xtal / 12000 w1w66 equ ( xtal + 181 ) / 182 ; 66 * xtal / 12000 MATCH_ROM equ 055h SKIP_ROM equ 0CCh SEARCH_ROM equ 0F0h SEARCH_FIRST equ 0FFh ; start new search PRESENCE_ERR equ 0FFh DATA_ERR equ 0FFh LAST_DEVICE equ 000h ; 001 ... 040: continue searching dseg at 30h romcode: ds 8 cseg ;****************************** Generate a 1-Wire reset *****************/ ;Input none ;Output CY = 1, if no 1-wire device found ;Used R2, CY ;Stack 2 ; w1_reset: mov r2, #w1w480 / 4 ;480 < t < 960 ?w1r1: clr w1_dio nop djnz r2, ?w1r1 clr ea setb w1_dio mov r2, #w1w66 / 2 ;60 < t < 75 djnz r2, $ mov c, w1_dio setb ea mov r2, #(w1w480 - w1w66) / 4 ;480 < t ?w1r2: nop nop djnz r2, ?w1r2 orl c, /w1_dio ret ;****************************** Read / Write Bit on 1-wire **************/ ;Input CY = bit ;Output CY = bit ;Used R2, CY ;Stack 2 ; w1_bit_rd: setb c w1_bit_wr: w1_bit_io: clr ea clr w1_dio mov r2, #w1w15 / 2 - 2 mov w1_dio, c djnz r2, $ ; t < 15 ! mov c, w1_dio ; sample within 15us mov r2, #(w1w60 - w1w15) / 2 djnz r2, $ setb w1_dio setb ea ret ;****************************** Read / Write byte ***********************/ ;Input A = byte ;Output A = byte ;Used R2, R3, ACC, CY ;Stack 4 ; w1_byte_rd: mov a, #0FFh w1_byte_wr: mov r3, #8 ?w1wr1: rrc a ; lsb first call w1_bit_io djnz r7, ?w1wr1 rrc a ; last bit in ret ;****************************** ROM Search ******************************/ ;Input R7 = bit to resolve ;Output R7 = next bit to resolve ;Used R0, R2, R3, R4, R5, R6, ACC, CY, F0 ;Stack 6 ; w1_rom_search: mov r0, #romcode mov r5, a call w1_reset mov a, #presence_err jc ?wrs7 mov a, #search_rom call w1_byte_wr mov r3, #last_device mov r4, #9 * 8 ?wrs1: mov r6, #8 ?wrs2: call w1_bit_rd mov f0, c call w1_bit_rd jnb f0, ?wrs3 jnc ?wrs5 ; bit = 1 mov a, #data_err ret ?wrs3: jc ?wrs5 ; bit = 0 mov a, r4 subb a, r5 jz ?wrs6 ; bit = 0 jc ?wrs4 ; bit = 1, resolve mov a, @r0 jnb acc.0, ?wrs6 ; bit = 0 ?wrs4: clr c mov a, r4 mov r3, a ?wrs5: cpl c ?wrs6: mov a, @r0 rrc a mov @r0, a rlc a call w1_bit_wr dec r4 djnz r6, ?wrs2 inc r0 djnz r4, ?wrs1 mov a, r3 ?wrs7: ret ;****************************** send command ****************************/ ;Input A = command ;Output none ;Used R0, R2, R3, R4, R5, ACC, CY ;Stack 6 ; w1_skip_command: mov r4, #1 sjmp ?wco1 w1_match_command: mov r4, #9 mov r0, #romcode ?wco1: mov r5, a call w1_reset mov a, #match_rom cjne r4, #1, ?wco1 mov a, #skip_rom ?wco2: call w1_byte_wr mov a, @r0 inc r0 djnz r4, ?wco2 mov a, r5 jmp w1_byte_wr ;------------------------------------------------------------------------- END