Guten Tag,
ich habe eine sicherlich eigentlich ganz einfache Frage. Ich habe noch
ein paar alte DS1820 da und möchte die Temperatur auslesen.
Nun habe ich die hier ja bereits viel bekannte Library von Peter
Dannegger verwendet. Leider hat sie meinen DS1820 nicht erkannt, da er
einen alten Romcode, 0x22 hat. Dies habe ich experimentiert angepasst.
Nun habe ich mit der Temperaturumrechnung etwas experimentiert komme
aber nicht weiter. Ich hoffe das hier wer den Fehler einfach sieht.
Es soll die aktuelle Temperatur als dreistellige Dezimalzahl ausgegeben
werden. z.B. 22,0 = 220.
hier mal der Code ausschnitt:
1 | uint16_t read_meas( void )
|
2 | {
|
3 | uint16_t rueckgabe=0;
|
4 | uchar id[8], diff;
|
5 | uint temp;
|
6 |
|
7 | for( diff = SEARCH_FIRST; diff != LAST_DEVICE; ){
|
8 | diff = w1_rom_search( diff, id );
|
9 |
|
10 | if( diff == PRESENCE_ERR ){
|
11 | errormsg("No Temp Sensor");
|
12 | break;
|
13 | }
|
14 | if( diff == DATA_ERR ){
|
15 | errormsg("Temp Bus fail");
|
16 | break;
|
17 | }
|
18 | if( id[0] == 0x22 || id[0] == 0x10 ){ // temperature sensor DS1820 & DS1822
|
19 | w1_byte_wr( READ ); // read command
|
20 | temp = w1_byte_rd(); // low byte
|
21 | //temp |= (uint)w1_byte_rd() << 8; // high byte
|
22 | if( id[0] == 0x10 ) // 9 -> 12 bit
|
23 | temp <<= 3;
|
24 |
|
25 | //sprintf( s, "%3d.%01d", temp >> 4, (temp << 12) / 6553 ); // 0.1øC
|
26 | //rueckgabe = (uint8_t) ((temp >> 1)*10) + ((temp << 8) / 66);
|
27 | rueckgabe = (uint8_t) ((temp*10) / 26);
|
28 | }
|
29 | }
|
30 | return rueckgabe;
|
31 | }
|
Danke schon mal,
Gruß Martin