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