Forum: Mikrocontroller und Digitale Elektronik RTC DS1302 liefert manchmal falsche Werte


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jo (Gast)


Lesenswert?

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

von Sven B. (scummos)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mach mal ein paar brauchbare Fotos vom Aufbau und poste die zusammen mit 
dem Schaltplan.

von Jo (Gast)


Lesenswert?

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

von Push It (Gast)


Lesenswert?

Pull-Up Widerständer vergessen ?

von Sven B. (scummos)


Lesenswert?

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.

von Coco J. (Firma: Student) (dathcoco)


Lesenswert?

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.

von kukuk (Gast)


Lesenswert?

warum loescht der Moderator so gerne...ging es doch um die pull-up...

von Jo (Gast)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

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.

von Karlheinz (Gast)


Lesenswert?

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 
???

von Jo (Gast)


Lesenswert?

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

von kukuk (Gast)


Lesenswert?

DS1307 IST I2C
DS1302 NICHT !

von Peter D. (peda)


Lesenswert?

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

von Jo (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Jo (Gast)


Lesenswert?

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

von Sven B. (scummos)


Lesenswert?

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

von Jo (Gast)


Lesenswert?

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

von Dieter (Gast)


Lesenswert?

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

von Arne (Gast)


Lesenswert?

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!

von Wollle (Gast)


Lesenswert?

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.

von Top-SecreT (Gast)


Lesenswert?

Wie bei Wolle hat bei mir auch ein Kondensator von CLK auf GND geholfen.
Vielen Dank.

von Bewässerung (Gast)


Lesenswert?

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!

von DAVID B. (bastler-david)


Lesenswert?

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
Noch kein Account? Hier anmelden.