DS1820 i 8051



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: <belamy_at_nospam_free.net.pl>
Subject: DS1820 i 8051
Date: Thu, 24 Feb 2000 18:30:12 GMT


1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla 8051
???
2. CZy da sie to zrobic tylko przez dwa przewody:
DS1820 GND <-----> 8051 GND
DS1820 DATA <-----> 8051 P1.0
???


--
Rafal Kolano
belamy_at_nospam_free.net.pl




Poprzedni Następny
Wiadomość
Spis treści
From: "bunghole" <dudzinski.m_at_nospam_relpol.com.pl>
Subject: Odp: DS1820 i 8051
Date: Fri, 25 Feb 2000 03:07:25 GMT


w basic'u BASCOM 8051 jest taki rozkaz - polecam , jest na ftp ep.com.pl
-----------------------
Użytkownik <belamy_at_nospam_free.net.pl> w wiadomości do grup dyskusyjnych
napisał:UMet4.1486$WD.33805_at_nospam_news.tpnet.pl...
1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla 8051
???
2. CZy da sie to zrobic tylko przez dwa przewody:
DS1820 GND <-----> 8051 GND
DS1820 DATA <-----> 8051 P1.0
???


--
> Rafal Kolano
> belamy_at_nospam_free.net.pl
>
>
>



Poprzedni Następny
Wiadomość
Spis treści
From: jareka1234_at_nospam_dawid.com.pl (Jaroslaw Andrzejewski)
Subject: Re: DS1820 i 8051 (0/1)
Date: Fri, 25 Feb 2000 08:19:42 GMT


Thu, 24 Feb 2000 18:30:12 GMT, <belamy_at_nospam_free.net.pl> napisał(-a):

1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla 8051
???
2. CZy da sie to zrobic tylko przez dwa przewody:
DS1820 GND <-----> 8051 GND
DS1820 DATA <-----> 8051 P1.0
AFAIK nie, bo DS1820 potrzebuje zasilania na czas konwersji. Dallas
proponuje aby +5V dołšczyć przez dodatkowy tranzystor PNP podczas
konwersji.
Procedurki załšczam (mam nadzieję, że "cancel-bot" nie wytnie
załšcznika TXT.

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

Poprzedni Następny
Wiadomość
Spis treści
From: jareka1234_at_nospam_dawid.com.pl (Jaroslaw Andrzejewski)
Subject: Re: DS1820 i 8051
Date: Fri, 25 Feb 2000 08:22:12 GMT


Thu, 24 Feb 2000 18:30:12 GMT, <belamy_at_nospam_free.net.pl> napisał(-a):

1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla 8051
???
2. CZy da sie to zrobic tylko przez dwa przewody:
DS1820 GND <-----> 8051 GND
DS1820 DATA <-----> 8051 P1.0
AFAIK nie, bo DS1820 potrzebuje zasilania na czas konwersji. Dallas
proponuje aby +5V dołšczyć przez dodatkowy tranzystor PNP podczas
konwersji.
Procedurki załšczam. Ponieważ "cancel-bot" wycina nawet załšczniki
TXT, więc poniżej tekst:

; 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

; 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

#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

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

Poprzedni Następny
Wiadomość
Spis treści
From: "Damian" <damianos_at_nospam_box43.gnet.pl>
Subject: Re: DS1820 i AVR
Date: Fri, 25 Feb 2000 15:04:11 +0100


A ma ktoś takš procedurkę dla AVRów?

--
Damian
damianos_at_nospam_box43.gnet.pl

Użytkownik <belamy_at_nospam_free.net.pl> w wiadomości do grup dyskusyjnych
napisał:UMet4.1486$WD.33805_at_nospam_news.tpnet.pl...
> 1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla 8051
> ???
> 2. CZy da sie to zrobic tylko przez dwa przewody:
> DS1820 GND <-----> 8051 GND
> DS1820 DATA <-----> 8051 P1.0
> ???
>
>
> --
> Rafal Kolano
> belamy_at_nospam_free.net.pl
>
>
>



Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: DS1820 i AVR
Date: Sat, 26 Feb 2000 01:26:25 +0100


Damian wrote:

1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla 8051
???
2. CZy da sie to zrobic tylko przez dwa przewody:
DS1820 GND <-----> 8051 GND
DS1820 DATA <-----> 8051 P1.0
???

A ma ktoś takš procedurkę dla AVRów?

Nie, ale moge przerobic z '51. Kiedys CRC Dallasowe juz optymalizowalem
(pod katem DS1990A) i w AVRze dalo sie zapisac krocej (upychalem pod
katem zajetosci pamieci - wersje z petla a nie z 256-bajtowa tabela).

BTW: To chyba tak samo sie steruje jak inne 1-wire (mam kod do DS1990A)
?

--

Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows

Poprzedni Następny
Wiadomość
Spis treści
From: "Damian" <damianos_at_nospam_box43.gnet.pl>
Subject: Re: DS1820 i AVR
Date: Sun, 27 Feb 2000 14:19:15 +0100


Oki, czy mógłbyś przesłać mi na priva ten do DS1990A

Wielkie dzięki

--
Damian
damianos_at_nospam_box43.gnet.pl

Użytkownik Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl> w wiadomości do grup
dyskusyjnych napisał:38B71DB1.7D457E99_at_nospam_amwaw.edu.pl...
> Damian wrote:
>
> > > 1.Czy ktos ma procedurke transmisji do termometru Dallasa DS1820 dla
8051
> > > ???
> > > 2. CZy da sie to zrobic tylko przez dwa przewody:
> > > DS1820 GND <-----> 8051 GND
> > > DS1820 DATA <-----> 8051 P1.0
> > > ???
>
> > A ma ktoś takš procedurkę dla AVRów?
>
> Nie, ale moge przerobic z '51. Kiedys CRC Dallasowe juz optymalizowalem
> (pod katem DS1990A) i w AVRze dalo sie zapisac krocej (upychalem pod
> katem zajetosci pamieci - wersje z petla a nie z 256-bajtowa tabela).
>
> BTW: To chyba tak samo sie steruje jak inne 1-wire (mam kod do DS1990A)
> ?
>
> --
>
> Adam Dybkowski
> adybkows_at_nospam_amwaw.edu.pl
> http://www.amwaw.edu.pl/~adybkows



Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: DS1820 i AVR
Date: Sun, 27 Feb 2000 23:52:26 +0100


Damian wrote:

Oki, czy mógłbyś przesłać mi na priva ten do DS1990A

Polecialo (na priva).

--

Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows