Procedura transmisji 1-Wire dla termometru DS1820 z mikrokontrolerem 8051

Re: DS1820 i AVR





Poprzedni Następny
Wiadomość
Spis treści
From: jareka1234_at_nospam_dawid.com.pl (Jaroslaw Andrzejewski)
Subject: Re: DS1820 i AVR
Date: Tue, 28 Mar 2000 07:22:36 GMT


Sat, 26 Feb 2000 01:26:25 +0100, Adam Dybkowski
<adybkows_at_nospam_amwaw.edu.pl> napisał(-a):

1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla 8051
mam nadzieję, że się przyda. Procedurki sprawdzone w boju ( t.zn. w
SPR w Jeleniej Górze :-)

#define STRONG_PULLUP P1.1
#define DALLAS_1WIRE P1.0

; procedura DS_RESET
; resetuje Dallasy na linii, czeka na "presence pulse"
; zwraca C=0 jesli ok
; zmienia R1
DS_RESET: setb STRONG_PULLUP
setb DALLAS_1WIRE
nop
clr DALLAS_1WIRE
; "RESET PULSE" stan niski przez 500us
mov R1, #249 ; 1us
delay500us: djnz R1, delay500us ; 249*2us = 498us
setb DALLAS_1WIRE ; 1us, razem 500us
; czekamy na "presence pulse", stan niski powinien pojawic sie w ciagu
; 15-60us i trwac 60-240us
; czekamy na stan niski
mov R1, #13 ; czekaj 13*5=65us
czekaj_tpdl: mov C, DALLAS_1WIRE ; 1us
jnc tpdl_ok ; 2us
djnz R1, czekaj_tpdl ; 2us
sjmp not_tpdl
; teraz czekamy na stan wysoki
tpdl_ok: mov R1, #50 ; czekaj 50*5=250us
czekaj_tpdh: mov C, DALLAS_1WIRE ; 1us
jc tpdh_ok ; 2us
djnz R1, czekaj_tpdh ; 2us
sjmp not_tpdh
tpdh_ok: clr C
ret
not_tpdl:
not_tpdh: setb C
ret

; DS_WRITE1 zapisuje 1 do Dallasa
; zmienia R1
DS_WRITE1: clr DALLAS_1WIRE
mov R1, #6 ; 1us
delay15us: djnz R1, delay15us ; 2us
setb DALLAS_1WIRE ; 1us, razem
1+6*2+1=14us
mov R1, #29 ; 1us
delay60us: djnz R1, delay60us ; 2us
ret ; 1us, razem
1+29*2+1=60us

; DS_WRITE0 zapisuje 0 do Dallasa
; zmienia R1
DS_WRITE0: clr DALLAS_1WIRE
mov R1, #35 ; 1us
delay70us: djnz R1, delay15us ; 2us
setb DALLAS_1WIRE ; 1us, razem
1+35*2+1=72us
nop ; 1us
ret ; 1us

; DS_READ czyta jeden bit z Dallasa
; zwraca ten bit w C
; zmienia R1
DS_READ: clr DALLAS_1WIRE
nop ; 1us
setb DALLAS_1WIRE ; 1us
nop ; 1us
mov C, DALLAS_1WIRE ; 1us
mov R1, #30 ; 1us
delay65us: djnz R1, delay65us ; 2us, razem
5*1+30*2=65us
ret

;napis_ERR1: .text "Blad CRC DS1920!$"
;napis_ERR2: .text "Brak DS1920!$"
;DALLAS_ERROR1: mov DPTR, #napis_ERR1
;DALLAS_ERROR: acall cls
; acall dispstr
; acall wait2s
; ret
;DALLAS_ERROR2: mov DPTR, #napis_ERR2
; sjmp DALLAS_ERROR

DS_POMIAR: acall DS_RESET
; jc DALLAS_ERROR2
acall DS_READ_ROM
; cjne R0, #0, DALLAS_ERROR1

acall DS_WRITE0
acall DS_WRITE0
acall DS_WRITE1
acall DS_WRITE0
acall DS_WRITE0
acall DS_WRITE0
acall DS_WRITE1
acall DS_WRITE0 ; 01000100 CONVERT T 44h
; UWAGA !!!
; NIE WOLNO ustawi jednocze×nie DALLAS_1WIRE = 0 i STRONG_PULLUP = 1
!!!
setb DALLAS_1WIRE
clr STRONG_PULLUP
acall wait2s
setb STRONG_PULLUP
acall DS_RESET
acall DS_READ_ROM

acall DS_WRITE0
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE0
acall DS_WRITE1 ; 10111110 READ SCRATCH PAD
BEh
acall DS_RD_1B
ret

; procedura DS_READ_ROM
; zmienia R3, R2, R1, R0, DPTR (ustawia na CRC_table)
; OK je×li równe CRC(R0) = 0
DS_READ_ROM: acall CRC_init
acall DS_WRITE1 ; 1
acall DS_WRITE1 ; 1
acall DS_WRITE0 ; 0
acall DS_WRITE0 ; 0
acall DS_WRITE1 ; 1
acall DS_WRITE1 ; 1
acall DS_WRITE0 ; 0
acall DS_WRITE0 ; 0 - 00110011 READ ROM 33h
mov R3, #8
ds_readrom: mov R2, #8
ds_readrom_B: acall DS_READ
rrc A
djnz R2, ds_readrom_B
acall LiczCRC_DS
djnz R3, ds_readrom
ret

DS_RD_1B: mov R2, #8
petlaDS1B: acall DS_READ
rrc A
djnz R2, petlaDS1B
ret

;DS_RD_8B: mov R3, #10
;petla_B: acall cls
; mov R2, #8
;petlaDS: acall DS_READ
; mov A, #'1'
; jc DS_skip
; mov A, #'0'
;DS_skip: acall dispchar
; djnz R2, petlaDS
; acall waitkey
; djnz R3, petla_B
; ret

wait2s: mov R1, #70
sek2_1: mov R2, #100
sek2_2: mov R3, #100
sek2_3: nop
djnz R3, sek2_3
djnz R2, sek2_2
djnz R1, sek2_1
ret

DS_POMIAR_START: acall DS_RESET
acall DS_READ_ROM
acall DS_WRITE0
acall DS_WRITE0
acall DS_WRITE1
acall DS_WRITE0
acall DS_WRITE0
acall DS_WRITE0
acall DS_WRITE1
acall DS_WRITE0 ; 01000100 CONVERT T 44h
; UWAGA !!!
; NIE WOLNO ustawi jednocze×nie DALLAS_1WIRE = 0 i STRONG_PULLUP = 1
!!!
setb DALLAS_1WIRE
clr STRONG_PULLUP
ret


DS_POMIAR_END: setb STRONG_PULLUP
acall DS_RESET
jc dspe_err
acall DS_READ_ROM
cjne R0, #0, dspe_err
acall DS_WRITE0
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE1
acall DS_WRITE0
acall DS_WRITE1 ; 10111110 READ SCRATCH PAD
BEh
acall DS_RD_1B
clr C
ret
dspe_err: setb C
ret

pierwsza wersja procedury CRC
; procedury CRC Dallasa
; UWAGA: CRC w rejestrze R0

; procedura CRC_init
CRC_init: mov R0, #0
ret

; licznie CRC dla jednego bajtu
; Arg w ACC, CRC w R0
; zmienia CRC
LiczCRC_DS: push ACC
push B
push ACC
mov B, #8
crc_loop: xrl A, R0
rrc A
mov A, R0
jnc zero
xrl A, #18h
zero: rrc A
mov R0, A
pop ACC
rr A
push ACC
djnz B, crc_loop
pop ACC
pop B
pop ACC
ret

wersja druga (z tablicš)

; procedura CRC_init
; zmienia DPTR, R0
CRC_init: mov DPTR, #crcTBL
mov R0, #0
ret

LiczCRC: xrl A, R0
movc A, _at_nospam_A+DPTR
mov R0, A
ret

crcTBL: .db 000h, 05Eh, 0BCh, 0E2h, 061h, 03Fh, 0DDh, 083h
.db 0C2h, 09Ch, 07Eh, 020h, 0A3h, 0FDh, 01Fh, 041h
.db 09Dh, 0C3h, 021h, 07Fh, 0FCh, 0A2h, 040h, 01Eh
.db 05Fh, 001h, 0E3h, 0BDh, 03Eh, 060h, 082h, 0DCh
.db 023h, 07Dh, 09Fh, 0C1h, 042h, 01Ch, 0FEh, 0A0h
.db 0E1h, 0BFh, 05Dh, 003h, 080h, 0DEh, 03Ch, 062h
.db 0BEh, 0E0h, 002h, 05Ch, 0DFh, 081h, 063h, 03Dh
.db 07Ch, 022h, 0C0h, 09Eh, 01Dh, 043h, 0A1h, 0FFh
.db 046h, 018h, 0FAh, 0A4h, 027h, 079h, 09Bh, 0C5h
.db 084h, 0DAh, 038h, 066h, 0E5h, 0BBh, 059h, 007h
.db 0DBh, 085h, 067h, 039h, 0BAh, 0E4h, 006h, 058h
.db 019h, 047h, 0A5h, 0FBh, 078h, 026h, 0C4h, 09Ah
.db 065h, 03Bh, 0D9h, 087h, 004h, 05Ah, 0B8h, 0E6h
.db 0A7h, 0F9h, 01Bh, 045h, 0C6h, 098h, 07Ah, 024h
.db 0F8h, 0A6h, 044h, 01Ah, 099h, 0C7h, 025h, 07Bh
.db 03Ah, 064h, 086h, 0D8h, 05Bh, 005h, 0E7h, 0B9h
.db 08Ch, 0D2h, 030h, 06Eh, 0EDh, 0B3h, 051h, 00Fh
.db 04Eh, 010h, 0F2h, 0ACh, 02Fh, 071h, 093h, 0CDh
.db 011h, 04Fh, 0ADh, 0F3h, 070h, 02Eh, 0CCh, 092h
.db 0D3h, 08Dh, 06Fh, 031h, 0B2h, 0ECh, 00Eh, 050h
.db 0AFh, 0F1h, 013h, 04Dh, 0CEh, 090h, 072h, 02Ch
.db 06Dh, 033h, 0D1h, 08Fh, 00Ch, 052h, 0B0h, 0EEh
.db 032h, 06Ch, 08Eh, 0D0h, 053h, 00Dh, 0EFh, 0B1h
.db 0F0h, 0AEh, 04Ch, 012h, 091h, 0CFh, 02Dh, 073h
.db 0CAh, 094h, 076h, 028h, 0ABh, 0F5h, 017h, 049h
.db 008h, 056h, 0B4h, 0EAh, 069h, 037h, 0D5h, 08Bh
.db 057h, 009h, 0EBh, 0B5h, 036h, 068h, 08Ah, 0D4h
.db 095h, 0CBh, 029h, 077h, 0F4h, 0AAh, 048h, 016h
.db 0E9h, 0B7h, 055h, 00Bh, 088h, 0D6h, 034h, 06Ah
.db 02Bh, 075h, 097h, 0C9h, 04Ah, 014h, 0F6h, 0A8h
.db 074h, 02Ah, 0C8h, 096h, 015h, 04Bh, 0A9h, 0F7h
.db 0B6h, 0E8h, 00Ah, 054h, 0D7h, 089h, 06Bh, 035h

--
Jarek Andrzejewski
(UWAGA: z adresu wytnij CYFRY - to jest pułapka na spamerów)