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
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.
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!
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