Hallo! Ich habe eine Frage zum DS1302 bzw. zur Übertragung der Zeit über den Bus. Ich habe eine Schaltung bestehend aus einem DS1302 und einem Arduino. Diese habe ich zweimal aufgebaut, eine auf meinem Breadboard, eine auf Lochrasterplatine. Die Schaltungen und der verwendete Code sind identisch. Die Schaltung auf der Lochrasterplatine mit dem DS1302 ist vom Arduino-Board selbst abgesetzt und über Drähte mit diesem verbunden. Auf dem Breadboard läuft meine Schaltung sowie der verwendete Code wie gewünscht. Bei der Schaltung auf der Lochrasterplatine liefert der DS1302 manchmal falsche Werte, z.B. den "46.12.2109" oder "21:65:09" als Datum bzw. Zeit. Das Interessante daran ist, dass der RTC offfensichtlich richtig weiterzählt. Resetet man die Schaltung, startet der Arduino wieder mit der richtigen Zeit (Puffer-Batterie "2032" ist dran). Es gibt keinen festen Zeitraum nach dem das Phänomen auftritt (geht mal ein paar Stunden gut, dann 'ne ganze Woche). Die Lötstellen habe ich alle geprüft/nochmal nachgelötet, den DS1302 mehrfach ausgewechselt (auch aus verschiedenen Lieferchargen). Es passiert außerdem Folgendes: wenn ich mit dem Finger ganz leicht die 3 Drähte berühre, die das Signal vom RTC zum Arduino übertragen, dann werden plötzlich wieder die richtigen Werte angezeigt. Es sieht also ein wenig nach einem Datenübertragungsproblem auf dem 3-Wire-Bus aus. Die Drähte haben so 8-10cm länge. Ich weiß aber nicht wie ich das Lösen soll. Einpacken der 3 Drähte in Alu-Folie (zur Abschirmung) habe ich schon versucht, hat aber nichts gebracht. Über einen Lösungsansatz, wie ich dem Problem auf die Schliche komme, wäre ich Dankbar. Vieleicht hat gar jemand das Problem schon gehabt und kennt die Lösung. Ossi wäre im Notfall vorhanden (wäre aber nur mit allerhand zeitlichem Aufwand verfügbar). Viele Grüße Jo
Hallo! Ich hatte ähnliche Probleme mit einem ADC und habe das gelöst, indem ich nahe beim Chip zu den Datenleitungen 100pF Kondensatoren an GND parallel geschaltet habe. Vielleicht hilft das ja hier auch. Evtl. dasselbe nochmal an der anderen Seite der Leitung. Dafür spricht auf jeden Fall, dass der Finger meines Wissens nach einen vergleichbaren Effekt hat. ;) Grüße, Sven
Mach mal ein paar brauchbare Fotos vom Aufbau und poste die zusammen mit dem Schaltplan.
Hallo Sven, 100pf hatte ich nicht in der Kiste, sind jetzt aber bestellt. Werde die am WE einfach mal gegen Masse löten. Viele Grüße Jo
Jo schrieb: > Hallo Sven, > > 100pf hatte ich nicht in der Kiste, sind jetzt aber bestellt. Werde die > am WE einfach mal gegen Masse löten. > > Viele Grüße > Jo Müsste auch mit ähnlichen Werten funktionieren, z.B. 220pF, also wenn du sowas hast... das sollte auch passen.
Ich hatte ähnliche Probleme mit meinem DS1307. Verursacht hat diese ein Schaltregeler auf der Platine wogegen die ICs nicht genug abgeschirmt waren, und ein zu großer Pull-UP, falls nicht schon geschehen würde ich diese beiden sachen einmal überprüfen.
warum loescht der Moderator so gerne...ging es doch um die pull-up...
PullUp? Hatte ich eigentlich nicht gemacht, weil im Arduino Guide für den DS1302 folgendes steht: "Some schematics on the internet have pull-up resistors on the three interface lines. That is totally wrong." Quelle: http://playground.arduino.cc/Main/DS1302 Es steht auch nichts im Datenblatt von Maxim zu PullUp Widerständen. Ich werde es mit den Kondensatoren probieren. Melde mich, wenn ich die draufgelötet habe. Jo
Statt der Cs nach Gnd kannst Du auch Rs seriell in die Datenleitung legen, vornehmlich auf der Treiberseite. Das unterdrückt Ringing auf der Leitung durch Fehlanpassung.
Hallo, Jo schrieb: > wenn ich mit dem Finger ganz leicht die > 3 Drähte berühre ... du solltest eigentlich mindestens 4 Drähte haben., oder GND vergessen ???
So, Kondensatoren sind draufgelötet. Leider war auf der Oberseite der Platine kein Platz mehr, da saß schon die Batterie. Also Quick & Dirty auf der Unterseite angebracht. Ich habe erst mal 3 Stück auf der Seite des DS1302 angebracht, von den 3 Bus-Leitungen jeweils gegen GND. Seit 2 Stunden läuft die Schaltung, bisher fehlerfrei. Das bedeutet aber noch nichts. Wenn nach Weihnachten noch alles läuft, war es die Lösung. Melde mich dann noch mal. Jo
Jo schrieb: > wenn ich mit dem Finger ganz leicht die > 3 Drähte berühre, die das Signal vom RTC zum Arduino übertragen, dann > werden plötzlich wieder die richtigen Werte angezeigt. Deutet zu 99% auf ein Timingproblem in der Software hin. Irgendwo wird auf die falschen Flanke getriggert. Jo schrieb: > "Some schematics on the internet have pull-up resistors on the three > interface lines. That is totally wrong." Hübsch, wie da jemand meint, die Weisheit mit Löffeln gefressen zu haben. Der /CE sollte auf alle Fälle einen Pullup haben, damit der Chip nicht beim Reset oder Programmieren wirre Daten eingeschrieben kriegt. Und man kann sehr wohl das SPI benutzen. Dazu muß man den IO des RTC mit dem MISO verbinden und zum MOSI ein 2,2 .. 4,7k Widerstand. Sobald der Pin Output wird, überstimmt er das MOSI am Widerstand. Peter
Herzlichen Dank an alle, die sich in diesem Thread an der Lösung des Problems beteiligt haben, insbesondere an Sven, der als erstes einen (erfolgreichen) Lösungsvorschlag gemacht hat. Die Schaltung läuft jetzt nach dem Auflöten von Kondensatoren 100pF mehr als eine Woche stabil. Mir ist noch nicht ganz klar, warum das so ist. Vieleicht verrät das hier ja noch jemand. Nochmal für die Doku: das Problem, dass falsche Werte vom DS1302 zum µC übertragen wurden, wurde dadurch gelöst, dass 100pF Kondensatoren von den Busleitungen (CE, I/O, SCLK) gegen GND gelötet wurden. Viele Grüße Jo
Jo schrieb: > Mir ist noch nicht ganz klar, warum das so ist. Weil das eigentliche Problem damit nicht gelöst wurde! Es wurde nur als Würg-Around das Timing verschliffen. Vermutlich ist die SCK-Flanke falsch gewählt und die Kondensatoren verlängern die Datenhaltezeit nach der (falschen) Flanke. Also einfach mal im Datenblatt des DS1302 nachschauen, auf welcher Flanke gelesen/geschrieben wird und das SPI richtig einstellen. Soweit ich das richtig erinnere, ist beim Umschalten von Schreiben auf Lesen noch ein Leerbit eingefügt. Man muß die gelesenen Datenbytes also alle um ein Bit verschieben. Peter
Hallo Peter, danke für Deine Antwort. Ich nutze die Arduino-Library von Henning Karlsen für den DS1302. Quelle: http://www.henningkarlsen.com/electronics/library.php?id=5 Das würde bedeuten, dass diese Library fehlerhaft ist. Das ist nicht ausgeschlossen, allerdings hatte ich vor meinem Posting hier im Forum das Internet bereits nach dem Problem durchsucht - und nichts gefunden. Meine Kenntnisse reichen für eine abschließende Beurteilung nicht aus. Trotzdem Danke für Deine Bemühungen. Ich finde Foren wie dieses sehr hilfreich. Viele Grüße Jo
In diesem Forum werden derartige Probleme mit SPI irgendwie immer auf das Timing geschoben. Das mag manchmal sein, aber ich bin nicht der Meinung, dass es zum Beispiel in diesem Fall die richtige Erklärung ist. Ich kam auf diese Kondensator-Lösung aufgrund dieses Threads [1] Man beachte, dass der Mensch der den Ratschlag gegeben hat, Mitarbeiter von Analog Devices ist -- der weiß also wahrscheinlich, wovon er redet. Das hat das Problem dort gelöst, und für zwei Boards bei mir hier auch, bei denen ich das Timing-Diagramm wirklich sorgfältig überprüft hatte und die einfach nicht funktionieren wollten. Auf dem Eval-Board von AD sind auch solche Entstör-Maßnahmen, und die werden das Timing-Diagramm von ihrem eigenen Chip ja wohl richtig umgesetzt haben. Der Grund ist wohl, wie dort auch gesagt, dass die langen Kabel als Antenne wirken (oder sich sonstwie Störungen einschleichen), die vom Chip dann inkorrekt z.B. als Flanken auf CS erkannt werden. Widerstände auf der Leitung oder Kondensatoren zu Ground dämpfen solche kurzen Stör-Flanken weg. Ich vermute (!) dass das bei SPI passiert, aber nicht bei I2C, weil I2C nur relativ niedrige Taktfrequenzen von 400kHz (oder so) erlaubt, SPI hingegen geht bis viele MHz. Entsprechend können es sich die I2C-Chips evtl. leisten, auf eine "deutlichere" Flanke zu warten (auf welche Art auch immer man das umsetzen möchte, Filter, Trigger-Level, ...). Das ist aber nur geraten. ____ [1] http://ez.analog.com/thread/12906
Hallo! Ich wollte mich noch mal mit einem Ergebnis aus dem "Langzeittest" zurückmelden. Seit 21.12.2012 (bis heute 31.03.2013) läuft die Schaltung stabil und ohne Probleme. Sollte nochmal jemand gleiche Probleme mit dem DS1302 haben, kann ich die Lösung mit den Kondensatoren wärmstens empfehlen. Viele Grüße Jo
Lothar Miller schrieb: > Mach mal ein paar brauchbare Fotos vom Aufbau und poste die zusammen mit > dem Schaltplan. Solange Du diese Forderung nicht erfüllt hast, ist Dein work-around für andere nicht brauchbar. Jo schrieb: > kann ich die Lösung mit den Kondensatoren wärmstens empfehlen. Damit wird an Symptomen herumgedoktert, ohne die eigentliche Fehlerursache zu suchen. Das ist Bastelei und kein professionelles Vorgehen. Schade drum. Dieter
Bitte verzeiht, dass ich diesen älteren Thread noch einmal ausgrabe aber mir hat der Lösungsvorschlag von Sven ebenfalls geholfen und mir scheint, dass Peter und Dieter diesen zu Unrecht in ein merkwürdiges Licht rücken. Ich hatte genau das gleiche von Jo beschriebene Problem, dass ich manchmal unplausible Zeiten von dem DS1302 gelesen habe. Und dies obwohl ich eine Bibliothek und dann noch einmal eine aufmerksam mich an das Timing des Datenblatts haltende eigene Routine zur Kommunikation mit dem DS1302 verwendet habe. Ich denke schon, dass Svens Lösung -- je einen 100pF Kondensator parallel zu den Datenleitungen gegen GND möglichst nahe am Chip -- tatsächlich eine Lösung des Problems ist, da es sehr gut sein kann, dass z.B. Störungen eine Flanke an der Clock Leitung hervorrufen, sodass für den Mikrocontroller ein Bit übersprungen wird und man dadurch unsinnige Werte erhält. Zu den von Peter verteidigten pull-up Widerständen sei noch gesagt, dass deren Verwendung für einen DS1302 in der Tat nicht korrekt ist: das Datenblatt verrät, dass alle Interface-Pins interne pull-down Widerstände (~40 kOhm) besitzen. Es ergibt ja auch keinen Sinn, einen ChipEnable Pin (es ist kein /CE!) mit einem pull-up per default auf high zu legen. Besten Dank noch einmal an Sven und Jo!
Nach langer Zeit muss ich auch noch meinen Senf dazu geben. Ich hatte das gleiche Problem. Bei mir reicht ein 100pF von CLK nach GND.
Wie bei Wolle hat bei mir auch ein Kondensator von CLK auf GND geholfen. Vielen Dank.
Ich hatte die selben Probleme. Allerdings nur in Kombination mit dem Seriellen Monitor. Bei mir hat die Anzeige 8 Minuten gestimmt 8 Minuten nicht. Mit einem Led-Modul TM1637 alleine hat es nie Probleme gegeben.(http://i.ebayimg.com/t/2Stk-4-Bits-TM1637-Red-Digital-Tube-LED-Display-Modul-Mit-Clock-fuer-Arduino-Neu-/00/s/NzAwWDc0MA==/z/F2oAAOSwxH1T7I2m/$_35.JPG) Danke an Sven und Wollle! Durch den Kondensator keine Probleme mehr - durchgehend die richtige Anzeige. So kann auch ich diese Lösung nur weiter empfehlen!
Ich habe auch dieses Problem mit dem DS1302. Ich habe auch die 100pF Kondensatoren an die pins von CLK und DAT dann hatte ich aber gar keine zeit mehr auslesen können. Habe den Kondensator von DAT wieder abgemacht aber ich bekomme immer noch die falsche Uhrzeit spontan angezeigt.(geht auch mal 5 Minuten am stück) Es wurde oben mal das Thema library und timing angesprochen also als library nutzte ich ; https://github.com/msparks/arduino-ds1302 Und die Timings konnte ich noch nicht finden. wo genau sucht man da ? Danke
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.