DS18B20 + AT2051

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

Vyreseno,prosim o smazani :slight_smile:

Není nutné mazat (pokud to z nějakého důvodu opravdu nepotřebuješ)…

V čem byl problém?

Hlavni problem byl v instrukci JC pro testovani nuly pri vysilani kodu. Melo tam byt JNC = otestuj nulu a skoc na log0.Takhle to skakalo presne naopak a misto vysilane nuly byla vysilana jednicka.
Pak tam byly jeste nejake drobnosti s casovanim.
Spis bych sem dal uz odladenej funkcni zdrojak i s dekodovanim teploty,to si myslim ze by pomohlo vic jak hledat chyby v tom mem starem :slight_smile:
Nejhorsi je ze kdyz nad tim clovek stravi pres 20 hodin hledanim chyby tak si jednoho chybejiciho pismenka nevsimne.Musel jsem si dat den pauzu a pak me to trklo hned zezacatku :slight_smile:

To je naprosto nejlepší způsob - pamatuji si, jak jsem se snažil dva dny rozchodit sériovou komunikaci mezi několika mikrokontroléry. Dal jsem si den pauzu a nakonec jsem čtvrtý den zjistil, že mám špatné (nevyhlazené) napájecí napětí. Vložil jsem do obvodu kondenzátor a najednou to fungovalo :smiley:.

Zdravim. ja som zaciatocnik v tejto oblasti. Chcem sa opytat kde najdem c o najviac o mikrokontrolery AT2051…?? odpoved na frenky3001 (zavináč) azet.sk

:arrow_right: administrator: příspěvek byl upraven
(upravil jsem zápis emailu - ochrana před SPAMem)

Nejspis na strankach vyrobce :wink: Pokud mas na mysli AT89C2051, tak je to atmel.com
datasheet: atmel.com/dyn/products/product_card.asp?part_id=1938

Pokud znas obecne x51, znas i tenhle procesor s tim rozdilem, ze ma pouze brany P1 a P3 (s tim souvisi i nemoznost pripojeni externich RAM/ROM), a pin P3.6 neni vyveden na pouzdru, ale je interne pripojen na vystup komparatoru umisteneho na P1.0 a P1.1

Vnitrni struktura je stejna…