teplotni cidlo 18b20

JD jirkonf@seznam.cz
Úterý Leden 16 16:31:29 CET 2007


Tohle je pro 89C(S)51, je to cast kodu co mam v zesilovaci (DS meri 
teplotu koncaku a podle toho se ridi otacky ventilatoru). Dsio je pin na 
ktery je pripojeny DS18B20, casovani je pro xtal 12.288MHz. Kdyztak 
kompletni zdrojak pro ten zes sem dal sem 
http://buger.czechian.net/_data/v229.zip schema 
http://buger.czechian.net/_data/schema.gif - ve schematu neni zakreslene 
pripojeni DS a vetraku, DS je pripojeno na napajeni a jeho komunikacni 
pin je pripojeny na P2.4 s pullupem tusim 4k7 nebo 10k (nechce se mi to 
ted rozdelavat), vetrak pres spinaci T na P2.2. Zkousel sem i 
dvouvodicove pripojeni DS (sice sem ho nepotreboval, ale chtel sem si to 
vyzkouset), proto jsou v programu zakomentovane radky ovladajici bit 
dspullup. Pullup byl realizovan jako spinaci T ovladany z P2.3.

Omlouvam se vsem, kterym pohled na zdrojak nebo schema zpusobi 
jakoukoliv psychickou ujmu, ale na tomhle sem se x51 ucil a cely ten 
program vznikal (upravoval se, atd...) postupne nekolik let, takze uz je 
v tom dost zmatek. Chystam se to cele prekopat, ale zatim sem se k tomu 
nejak nedostal (kdyz ono to funguje, sice obcas ne uplne presne jak sem 
chtel, ...) . Kovarova kobyla...

JDrozd

;-------------------------------------------------
;obsluha DS18B20
;-------------------------------------------------


;inicializace DS
ds_init:        clr     dserr
                 ;setb    dspullup        ;vypnuti pullupu
                 mov     r4,ie           ;ulozit nastaveni preruseni
                 clr     ea              ;zakazat vsechna preruseni
;reset puls
ds_rpu:         clr     dsio
                 clr     a
;cekat > 480us
ds_rwait:       nop
                 nop
                 djnz    acc,ds_rwait
                 setb    dsio
;pockat 70us (72 cyklu)
                 mov     a,#36d
                 djnz    acc,$           ;jedna trva 2cykly

                 jnb     dsio,ds_ok1     ;precist presence pulse
                 setb    dserr           ;pokud nebyl, nastav bit dserr

; pockat jeste alespon 410us
ds_ok1:         mov     ie,r4           ;obnovit preruseni
                 clr     a
ds_w1:          nop
                 djnz    acc,ds_w1
                 ret



;poslani 1B do DS z A
ds_wr:          clr     dserr
                 mov     r6,#8           ;bude se prenaset 8bitu
ds_wrloop:      ;setb    dspullup        ;vypnout pullup
                 ;da se pouzit pro poslani 1bitu (ACC.0), v R6 musi byt #1
                 mov     r4,ie           ;ulozit nastaveni preruseni
                 clr     ea              ;zakazat vsechny preruseni
                 clr     dsio            ;zacit write slot
                 rrc     a               ;lsb do C, 1cyklus
                 jc      ds_wr1          ;2cyky
ds_wr0:         ;musi se pockat 60-120us aby se zaplsala 0
                 ;pockame asi 100us (102,4cyklu pro 12,288MHz)
                 ;jeste se musi pockat 99 cyklu
                 mov     r7,#49         ;protoze 1 cyklus trva mov a 2 djnz
                 djnz    r7,$
                 ;ted ukoncit write 0
                 setb    dsio
                 ;clr     dspullup        ;zapnout pullup
                 sjmp    ds_wrsr         ;cekani mezi sloty

ds_wr1:         ;musi se pockat 1-15us na zapis 1
                 ;pockame 5us
                 ;jeste se musi pockat 2 cykly
                 nop
                 nop
                 ;mov     r7,#2           ;1cyklus
                 ;djnz    r7,$            ;4cyklu
                 ;ted ukoncit puls aby se zapsala 1
                 setb    dsio
                 ;clr     dspullup        ;zapnout pullup
                 mov     ie,r4           ;obnovit preruseni
                 ;pockat jeste aby delka write slotu byla min. 60us
                 mov     r7,#49
                 djnz    r7,$

ds_wrsr:        ;cekani mezi write sloty (minimalne 1us)
                 mov     ie,r4           ;obnovit preruseni
                 mov     r7,#4
                 djnz    r7,$
                 ;opakovat 8x - 8bitu
                 djnz    r6,ds_wrloop
                 ret


;nacteni 1B z DS do A
ds_rd:          clr     dserr
                 ;setb    dspullup        ;vypnuti pullupu
                 mov     r6,#8           ;8bitu
ds_rdloop:      ;da se pouzit pro nacteni 1bitu, do r6 se musi vlozit 
#1, vysledek v acc.7
                 mov     r4,ie           ;ulozit preruseni
                 clr     ea              ;zakazat preruseni
                 clr     dsio
                 ;ted se musi pockat 5us (5cyklu)
                 mov     r7,#2           ;1cyklus
                 djnz    r7,$            ;4cykly

                 setb    dsio            ;uvolnit sbernici
                 ;pockat jeste 8us (8cyklu)
                 mov     r7,#3           ;1cyklus
                 djnz    r7,$            ;6cyklu
                 nop                     ;1cyklus
                 mov     c,dsio          ;nacist
                 rrc     a               ;dat do precteny bit do A
                 mov     ie,r4           ;obnovit preruseni

                 ;vypocet CRC
                 ;prave nacteny bit je v acc.7
                 push    acc
                 ;push    psw
                 jnb     ds_crc.0,dsx0   ;test LSB CRC
                 ;musime invertovat nacteny bit, protoze LSB CRC=1
                 cpl     acc.7
dsx0:           mov     c,acc.7         ;nacteny (invertovany) bit do C
                 mov     a,ds_crc
                 rrc     a               ;shift, v CRC jeste chybi xory 
bity 4 a 3
                 mov     ds_crc,a
                 jnb     ds_crc.7,dsx1  ;pokud je CRC.7 (prijaty xornuty 
bit) v 0 tak hotovo
                 ;jinak musime negovat bity crc.2 a .3
                 cpl     ds_crc.2
                 cpl     ds_crc.3
dsx1:           ;pop     psw
                 pop     acc

                 ;pockat aby delka slotu byla > 60us + 1us mezera mezi sloty

                 mov     r7,#43          ;1cyklus
                 djnz    r7,$            ;86cyklu
                 ;opakovat 8x pro 8bitu
                 djnz    r6,ds_rdloop
                 ret


Zdenek napsal(a):
> mam vyzkouseny zdrojak pro x51 (casti prevzate z DS).
> Mam poslat na mail?
> 
> Zdenek
> 
> intranet napsal(a):
> 
>>Nezkousel jste nekdo pripojit cidlo 18b20 k procesorum AT89C2051nebo jemu 
>>podobnemu?
>>Ted to zkousim a nedari se me domluvit se s cidlem. Jedna se me o 
>>jednoduchy, ale hlavne funkcni program na prvni zkouseni
>>
>>Predem dik JL
>>
>>
>>PS: Patri tam odpor 4K7 mezi kladne napeti a datovym vyvodem nebo se vyuzije 
>>vnitrni odpor v procesoru. 
>>
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> 



Další informace o konferenci Hw-list