Problem mit DS18S20

OP #1642430
Hallo,

ich versuche schon seit geraumer Zeit einen DS18S20 mit externer 
Stromversorgung ganz einfach auszulesen. Habe mich dazu an den 
vorgegeben Beispielcode von Maxim gehalten: 
http://www.maxim-ic.com/app-notes/index.mvp/id/126

Die Funktionen scheinen alle super zu funktionieren, wahrscheinlich hab 
ich in der Reihenfolge einen Fehler. Jedenfalls bekomme ich, wenn ich 
das Scratchpad auslese, in jedem der 9 Bytes nur ein "0xFD". Woran liegt 
das?

Schöne Grüße
Paul
Angehängte Dateien:
Hallo,

ich kann in deinem Code nicht's finden, wo du mal zwischen Ein- und 
Ausgang des Portpin umschaltest.
Am besten du setzt die Portleitung dauerhaft auf Low und arbeitest nur 
mit DDR.
-> DDR=1 Ausgang LOW
-> DDR=0 Ausgang HIGH oder Eingang
externen Pullup von 4.7k aber nicht vergessen.

Sascha
Hallo Paul,

bei mir steht vor dem "BE" noch ein "CC".
Vergleich mal den Code:
1
  // Mach genau das, was auf Seite 19 des Datenblattes steht!
2
  // Das funktioniert nur bei einem 1wire-Gerät
3
  unsigned char temperatur(unsigned char volatile *data)
4
  {
5
    unsigned char i;
6

7
    if (OW_Reset() != 0) {
8
      // Es wurde kein Gerät gefunden!
9
      return 0x41;
10
    } else {
11
      // CCh - Master issues Skip ROM command.
12
      OW_Char_Write(0xCC);
13
      // 44h - Master issues Convert T command.
14
      OW_Char_Write(0x44);
15
      // hier müsste noch der starke Pullup hin. 
16
      // Dieser ist in der Schaltung nicht vorgesehen
17
      // warte 1 Sekunde, bis die Temperatur umgewandelt ist
18
      new_delay_ms(1000);
19
      // Reset - Master issues reset pulse.
20
      OW_Reset();
21
      // CCh - Master issues Skip ROM command.
22
      OW_Char_Write(0xCC);
23
      // BEh - Master issues Read Scratchpad command.
24
      OW_Char_Write(0xBE);
25
      // - Master reads entire scratchpad including CRC.
26
      for(i = 0; i < 9; i++)
27
      {
28
        data[i] = OW_Char_Read();
29
      }
30
      // Reset - Master issues reset pulse.
31
      OW_Reset();
32

33
      if (data[0] == 0xFF) return 0x42;
34

35
      if (data[0] > 0){
36
        return 0;
37
      } else {
38
        return 0x43;
39
      }
40
    }
41
  }
Gruß
Guido
Hast du den Teil auch übernommen?
1
      // - Master reads entire scratchpad including CRC.
2
      for(i = 0; i < 9; i++)
3
      {
4
        data[i] = OW_Char_Read();
5
      }
Ich komme mit deinem Zeiger in "read_data" nicht klar
1
void read_data(unsigned char* data,unsigned char size)
2
{
3
  unsigned char i=0;
4
  for(i=0;i<size;i++)
5
  {
6
    data[i]=read_byte();
7
  }
8
}
Das liegt aber daran, dass ich mit Zeigern nie einfach klar komme.
Gast
hallo paul,
klingt zwar doof, aber überprüf bitte nochmal die Pin-Belegung von 
deinem Sensor. Ich hab selber mal fast 2 Wochen verzweifelt vor dem 
Programmcode gesessen, bis ich feststellen musste das im Datenblatt der 
Sensor auf dem Kopf dargestellt ist...
Grüße Tom

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.