Hallo zusammen Ich versuche seit einiger Zeit einen Temperaturmessung mit dem DS18S20 und einem PIC18F452. Als Pullup dient ein 4K7-Widerstand. Als Ein-Ausgang wird Pin A4 verwendet. Mit einem Oszilloskop habe ich geprüft ob die Resetsequenz richtig abgearbeitet wird. Diese scheint OK zu sein. Auch die Delay-Routine scheint zu passen. Im i-net habe ich einige Beispiele gefunden und bin sie durchgegangen. Temperatur konnte ich aber noch keine messen. Irgendwo habe ich noch einen Fehler, kann ihn aber einfach nicht finden!! Vielleicht habt ihr ja noch einen guten Rat, wenn Ihr den Code anschaut. Beste Grüsse und vielen Dank für Eure Tipps Geri
Hallo zusammmen Ich hänge immer noch an diesem Problem und komme einfach nicht drauf an was es liegen könnte. Mein Code funktioniert folgendermassen: DSRESET(); // Reset Ds18S20 DSTXBYTE(0xCC); // skip ROM DSTXBYTE(0x44); // convert temperature DelayMS(1500); // wait until conversion has been finished DSRESET(); // REset DS18S20 DSTXBYTE(0xCC); // skip ROM DSTXBYTE(0xBE); // read scratch pad for (k=0; k<9; k++) // read 9 bytes from scratchpad buf[k]=DSRXBYTE(); Das Timing-Diagramm habe ich auch schon mit dem Oszilloskop getestet (siehe Anhang). Lt. Datenblatt bin ich im erlaubten Bereich. Wie man am Timing-Diagramm erkennen kann, meldet sich der Sensor bei einem Reset wie erwartet. Wenn ich das Scratch-Pad auslese, dann erhalte ich lauter Nullen. Hat jemand von Euch bitte vielleicht noch eine Idee wo der Fehler liegen könnte? Für jeden Hinweis wäre ich sehr dankbar! Ich stehe mit meinem Latein momentan am Ende. Vielen Dank im Voraus Geri
Der Pullup ist viel zu gross. Ich würde mal 1 KOhm probieren. Davon abgesehen gibt es in einigen Anleitungen einen Fehler im Anschluss des DS18x20. Der VDD Pin darf nicht unbeschaltet bleiben. Mal im Datenblatt nachlesen. Gruss Axel
Hallo Axel Vielen Danm für Deinen Hinweis. Den 1K-Widerstand habe ich eingelötet. Es ergibt sich allerdings keine Änderung. "Davon abgesehen gibt es in einigen Anleitungen einen Fehler im Anschluss des DS18x20. Der VDD Pin darf nicht unbeschaltet bleiben. " Ich nehme an, du sprichst vom parasitäteren Betrieb. Bei mir wird der Sensor mit VDD = 5V betrieben. VDD liegt bei mir auf 5V+ Vielen Dank nochmals Geri
Hmm, dann fällt mir auch nichts mehr ein. Der Code scheint soweit ok zu sein. Evtl. mal versuchen, das Auslesen des Scratchpads mit dem Oszilloskop mitzukriegen (evtl. an einem freien Pic-Pin ein Triggersignal generieren). Gruss Axel
Hallo Axel Vielen Dank für Deine rasche Rückmeldung. Gute Idee! Werde es mal probieren und mich dann wieder melden. Beste Grüsse und nochmals vielen Dank Geri
Habe nun die Antwort vom Sensor beim Lesen des Scratch-Pad mit dem Oszi aufgenommen. So wie es aussieht liefert der Sensor acht mal den Wert 0. hm..???
Dann ist doppelt der Wurm drin. Denn Null liefert der nur bei 0°C, die Du wohl nicht hast. Und Dein Programm tastet die Werte dann auch noch falsch ab. Ich würde mal versuchen, die ganze Datenübertragung nachzuvollziehen und zu checken. Also auch das Senden der Codes. Dazu am Besten ein Triggersignal generieren an den jeweiligen Stellen und jede Aktion einzeln mit dem Oszi checken. Gruss Axel
Hallo Axel Vielen Dank für Deine Rückmeldung. Habe gedacht, dass das alles passt. Werde es aber nochmals prüfen. Im Zimmer hat es aktuell etwa 23 °C. Vielen Dank, ich werde mich dann wieder melden. Geri
Habe das Timing der Sendedaten und der gelesenen Daten geprüft. Es passt. Wenn ich das Scratchpad auslese, erhalte ich acht mal den Wert 0xFF (und nicht 0):) Beste Grüsse Geri
Hallo Ich habe das Problem nun gefunden. Wie Axel gemeint hat, es war ein Timing-Problem. Kleine Verzögerungen haben genau gestimmt. Bei grösseren kam es zu Problemen und ab und zu fehlten ein paar us. Ich nehme an, dass es ab dieser Definition zu Problemen kam. #define Delay_us(x) Delay10TCYx(x*5/10) Delay_us(5); i.O aus Delays.h void Delay10TCYx(PARAM_SCLASS unsigned char); Beste Grüsse und Axel nochmals vielen Dank für Deine Hilfe!!! Geri PS: Lauffähigen Code werde ich dann noch posten:)
Hallo zusammen Ich denke, ich habe das Problem gefunden. Es hat mich mehrere Stunden gekostet. Irgendwie hat der Compiler ein Problem mit der vierten Programmzeile. // falsch while (1==1) { PORTDbits.RD0 = 1; // Trigger für Oszi Delay10TCYx(50*5/10); // Wartezeit = 500 us PORTDbits.RD0 = 0; // reset Trigger } // richtig while (1==1) { PORTDbits.RD0 = 1; // Trigger für Oszi Delay10TCYx(50/2); // Wartezeit = 50 us PORTDbits.RD0 = 0; // reset Trigger } Beste Grüsse Geri
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.