Dobry den. Chtel bych se zeptat. Mam problem s cidlem ds18b20 pripojenym k AT2051 24mHz a nevim si s nim uz rady. V programu se snazim precist obsah pameti cidla a poslat na seriovy port. Problem je ze mi stale chodi jen 4A 26 HEX Kdyz chci identifikacni cislo cidla tak mi to vypise 00 01 4A 26 HEX prvni 4 bajty dalsi nesnimam. Uz jsem v koncich,stravil jsem nad tim pres 20 hodin studovanim casovani a dvakrat jsem prepsal cely program.Mam tolik ruznych verzi ze uz ani nevim co jsem kde udelal za zmeny. Vypis posledni verze programu.Omluvte chaos v programu,teprve zacinam.Nevladnu anglictinou ,vychazel jsem pouze z informaci na HW.cz a sweb.cz/ok2jnj/ds18b20.htm bohuzel ani kombinaci informaci z techto dvou stranek nevedlo k zadnemu vysledku.
Nektere casti programu jsou jeste pozustatek po zmenach v prubehu odladovani tak se nedeste. Budu vdecny za jakoukoli radu Jirka.
$modxx51
;krystal 24MHz
ds1820 bit p1.7
org 00h
jmp start
start:
mov th1,#243
mov tmod,#00100000b
mov scon,#01010000b
setb ea ;globalni preruseni
setb es ;preruseni od UARTu
setb tr1 ;spusteni casovace UARTu
mov pcon,#10000000b ;dvojnasobna rychlost
setb ds1820
acall init ;resetovaci impulz 500us
;testovani zarizeni na sbernici-pokud odpovi tak pokracujeme zapisem
mov r1,#15 ;ceka 15us
ceka:
djnz r1,ceka
testovani:
mov c,p1.7
jc testovani ;pokud se obevi nula pokracuje na dalsim radku
;setb ds1820
;mov a,#0
;acall serial
;prodleva od resetu 500us
acall t100us
acall t100us
acall t100us
acall t100us
acall t100us
;Vysilani
;rekalibrace
;mov a,#b8h
;acall vysilani
;nop
mov a,#0cch ;inicializace zarizeni
acall vysilani
nop
mov a,#044h ;spusti prevod teploty
;mov a,#0b8h ;rekalibrace
acall vysilani
acall t200ms ;ceka 200ms
acall t200ms ;ceka 200ms
acall t200ms ;ceka 200ms
acall t200ms ;ceka 200ms
acall init
;prodleva od resetu 500us
acall t100us
acall t100us
acall t100us
acall t100us
acall t100us
mov a,#0cch ;inicializace zarizeni
acall vysilani
;mov a,#033h
;acall vysilani
nop
mov a,#0beh ;čtení hodnot
acall vysilani
nop
acall cteni
mov r7,a
acall cteni
mov r6,a
;acall cteni
;mov r5,a
;acall cteni
;acall serial
;mov a,r5
;acall serial
mov a,r6
acall serial
mov a,r7
acall serial
jmp $
init: ;resetovaci pulz 500us
push psw
clr ds1820 ;nastaveni 0 na sbernici
mov r0,#5 ;casova prodleva 500us
t500uss:
mov r1,#100 ;100us
cas0:
djnz r1,cas0
djnz r0,t500uss
setb ds1820 ;log 1 na sbernici
acall t100us
pop psw
ret
vysilani:
mov r4,#8
rotace:
setb ds1820
nop
nop
nop
rrc a
jc log0
;pokud je log.1
clr ds1820 ;zarizeni stahne sbernici k nule a nejpozdeji do 15us ji opet uvolni
mov r1,#15 ;ceka 15us
cas1:
djnz r1,cas1
setb ds1820 ;uvolneni sbernice ,do 15us by zarizeni melo zacit vzorkovat (delka time slotu je 60 - 120us)
mov r1,#45 ;45us
cas2:
djnz r1,cas2
djnz r4,rotace
ret
log0:
;pokud je log.0
;zapis 0 je jednodussi .stahne sbernici k nule alespon na 60 us,coz je delka time slotu,vzorkovat zarizeni zacne zhruba po 30us
clr ds1820
mov r1,#60 ;ceka 60us
cas3:
djnz r1,cas3
setb ds1820
mov r1,#10 ;ceka 10us
cas4:
djnz r1,cas4
djnz r4,rotace
ret
cteni:
;cteni dat ze zbernice
clr a
mov r3,#8 ;pocet bitu
cteniopak:
setb ds1820
nop
nop
nop
clr ds1820
mov r1,#6 ;ceka 6us
cas5:
djnz r1,cas5
setb ds1820
mov r1,#9 ;ceka 9us
cas6:
djnz r1,cas6
mov c,ds1820
rrc a
mov r1,#55 ;ceka 55us
cas7:
djnz r1,cas7
djnz r3,cteniopak
ret
serial:
mov sbuf,a
jnb ti,$
clr ti
ret
t100us:
mov r1,#100
cas8:
djnz r1,cas8
ret
t200ms:
mov r2,#200
cas9:
acall t100us
djnz r2,cas9
ret
end