Hallo Bastler, ich habe ein Problem bei meinem aktuellen Projekt: Ich möchte an meinem "myAVR Board" einen Temperatursensor DS18B20 betreiben. Als Anzeige habe ich ein LCD (ebenfalls von myAVR). Habe mir sämtliche Anleitung durchgelesen... das versteht sich ja von selbst... Mein aktueller Stand ist der, dass ich 2 Modi habe (diese Schalte ich im Programm um, indem ich die nicht benötigte Funktion auskommentiere) 1. ROM ID auslesen und aufs Display geben 2. Temperatur auslesen und aufs Display geben Der erste Teil funktioniert sehr gut und zuverlässig. Beim Messen der Temperatur bin ich jedoch überfordert. Ich bekomme immer einen Wert von 127,9375 vom DS18B20 geliefert. Im Internet wird dieses Problem oft als Timing-Problem abgestempelt. Dies kann ich mir jedoch nicht vorstellen da dass Auslesen der ROM-ID problemlos klappt. Mein Programmcode habe ich beigefügt. Würde mich über ein paar Tips freuen. Liebe Grüße aus Hannover, Matthias
Matthias W. schrieb: > Im Internet wird dieses Problem oft als Timing-Problem abgestempelt. Mit welcher Taktfrequenz läuft dein ATmega328 bzw. welches Board hast du genau?
Hallo Wolfgang, Es handelt sich um ein atmega8. Er läuft auf 8MHz (interner "Quarz") Bei meinem Board handelt es sich um das myavr Board mk2 USB. Danke schonmal für deine Hilfe. Lg Matthias
Wenn es sich um ein Original-Board von myAVR handelt, dann laufen diese im Allgemeinen mit 3,6864 MHz (externer Quarz) oder mit 1 MHz (intern ohne Quarz). Ist: #define F_CPU 8000000L // run CPU at 16 MHz Soll: #define F_CPU 3686400 UL // run CPU at 3,6864 MHz Oder: Soll: #define F_CPU 1000000 UL // run CPU at 1 MHz Oder um welches Board handelt es sich?
Stimmt das _delay_us(15) in therm_ReadBit()? Zitat Datenblatt: Therefore, the master must release the bus and then sample the bus state within 15μs from the start of the slot.
Matthias W. schrieb: > Hallo Bastler, > Mein aktueller Stand ist der, dass ich 2 Modi habe (diese Schalte ich im > Programm um, indem ich die nicht benötigte Funktion auskommentiere) > 1. ROM ID auslesen und aufs Display geben > 2. Temperatur auslesen und aufs Display geben > > Der erste Teil funktioniert sehr gut und zuverlässig. > Beim Messen der Temperatur bin ich jedoch überfordert. > ID kannst du ohne Probleme auslesen? Ist auch die ID die im Datenblatt steht?
Hallo Jungs, Ich habe den Clock auf Intern 8 MHz mit dem programm "avg progtool" gestellt. Wenn ich diese Einstellung Auslese zeigt er mir die richtige (8MHz) auch an. Die ID sollte die richtige sein. Diese steht aber in keinem Datenblatt da sie ja "einmalig" ist... Nach einem reset erscheint auch immer wieder die gleiche (es sei denn ich nehme einen anderen ds18b20) Also sollte das schon funktionieren... Danke für eure Hilfe.
Matthias W. schrieb: > Hallo Jungs, > > Die ID sollte die richtige sein. > Diese steht aber in keinem Datenblatt da sie ja "einmalig" ist... > Nach einem reset erscheint auch immer wieder die gleiche (es sei denn > ich nehme einen anderen ds18b20) > Also sollte das schon funktionieren... > > Danke für eure Hilfe. Wenn ID stimmt, dann funktioniert deine Kommunikation auf der Hardwareebene einwandfrei, beim Temperaturauslesen muss auch gehen. Wie liest du den die Temperatur? Reseten, Konvertierungsanfrage, und dann Scratchpad auslesen? Du kannst dem Dreibeiner sagen das du Ihn ohne ID auslesen willst ;-)))
Hey, Also wie genau die Temperatur ausgelesen wird weiß ich ehrlich gesagt nicht. Da werden so viele Unterroutinen aufgerufen und so. Man kann da ja auch schlecht was Simulieren... Was genau soll CKDIV8 sein? Lg Matthias
Der atmega8 hat das ckdiv gar nicht. Habe ich gerade in einem anderen Thread gelesen ? Ich drehe noch durch... Das sind doch jetzt aber alles Ansätze die auf Timing Problemen hinweisen... Aber die ROM ID kann ich ja auslesen. Somit klappt ja die Kommunikation inkl Timing oder sehe ich das falsch? Lg Matthias
Matthias W. schrieb: > Da werden so viele Unterroutinen aufgerufen und so. > Man kann da ja auch schlecht was Simulieren... Kein JTAGICE3? Dann besorg dir eins um Programmlauf anzuhalten ;-) kostet nicht die Welt
Matthias W. schrieb: > Aber die ROM ID kann ich ja auslesen. Somit klappt ja die Kommunikation > inkl Timing oder sehe ich das falsch? Stimmt denn überhaupt die ausgelesene ID? D.h. ist die CRC korrekt und passt der Family Code mit der Angabe aus dem Datenblatt zusammen?
Daß der Sensor nach dem CONVERT Kommando je nach gewählter Auflösung bis zu 750mSec, also aus AVR Sicht eine halbe Ewigkeit, braucht, ist bekannt, oder? Im Code ist davon nämlich nichts zu sehen!
Matthias W. schrieb: > Im Internet wird dieses Problem oft als Timing-Problem abgestempelt. Zum 1000-7.ten male -> ist es aber
Hallo chris, ich gehe mal davon aus das die ID stimmt. Der Familiencode stimmt auch. Die ID beginnt mit 28. Und so soll es sein. Ein CRC Check wird glaube ich nicht durchgeführt. Ich habe folge zwei DS18B20 ausgelesen: 1. 28 A9 CF 46 05 00 00 45 2. 28 60 71 47 05 00 00 2E Ich denke die werden schon richtig sein... LG
iwoasesned schrieb: > Matthias W. schrieb: >> Im Internet wird dieses Problem oft als Timing-Problem abgestempelt. > > Zum 1000-7.ten male -> ist es aber Aber warum funktioniert dann das Auslesen der ROM-ID?
Weil die Kommunikation prinzipiell geht. Nur gibt es in dem Moment, in dem gelesen wird, noch keinen Meßwert.
Hallo Carl, Dann geht es nach deiner Aussage ja um das direkte Messen. Also uC nimmt einen Wert entgegen der aber eigentlich noch gar nicht da ist. Dann müsste es ja um folgende Schleife gehen: void therm_ReadTempRaw(byte id[], byte *t0, byte *t1) // Returns the two temperature bytes from the scratchpad { therm_Reset(); if (id) therm_MatchRom(id); // skip ROM & start temp conversion else therm_WriteByte(THERM_SKIPROM); therm_WriteByte(THERM_CONVERTTEMP); while (!therm_ReadBit()); // wait until conversion completed therm_Reset(); // read first two bytes from scratchpad if (id) therm_MatchRom(id); else therm_WriteByte(THERM_SKIPROM); therm_WriteByte(THERM_READSCRATCH); *t0 = therm_ReadByte(); // first byte *t1 = therm_ReadByte(); // second byte } sehe ich das richtig?
Habe den Fehler gefunden!!! Die Programmzeilen aus meinem vorherigen Post waren betroffen...: void therm_ReadTempRaw(byte id[], byte *t0, byte *t1) // Returns the two temperature bytes from the scratchpad { therm_Reset(); if (id) therm_MatchRom(id); // skip ROM & start temp conversion else therm_WriteByte(THERM_SKIPROM); therm_WriteByte(THERM_CONVERTTEMP); while (!therm_ReadBit()); // wait until conversion completed therm_Reset(); // read first two bytes from scratchpad if (id) therm_MatchRom(id); else therm_WriteByte(THERM_SKIPROM); therm_WriteByte(THERM_READSCRATCH); *t0 = therm_ReadByte(); // first byte *t1 = therm_ReadByte(); // second byte } Die if (id) ... Abfrage habe ich raus genommen. nun klappt es. Verstehe ich das richtig, dass wenn ich die if Abfrage raus nehme, ich den Sensor nicht per ID anspreche? LG
Matthias W. schrieb: > Verstehe ich das richtig, dass wenn ich die if Abfrage raus nehme, ich > den Sensor nicht per ID anspreche? keine Ahnung ist zulange her bei mir, läuft seit 5 Jahre oder so ich suche solange bis ich keine Sensoren mehr finde und lege jeden gefundenen Sensor in ein array, hab ich eine ID gefunden dann setze ich im Array das Flag da ich immer alle Sensoren lese schaue ich nur ins Array und ordne es nach IDs den Zimmern zu
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.