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 :) .
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
Danke, das werden wir heute gleich mal ausprobieren! Werde dann heute Abend mal wieder einen Zwischenbericht abliefern :) Danke schon mal!
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 :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.