Hallo alle zusammen, ich lese mit einem Atmega8 5 DS18S20 Temperatursensoren aus und gebe die Werte auf einem 4x20 Zeichen Display aus bzw. schicke sie per UART zum PC/LabView (Pull-Up 4,3 kOhm, parasitäre Versorgung). Das Problem: Hin und wieder misst mindestens einer der Sensoren einen falschen Wert mit Abweichungen nach oben und unten (von +55 bis -80 obwohl T=20). Woran kann das liegen? Die meiste Zeit geht ja alles. Ich mache die Pausen zur 1-wire Kommunikation über _delay_us(); kann das ein Problem sein? Sind die Pausen zu ungenau und sollte ich es mit einem Timer lösen? Danke schonmal für die Hilfe. Wenn Code gebraucht wird reiche ich den gerne nach (ist etwas viel)! Viele Grüße Thomas
an den Timern hat es nicht gelegen, das habe ich geändert und getestet. Hat keiner eine Idee? Kennt keiner dieses Messverhalten?
Bei der Temperaturmessung mit Parasitäre Stromversorgung muss über einen seperaten Ausgang ein Transistor oder FET geschaltet den s.g.STRONG PULLUP ON DQ. siehe Anhang und mind. 750ms gehalten werden. Dabei ist zu beachten das erst nach 750ms die Sensoren ausgelesen werden können ansonsten gibt es Fehler. Ob es dir hilft keine Ahnung!
Hallo, danke für die Antworten! Die CRC wird nicht kontrolliert, da ich Probleme habe sie zu generieren. Wenn da jemand schon etwas programmiert hat und es posten könnte, wäre ich dankbar dafür! Mir ist die Sache mit dem Strong-Pull- Up (warum auch immer) im Datenblatt nicht aufegfallen. Ich werde das auf jeden Fall probieren, sobald ich mir einen entsprechende Transistor besorgt habe!
Daywalker schrieb: > ich lese mit einem Atmega8 5 DS18S20 Temperatursensoren aus Wie lange sind die Leitungen? Kann da was einkoppeln? Daywalker schrieb: >>> DS18S20 messen manchmal falsch > Die CRC wird nicht kontrolliert Das ist so wie: Warum verhalten sich andere Autofahrer mir gegenüber so rücksichslos? Übrigens: in meinem Auto sind alle Lampen (Blinker, Bremse,...) kaputt, ich ersetze sie aber nicht, weil ich nicht drankomme.
Hast du Interrupts laufen? Das bringt das Timing durcheinander und war bei mir einmal ein Problem. Grüsse
Daywalker schrieb: > Datenblatt nicht aufegfallen. Ich werde das auf jeden Fall probieren, > sobald ich mir einen entsprechende Transistor besorgt habe! Das Bild beschreibt einen klassischen 8051er-Port, der fast keinen Strom liefern kann. In Verbindung mit einem AVR wird kein Transistor benötigt, dessen Port kann wenn aktiv auf high den Strom locker selbst liefern. Du bist übrigens nicht der Erste, der einen DS18x20 einsetzt. Es gibt dafür Code, hier im Forum und anderswo. Inklusive CRC. http://www.mikrocontroller.net/articles/Temperatursensor#DS18S20_.2F_DS18B20
Hallo, danke für eure Hilfe auch wenn keiner Tipps helfen konnte habe ich das Problem mittlerweile gelöst! Die Antwort steht hier und stammt von Volker U. Beitrag "DS1820, DS18B20 in C" Das Problem war, dass ich einen zu langsamen Quarz mit 3,8... Mhz eingesetzt habe, dadurch wurde die parasitäre Stromversorgung nicht schnell genug (max. 10 µs) nach senden des T_Convert Befehls geschaltet. Ich habe einen schnelleren Quarz 7,2... MHz eingelötet und danach waren die Fehlmessung weg (innerhalb von 24h keine einzige!)
Dennoch solltest du den CRC überprüfen und den Strong pullup einbauen
Daywalker schrieb: > Das Problem war, dass ich einen zu langsamen Quarz mit 3,8... Mhz > eingesetzt habe, dadurch wurde die parasitäre Stromversorgung nicht > schnell genug (max. 10 µs) nach senden des T_Convert Befehls geschaltet. Dann sollte er entweder den alten Wert oder 85°C anzeigen. Viel eher wird das Bit-Timing nicht stimmen, da ja die C-Ausdrücke auch Zeit brauchen und zu den Delays addiert zu lang sein können. Vielleicht hast Du auch eine ungünstige Optimierung gewählt. Ich benutze ausschließlich -Os. Peter
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.