Temperaturauswertung 1-WIRE AVR

Gast #2649946
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 :) .
Angehängte Dateien:
Gast #2650181
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
Gast #2650662
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren