Temperaturfühler DS18B20

Begonnen von pic18, 24.11.2022, 12:44:03 CET

⏪ vorheriges - nächstes ⏩

pic18

Hallo, ich bekomme seit einiger Zeit  falsche Temperaturwerte vom DS18B20. Hat hier jemand Erfahrung damit gemacht? Es werden mehrere Fühler abgefragt. (bis zu 20 St.) Jeder Fühler liefert dann einen Temperaturwert von 85°C was einen Bin-Wert von 101010.. entspricht. Die Serial-Nr. sowie die EEProm Werte werden richtig ausgelesen, was auf ein richtiges Timing beim Lesen und Schreiben hinweist. Das Programm hatte früher die richtigen Werte geliefert. Falls Interesse besteht werde ich die entsprechenden Programmteile hochladen.
Viele Grüße
Pic18

Peter

Hallo
Habe ein ähnliches Problem mit dem Temperaturfühler.
Habe nur einen aber der liefert mir ab und zu eine
Temperatur von -0.5 Grad C.
Und dann plötzlich stimmt die Temperatur wieder. Habe bis jetzt auch
noch keine Lösung gefunden. Habe schon im Code danach gesucht und die Hardware
gegen alles möglich abgeschirmt. Der Fehler bleibt trotzdem. Auch mit einem anderen DS18B20 Typ
das selbe problem. Woodoo Zauber  lachen

pic18

bin noch auf Arbeit, -0,5°C klingt nach Timing Problem. Evtl. rufst Du einen Interrupt während des Lesens auf? Kannst du dir auch noch gleichzeitig die Serial-Nr. anzeigen lassen?
Wenn Du magst, dann schicke ich Dir meinen Programm-Code hoch.

Peter

Ja das wird meistens gesagt das es am Timing liegt. Habe
aber alle Interupts wärend der Auslesung des DS abgeschaltet.
Ändert sich aber nichts. Nein lasse mir nicht die Ser.Nr. anzeigen.
Wofür auch, bei einem brauche ich die nicht. Klar Code kannst du immer
hochladen, dann können wir da mal drüber schauen. Ist immer besser wenn man
ein Problem hat, das man den Code hochläd.
Da ich alle 10min die Temperatur abfrage und das 24Std/7Tage lang, kommt
das am Tag etwar 1-2 mal vor. Manchmal erst nach mehreren Tagen.
Wenn es ein Timming problem wäre dann müsste es öfter auftreten.

pic18

Vielen Dank, ich glaube ich habe den Fehler gefunden. Ich hatte einen Pointer-Fehler. In case ds18b20Conv hatte ich ow_sn(0) aufgerufen, und in ow_sn( ) eine Verzweigung auf Skip_Rom (ausgeklammert), was wohl falsch war.

Code: c
char sn_liste[sn_max][8];
Code: c
void ow_sn(char* sn1)
{
    ow_reset();

    //if (!*sn1) write_byte(Skip_Rom);
    //else
    {
        write_byte(Match_Rom);
        writeln_ow(sn1);
    }
}

Code: c
            case ds18b20Conv:    //Temperatur einlesen vorbereiten
                    //ow_sn(0); //FALSCH mit (0) sollte ..write_byte(Skip_Rom) ausgeführt werden
                    ow_reset(); //NEU
                    write_byte(Skip_Rom);//NEU
@Peter, ich bin immer noch der Meinung dass das Timing nicht zu 100% passt. Ich kann dir gerne meine Zeiten schicken.

Peter

Welche Zeiten meinst du ?
Hier mal der Code zum einlesen der Temperatur:

Ow_Reset(PORTC, 0)                   ' Onewire reset signal
      Ow_Write(PORTC, 0, 0xCC)             ' Issue command SKIP_ROM
      Ow_Write(PORTC, 0, 0x44)             ' Issue command CONVERT_T
      Delay_ms(750)

      Ow_Reset(PORTC, 0)
      Ow_Write(PORTC, 0, 0xCC)             ' Issue command SKIP_ROM
      Ow_Write(PORTC, 0, 0xBE)             ' Issue command READ_SCRATCHPAD

      temp =  Ow_Read(PORTC, 0)
      temp = (Ow_Read(PORTC, 0) << 8) + temp

      Display_Temperature(temp)

Das ist eigentlich alles. Unter Display_Temperature(temp) wird nur der Wert
in Grad umgewandelt. Kann man eigentlich nicht viel falsch machen.

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau