Sari la conținut
ELFORUM - Forumul electronistilor

ds18B20 - need help - noob here


lama

Postări Recomandate

Salut. Ok , pina acum am citit cele doua caractere de la DS18B20. De aici incep sa fiu in ceata cum il transform. Am citit manualul circuitului dar din exemplele de pe net m-am bulversat total.Pe moment fac asai=(temp_msb<<8)+temp_lsb; //si obtin un intreg format din cele doua caractere i=i>>4;//impart la 16 ca sa obtin gradele celsius ca intregVoi cei care ati mai lucrat cum faceti?

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

Top autori în acest subiect

  • Liviu M

    3

  • MatyC

    2

  • 10vid

    2

  • lama

    2

Top autori în acest subiect

i = i >> 4 si i=i/16 sunt echivalente, numai ca unele microcontrollere au shiftarea stanga/dreapta implementate in hard, asa ca se consuma mai putina memorie/se executa mai repede.

Banui ca la optimizare compilatoarele destepte, care fac optimizare buna, transforma orice inmultire/impartire cu puteri ale lui 2 in shiftarea echivalenta.

 

@lama - si mie mi se pare OK codul (din punct de vedere C), da' nu cunosc deloc senzorul.

Nu stiu daca e mai "avantajos" sau nu, da' codul tau e echivalent cu:

i=(temp_msb<<)+(temp_lsb>>4);
Link spre comentariu

Din datasheet ai sa vezi ca DS18B20 transmite 3 informatii in cei 16 biti:1. tipul temperaturi prin biti 15-11 notati cu S (sign) adica daca S=1 este sub 0 grade sau peste 0 grade cand S=0.2. valoarea fara zecimale prin biti 10-4.3. zecimalele temperaturi masurate prin biti 3-0. Trebuie mascati sau nu in functie de precizia dorita.Eu am lucrat cu DS18S20 si este putin diferita situatia.Poti folosi un flag pentru memorarea temperaturi ca fiind pozitiva sau negativa. Sutele, zecile si unitatile temperaturi masurate le pe 7 biti si este suficienta o variabila uns8. Pentru ca spre exemplu -25 este "1110 0110" pe cand +25 este "0001 1001" sa nu te complici poti sa faci negarea temperaturi in cazul S=1 si obtii echivalentul valorilor pozitive. Nu uita insa de flag. Cu ce este dupa virgula la temperatura depinde de precizia dorita.Eu am in calculator ceva despre DS18B20 in C insa este pentru AVR. Logica este aceasi, ca doar C-ul este acelasi.

Link spre comentariu

Nu prea-s cu C-ul, dar mi se pare corect ce ai scris. A doua linie se poate inlocui si cu i=i/16 pentru un rezultat mai exact.

i = i >> 4 si i=i/16 sunt echivalente, numai ca unele microcontrollere au shiftarea stanga/dreapta implementate in hard, asa ca se consuma mai putina memorie/se executa mai repede.

10vid, Liviu, daca mergeti asa, dupa ureche , mai bine opriti-va cu sfaturile.10vid: cum este domnule un integer "mai exact" decat altul ?Liviu: tu ai impresia ca exista microcontrollere care au "implementata" sau nu in inmultirea/impartirea? cum explici tu folosirea de memorie in caz de uC pentru deplasari stanga/dreapta?Daca nu va este clar ceva, intrebati. Sfaturi, urmeaza sa primiti. Nu mai bagati si pe altii in ceata voastra.
Link spre comentariu

Liviu: tu ai impresia ca exista microcontrollere care au "implementata" sau nu in inmultirea/impartirea?

Eu nu, pacatele mele, uCip are impresia asta :rade:

 

High Performance RISC CPU:

• C compiler...

• 8 x 8 Single Cycle Hardware Multiplier

 

Mie cel putin a asta imi suna "Hardware multiplier". Daca stii tu mai multe, lamureste-ma, te rog. Citatul e din data-sheetul lui 18F452.

 

cum explici tu folosirea de memorie in caz de uC pentru deplasari stanga/dreapta?

Aici nu ti-am inteles problema. Intrebi de ce deplasarile folosesc memorie daca sunt implementate in hard?

Da' ce, exista vreo instructiune (chiar implementa in hardware *)) care nu foloseste memorie in momentul in care o folosesti in program? :nas:

 

*) da, exista instructiuni implementate in hardware.

Link spre comentariu

He, he, uite cum "traduce" compilatorul picc de la hi-tech o banala inmultire cu 4: :rade:

 

;main.c: 8: ucTestByte *= 4;	clrc	rlf	(main@ucTestByte),f	clrc	rlf	(main@ucTestByte),f
Link spre comentariu

@picolo: De ce nu luminezi oameni prin a explica ca in cazul in care se face impartire\inmultire la un numar care este putere a lui 2 se recomanda, pentru optimizare, deplasarea stanga\dreapta? Sa incercam sa ajutam omul in problema care o are si sa nu ducem discutia prin balarii. @lama: Revino cu detalii despre ce vrei sa obtii. In ce vrei sa transformi valorile citite din senzor (BCD, ASCII, etc)? Este un aspect care modifica modul de lucru al programului.

Link spre comentariu

@lama: Revino cu detalii despre ce vrei sa obtii. In ce vrei sa transformi valorile citite din senzor (BCD, ASCII, etc)? Este un aspect care modifica modul de lucru al programului.

Mama ce flame. Nu doream asa ceva ....Pe moment trimit informatia pe seriala si este stocata pe calculator.Oricum am gasit un curs/exemplu care contine exact conversia pe 12 biti-cea implicitata a lui DS18B20-.Si dupa acest curs arata c-am asa#define THERM_DECIMAL_STEPS_12BIT 625 //.0625void therm_read_temperature(char *buffer){// Buffer length must be at least 12bytes long! ["+XXX.XXXX C"]uint8_t temperature[2];int8_t digit;uint16_t decimal;//Reset, skip ROM and start temperature conversiontherm_reset();therm_write_byte(THERM_CMD_SKIPROM);therm_write_byte(THERM_CMD_CONVERTTEMP);//Wait until conversion is completewhile(!therm_read_bit());//Reset, skip ROM and send command to read Scratchpadtherm_reset();therm_write_byte(THERM_CMD_SKIPROM);therm_write_byte(THERM_CMD_RSCRATCHPAD);//Read Scratchpad (only 2 first bytes)temperature[0]=therm_read_byte();temperature[1]=therm_read_byte();therm_reset();//Store temperature integer digits and decimal digitsdigit=temperature[0]>>4;digit|=(temperature[1]&0x7)<<4;//Store decimal digitsdecimal=temperature[0]&0xf;decimal*=THERM_DECIMAL_STEPS_12BIT;//Format temperature into a string [+XXX.XXXX C]sprintf(buffer, "%+d.%04u C", digit, decimal);}L-a acest moment aceasta este implementarea(fara sprintf ca nu are memorie suficienta PIC12F675-ul pe care il folosesc.
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