Forum: Mikrocontroller und Digitale Elektronik DS18b20 gibt falsche Temperatur zurück


von Benjamin L. (benny_1998)


Angehängte Dateien:

Lesenswert?

Hallo, bei meinem Temp sensor kommen utopische werte heraus mal -1668.00 
usw

die Dateien Befinden sich im Anhang (code)


das LCD funktioniert.


danke für die Hilfe (:

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Benjamin Liebold schrieb:
> Hallo, bei meinem Temp sensor kommen utopische werte heraus mal -1668.00
> usw

Die utopischen Werte kommen wohl eher aus deiner Implementierung des 
Umrechnungsalgorithmus. Es gibt genug funktionsfähige Programme für 
DS18B20. Hast du damit mal probiert?

von Benjamin L. (benny_1998)


Lesenswert?

Genug gefunden aber ich wollte es selbst Probieren und daraus lernen es 
bringt mir nichts einen Fertigen code zu haben aber mein Wissensstand 
immer noch bei 0,1 ist

von holger (Gast)


Lesenswert?

Benjamin Liebold schrieb:
> Genug gefunden aber ich wollte es selbst Probieren und daraus
> lernen es
> bringt mir nichts einen Fertigen code zu haben aber mein Wissensstand
> immer noch bei 0,1 ist

Der fertige Code bietet dir aber die Gelegenheit zu sehen
wie man es richtig macht und mit deinem zu vergleichen.
Soll das jetzt jemand für DICH machen?

von Benjamin L. (benny_1998)


Lesenswert?

Nein so war das nicht gemeint könntest du mir ein Link geben? der 
möglichst gut kommtentiert ist?

von Uwe K. (ukhl)


Lesenswert?

Versuche mal:
1
void ow_write_bit(uint8_t bit)
2
{
3
4
  OW_LOW();
5
  OW_OUTPUT();
6
  _delay_us(1);
7
  if(bit) OW_INPUT();
8
  _delay_us(60);
9
  OW_INPUT();
10
  _delay_us(1); // <-- Gönne ihm die Pause
11
}
1
uint8_t ow_read_bit(void){
2
  uint8_t bit=0;
3
  OW_LOW();
4
  OW_OUTPUT();
5
  _delay_us(1);
6
  OW_INPUT();
7
  _delay_us(8); // <-- kleiner
8
  if(onewire_PIN&(1<<onewire_DQ)) bit=1;
9
  _delay_us(51);  // <-- Angepasst
10
  return bit;
11
}

von Wolfgang (Gast)


Lesenswert?

Benjamin Liebold schrieb:
> Genug gefunden aber ich wollte es selbst Probieren und daraus lernen es
> bringt mir nichts einen Fertigen code zu haben aber mein Wissensstand
> immer noch bei 0,1 ist

Mit einer lauffähigen Version kannst du den Fehler aber wesentlich 
leichter eingrenzen. So hast du nur eine Black Box aus Sensor und 
Software, von der du nur weißt, dass etwas falsches raus kommt.

Mit einer funktionsfähigen Software kannst du die Box zerlegen in
 - Sensorkommunikation
 - Rohdaten
 - Temperaturberechnung
 - Ausgabe

und zwischen den Blöcken Daten/Timing/Zwischenergebnissse abgreifen. 
Diese kannst du mit deinem Programm vergleichen und daraus einen 
Anhaltspunkt gewinnen, wo bei dir etwas schief läuft.

Alleine "utopische werte heraus mal -1668.00 usw" liefert wenig 
Einblicke. Zumindest die binären Rohdaten aus den beiden 
Temperaturregistern sollten halbwegs stabil sein und die solltest du 
hier auch verraten.

von Benjamin L. (benny_1998)


Angehängte Dateien:

Lesenswert?

Hab mir das scratchpad[0] bis [8] ausgeben lassen in der wert hat 255 
also stimmt irgendetwas mit dem auslesen nicht. ist vielleicht sogar der 
sensor kaputt?
ein 4,7k pullup ist vorhanden.

das ausgeben des Scatchpads passiert so

char Buffer1[20];
for (i=0; i<9; i++)
  {
    itoa( scratchpad[i] , Buffer1, 10 );
    lcd_string( Buffer1 );
  }

PS: Prozessor Atmega 16 16MHz extern quartz   Fuses sind angehengt.

: Bearbeitet durch User
von Steffen (Gast)


Lesenswert?

Nimm mal einen 2,2k Widerstand.

von Benjamin L. (benny_1998)


Lesenswert?

Bringt leider nichts.

von Peter D. (peda)


Lesenswert?

Bau mal in das ow_reset() ein presence detect mit ein.

von Benjamin L. (benny_1998)


Lesenswert?

wie meinst du das das er mir etwas zurück liefert?
Macht er ja schon bei erfolg eine 1 ansonsten eine logisch 0
das problem ist ich bekomm nichts aus dem kerlchen raus egal was ich 
versuche...

von Peter D. (peda)


Lesenswert?

1
uint8_t w1_reset()
2
{
3
  uint8_t err = 3;
4
5
  W1 = 0;
6
  W1_oe = 1;
7
  _delay_us( 480 );
8
  W1_oe = 0;
9
  for( uint8_t i = 480 / 20; i; i-- ){
10
    _delay_us( 20 );
11
    if( W1_in == 0 )                    // presence detect
12
      err &= 2;
13
  }
14
  if( W1_in )                           // no short circuit
15
    err &= 1;
16
  return err;                           // 0 = successful
17
                                        // 1 = not present
18
                                        // 2 = short circuit
19
}

von Benjamin L. (benny_1998)


Lesenswert?

Hallo, aufn display   Gibt er mir jetzt 3 aus also passiert eigentlich 
das in der Vfor-schleife und unten die aberfrage nicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.