Forum: Mikrocontroller und Digitale Elektronik Temperaturauswertung 1-WIRE AVR


von Serpent (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute!

Mein Kumpel und ich arbeiten gerade an einem Projekt.
Wir versuchen über einen ATMega644PA den Temperatursensor Dallas DS18S20
auszuwerten.
Um die Temperatur anzuzeigen verwenden wir ein Display.

Die Display-Steuerung Funktioniert einwandfrei.

Unser Problem ist: Der Sensor liefert keine Daten zurück (Temperatur 
immer 0).
Vermutlich haben wir einen Fehler beim schreiben und lesen der Daten.

Wir finden den Fehler leider nicht, würde uns freuen wenn ihr euch den
Code mal ansieht!

Der Sensor ist am PORTD auf PIN 5 angeschlossen.

Hoffe ihr könnt uns helfen, danke schonmal :) .

von cskulkw (Gast)


Lesenswert?

void writeSensor(int i){
if(i == 1){


  DDRD |= DQ;
  PORTD &=~ DQ;
    _delay_us(10); //10//1
    DDRD &=~ DQ;
    _delay_us(65); //65
  }else if(i == 0){


  DDRD |= DQ;
  PORTD &=~ DQ;
    _delay_us(90); //90 //65
    DDRD &=~ DQ;
    _delay_us(5); //5 //1
  }
}

Hi Ihr beiden, wenn ihr den Sensor ohnehin beschreibt, braucht ihr das 
DQ-Bit im DDR nur einmal zu Beginn der Funktion setzen.
Euer Hauptproblem ist, dass Ihr die Funktion z. B. mit writeSensor(0xCC) 
aufruft. Aber in der Funktion writeSensor fragt ihr nur i == 1 ab. Da i 
aber 11001100 hat, entspricht es nicht der 1 und deshalb wird der Port 
nicht bedient.
Das zweite Problem was ich sehe ist, dass Ihr die 8 Bits hintereinander 
bedienen müßt. Da tut Eure Funktion aber nicht, weil ihr keine Schleife 
programmiert habt.


Euer Code sollte besser so aussehen.

void writeSensor(int i)
{
   /*Iterationsvariable für die Bitposition*/
   uint8 j;

   DDRD |= DQ; /* Beim Schreiben bleibt DDRD auf Ausgang*/
   /*for-schleife über alle 8 Bits. */

   for(j=0; j < 8; j++)
   {
      /* links schieben ist multiplizieren und binär und verknüpf.*/
      /* sollte mit 1 an Positon 2^0 anfangen. LSB first !!! */
      if(i & (1 << j))
      /* das hier soll eine 1 an der Bitpos feststellen.*/
      {
          PORTD &=~ DQ;
          _delay_us(5); /*lt. Datenbl. min. 1µsec*/
          PORTD |= DQ;
      }
      else
      {
          PORTD &=~ DQ;
          /* 60µs sollten reichen. Länger kann nicht schaden.*/
          _delay_us(60);
          PORTD |= DQ;
      }
   }/*ende der for-schleife*/
}/*ende der funktion writeSensor*/

So das lesen macht ihr jetzt so ähnlich. Da müßt Ihr erst einen kurzen 
Impuls auf 0 senden und dann den DDRD auf Input setzen.

Das solltet Ihr jetzt aber hin bekommen.

Viel Erfolg

von Serpent (Gast)


Lesenswert?

Danke, das werden wir heute gleich mal ausprobieren!

Werde dann heute Abend mal wieder einen Zwischenbericht abliefern :)

Danke schon mal!

von Serpent (Gast)


Lesenswert?

Bekommens noch immer nicht hin.
Beim Lesen des Sensors gibt es immer nur high.

Haben überprüft ob der Sensor den "Presence pulse" beim reset 
zurückgibt, und der ist anwesend :) .

Wir denken jetzt liegt der Fehler beim Einlesen.

Was wir nicht ganz verstehen (auch aus dem Datenblatt) wie das Timing 
sein muss beim Auslesen der 9 Bit.

Sitzen jetzt schon 3 Stunden daran und es tut sich noch immer nichts 
sinnvolles :(

Bitten um Rat :)

von Serpent (Gast)


Lesenswert?

Hat sich erledigt!

War ein Timing-Problem beim Auslesen der Daten.

Werde den fertigen Code demnächst in die Codesammlung posten :)

Danke nochmals!

MfG Heinz & Julian

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.