Sari la conținut
ELFORUM - Forumul electronistilor

Proticol 1-wire pentru DS18B20


aionescu

Postări Recomandate

Am urmatoarea problema:Nu reusesc sa citesc cu un PIC senzorul DS18B20 (temperatura) prin adresare cu codul ROM. Scopul ar fi sa citesc mai multi senzori pe acelasi bus.Precizez ca softul functioneaza (pot citi temperatura) pentru un singur senzor, nefolosind codul ROM.Daca a abordat cineva o aplicatie de genul acesta (mai multe dispozitive adresabile pe protocol 1-wire) rog sa ma lumineze si pe mine.Multumesc anticipat!

Link spre comentariu
  • Răspunsuri 21
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • aionescu

    6

  • 78ATI

    6

  • bogdanm

    2

  • puiu

    2

Top autori în acest subiect

Vizitator yoco

salut,eu am facut asa ceva dar cu avr si e cat se poate de simplu, trebuie doar sa urmaresti pasii din pdf, adica documentatia lui ds18b20.ca sa citesti mai multi senzori daca bine imi aduc aminte trebuie sa comunici pe 1wbus ROM-ul device-ului pe care doresti sa-l citesti pt ca protocolul asa e conceput, masterul trimite interogare catre slave(s) si stabileste cu cine vrea sa comunice, raspunde cel care recunoaste ROM-ul trimis de master si se continua tranzactia doar cu acel slave,eu zic asa:-citesti codurile ROM la toti senzorii , salvezi in eeprom si faci softul in asa fel ca sa poti comunica cu senzorii, plus 18b20 are si 2 registrii de alarma , adica daca il configurezi sa semnaleze o depasire a unui anumit prag de temperatura el iti semnaleaza starea de "avarie" pe 1wbus, pui pinul pt 1w pe intrerupere externa si ai rezolvat problema.atentie la distanta si tipul de cablu !Yoco.

Link spre comentariu

1. Intrucat fac acum o analiza a senzorilor de temperatura pentru un automat, as vrea sa stiu la ce distanta de PIC se poate utiliza senzorul 1wire?Cu stima,

Link spre comentariu

Uita-te nitel prin appnote-urile de la Maxim. Acolo scrie destul de clar cat tine o retea 1-Wire. Din cate imi aduc aminte poti sa ajungi la cateva sute de metri in anumite conditii (adica ceva repetoare pe traseu).

Link spre comentariu
Vizitator DragosP

Eu am ajuns la vreo 250 fără nici un repetor. Însă, trebuie citite într-adevăr notele de aplicaţie, atât în ceea ce priveşte softul cât şi-n ceea ce priveşte hardul.

Link spre comentariu

Multumesc tuturor pentru sfaturi, am rezolvat problema.Buba era in rutina de transmisie care altera registrii unde stocam eu ROM-ul dupa prima transmisie.

Link spre comentariu
  • 10 luni mai târziu...

Un exemplu de cod(ASM) n-ar folosi la mare lucru fiindca e stufos si fiecare abordeaza problema in felul sau. De exemplu, al meu are peste 900 de linii (impreuna cu afisarea pe LCD) dar banuiesc ca nu e abordarea optima. Amator, de !In primul rand trebuie sa te asiguri ca se citeste bine seria ROM-ului.Eu cu asta am inceput.Un program care citeste seria si o afiseaza cumva (pe LCD e cel mai comod).Seria trebuie sa se termine musai cu "28", care e codificrea familiei DS18B20) . De exemplu,unul dintre traductorii mei are seria asta: D900000090185D28.In al doilea rand mare grija la transmitere sa te asiguri ca se transmite corect sau nu se altereaza in operatii ulterioare (cum am patit eu).Asta se poate verfica foarte bine pe simulator.In al treilea rand trebuie urmata intocmai secventa din data sheet-ul lui DS18B20 (succesiunea comenzilor).Modifica codul existent citind tot un singur traductor, dar cu adresa. Comenteaza instructiunea "skip rom" si pune " match rom" (impreuna cu secventa din data sheet). Dupa ce va merge pentru un singur traductor, poti sa pui si 10, doar se multiplica secventele de citire. Eu asa am facut.Cand ai mai multi traductori, mare atentie la "timing". Nu le place sa-i grabesti si, culmea, difera de la lot la lot. Eu eram convins ca am codul definitivat cand, dupa ce am schimbat lotul de traductori, nu a mai mers bine pana nu am schimbat "timing"-ul. Bafta!

Link spre comentariu

Culmea este ca eu nu reusesc sa citesc temperatura unu senzor. Am renunatat "pentru teste" la BUS si fac lucrul cu un singur senzor. Ideea e ca nu imi dau seama ce numar afiseaza pe LCD. Afiseaza un numar insa este ceva ce nu are legatura cu realitatea.Am sa incerc reconstruirea programului pas cu pas, oricum pana in acest moment nu merge!

Link spre comentariu

Aaa, pai zii asa. Eu credeam c-ai rezolvat citirea unui singur senzor. Pe mine nu m-au tinut curelele sa atac citirea mai multor senzori din prima, asa ca am facut (pentru un singur senzor) in felul urmator:1. Am scris rutinele de transmisie/receptie si le-am verificat cu simulatorul. 2. Am verificat ca dupa comanda "reset pulse", DS-ul imi raspunde cu "presence pulse". Asta musai pe osciloscop, ca trebuie sa verifici ca taimingul e cel din diagramele din data sheet. La protocolul asta (1 wire) taimingul e al naibii de important (asa cum am constatat pe pielea mea).3. Tot pe osciloscop am (re)verificat rutinele de transmisie si mai ales receptie, findca in cazul receptiei pe simulator am generat valori artificiale, adica am facut eu pe DS18B20.4. Ca sa nu introduc incertidudini suplimentare am afisat pe LCD valoarea temperaturii in hexa, facand conversia manual.5. Pentru verificarea rutinei de calcul a temperaturii (2's complement) si a conversiei hexa-zecimal am fortat eu in program niste valori chipurile citite de DS, sa vad daca pe LCD afisaza ce trebuie. Programul are 3 sectiuni importante, care pot fi testate independent: citirea senzorului, calculul temperaturii+conversia in zecimal si afisarea pe LCD.Pentru inspiratie cauta si pe Internet niste note de aplicatie, au niste indicatii bune pe acolo. Ba chiar iti arata cum trebuie sa apara diferite secvente pe ecranul osciloscopului.Ca veni vorba, fara osciloscop e aproape imposibil sa reusesti aplicatia asta in timp rezonabil.Bafta!

Link spre comentariu

Merci mult! Osciloscop nu am, insa datele folosite (timpii sunt cei din data sheet) si scris in program...Acum sunt la servici, sunt atat de frustrat ca nu pot sa incerc codurile...scriu codurile in notepade, si acasa testez. Sper ca de aceasta data sa mearga.

 

program read_one_wiredim tmp_sign as bytedim    j as bytedim    scratch as byte[9]dim    text  as char[7]dim    a,b,i,x,r as bytedim    deci     as char ow_reset(PORTA,2)ow_write(PORTA,2,$CC)ow_write(PORTA,2,$44)delay_us(120)ow_reset(PORTA,2)ow_write(PORTA,2,$CC)   Ow_Write(portA, 2, $BE)             'read scratchpad cmd          for i=0 to 8           x = ow_read(PORTA, 2)            scratch[i] = x             'get result  9 bytes in array       next i       a= scratch[1]                   'sign temp       if a=0 then                  tmp_sign="+"              else                  tmp_sign="-"       end if       a=scratch[0]       if a.0 = 0  then                'a.0 is 0.5C value                       deci = "0"                  else                       deci = "5"       end if       a = scratch[0]  >>1             'temp en degre       ByteToStr(a,text)'       Lcd_out_cp( text)'       Lcd_Chr_CP(",")'       Lcd_Chr_CP(deci)'       Lcd_chr_CP(223)'       Lcd_Chr_CP("c")end.
[/code]

 

Partea de afisare (cosmetica se face la fata locului insa...datele sunt importante!

Link spre comentariu

Mda, situatia e complicata din punctul meu de vedere fiindca:1. Nu ai osciloscop (nici eu n-aveam, mi-am luat unul tocmai obligat de aceasta aplicatie).2. Eu folosesc ASM si nu limbaj de nivel inalt si asa am control asupra "bitului". In plus folosesc simulatorul la greu. M-a scos din multe incurcaturi.Fara osciloscop si simulator e greu (dar nu imposibil). Eu nu m-as descurca. Zici acolo ca ai respectat timing-ul. Dar ai verificat ca DS-ul raspunde? Asta e prima operatie pe care as face-o, sa vad daca raspunde traductorul. Poate e defect, mai stii? E foarte sensibil la alimentare inversa, eu am prajit vreo 2.Daca pot ajuta cu ceva, cu placere.Bafta!

Link spre comentariu

Ciudat! Am incercat din nou! imi afiseaza valori intre 90-105..si aceste valori variaza in functie de temperatura...zau ca nu imi dau seama ce e necazul.. Am incercat cu 2 senzori identici, aceleasi simptome!

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări