Mittlerweile versuche ich seit 2 Tagen irgendwas aus diesem RTC heraus zu holen. Aber er schickt immer nur ein Nack zurück, wenn ich ihn anschreibe. Als µC verwende ich den Atmega16L, Programmiersprache ist C, Compiler der avr-gcc und Programmer stk500v2. Ich denke zwar nicht, dass es irgendwas mit dem Quelltext zu tun haben dürfte, aber ich habe ihn mal angehängt. Ansonsten kann man ja nicht viel falsch machen... 5V als Versorgungsspannung, der richtige Quarz hängt auch am RTC und Pullups an SDA und SCL verwende ich die Atmega internen (habs mit externen auch versucht, aber war genau das selbe). Ich habe mittlerweile schon das bedenken, dass der RTC schlicht und einfach defekt ist, aber bevor ich mir für 10 Euro einen neuen schicken lasse, wollte ich nochmal hier nachfragen, ob nicht noch jemand eine Idee hätte. Ist es auch möglich, dass der Quarz am RTC defekt ist? Der ist jetzt schon ein paar Jahre alt, und ich weiß nicht, ob das einen Effekt hat. Oszilloskop habe ich leider keines zur Verfügung. Also, falls jemand helfen könnte, ich wäre sehr dankbar :) Mit freundlichen Grüßen, Simon
Hallo Simon, zum DS1307 gibt es hier einige Beiträge; einfach mal die Suchfunktion "DS1307" benutzen und das Datenblatt aufmerksam lesen: Wenn keine Batterie angeschlossen ist, muss(!) Vbatt auf Masse gelegt sein, sonst antwortet die RTC nicht. Ich lese die Uhr so aus:
1 | u8 RTC_read_time(void) { |
2 | if (! i2c_start(RTC_ADR + I2C_WRITE) ) |
3 | i2c_write(0x00); // Adressregister (0) setzen |
4 | else
|
5 | return 0xFF; |
6 | |
7 | if (! i2c_rep_start(RTC_ADR + I2C_READ) ) { |
8 | RTCbuf.second = i2c_readAck(); |
9 | RTCbuf.minutes = i2c_readAck(); |
10 | RTCbuf.hours = i2c_readAck(); |
11 | RTCbuf.day = i2c_readAck(); |
12 | RTCbuf.date = i2c_readAck(); |
13 | RTCbuf.month = i2c_readAck(); |
14 | RTCbuf.year = i2c_readAck(); |
15 | RTCbuf.control = i2c_readNak(); |
16 | }
|
17 | i2c_stop(); |
18 | if (RTCbuf.second & (1 << RTC_CH)) // Uhr steht |
19 | return 0x1F; // muss gestellt werden |
20 | else
|
21 | return 0; |
22 | }
|
Gruß Michael
Vbat ist aus Masse, und das Datenblatt kann ich mittlerweile beinahe auswendig.Auch sonst habe auf mikrocontroller.net und auch mit Google alles durchstöbert, was ich nur zum DS1307 finden konnte. Zu deinem Beispiel: so weit zum auslesen komme ich nicht mal. Ich schreibe über den I2C Bus eine Start condition und anschließend schicke ich die Slave Adresse + Write Bit im TWDR Register los. Anhand des Statusregisters TWSR kann man ja dann erkennen, was mit der Meldung passiert ist. Und hier bekomme ich immer den Wert 0x20, was für "SLA+W has been transmitted, NotAck has been received" bzw. wenn ich das igonriere und anschließend das Datenbyte schreibe 0x30 "Databyte has been transmitted, NotAck has been received".
Ich denke es hat mit einer hohen Wahrscheinlichkeit mit dem Code zu tun. Wenn der Quarz nicht schwingen wuerde, so wuerde die Uhr nicht weiterzaehlen, aber antworten muesste sie trotzdem. Ich hab den Code nicht angeschaut, das Entzippen ist mir zuviel. Ich wuerde mal den Logicanalyzer/Scope anklemmen und die Kurvenformen und Daten verifizieren.
Hallo Simon, meine beliebtesten Fehler beim DS1307: - VBat nicht drangehängt - Pullups zu klein (ich verwende 10K, bei 4k7 hatte ich nur Probleme) Du verwendest die TWI-Hardware anscheinend direkt - was passiert den, wenn Du die Lib von Peter Fleury verwendest? Gruß, -Mathias
Ok, vielen Dank euch allen, jetzt habe ich wenigstens einen Ansatz, was ich alles probieren kann. Bei den Pullups werde ich es auch nochmals extern mit 10k Widerständen versuchen anstatt der 4k7. Die Lib von Peter Fleury hatte ich bisher auch noch nicht entdeckt, das ist auf jeden Fall auch einen Versuch wert.
Hallo Simon, nimm die Library von Peter Fleury! Sie ist sehr einfach anzuwenden und Du siehst anhand der Statusbytes sofort jeden Fehler Deines Codes. Mein Beispiel oben verwendet sie auch.
Die Lib von Peter Fleury gefällt mir zwar auch, aber mit dem DS1307 krieg ich die auch nicht zum laufen. Gibt´s da mal irgendwo ein Beispiel oder so ? Greets Karlheinz
Hallo... ich weiss das dieses Thema alt ist aber ich habe seit gestern das exakt das selbe Problem und befürchte auch das der Chip einfach einen weg hat. Habe mir zuerst einen I2C Portexpander vorgenommen, als das funktionierte und ein Lcd darüber lief wollte ich dann endlich auch den DS1307 ansteuern. Beim ersten Test als das RTC Tiny Modul mit am Bus hing kam glaub ich erst garkeine Anzeige auf dem Display. Abgesteckt, neu verkabelt und neu versucht und da lief das Lcd auch wieder parallel mit. Nun hab ich jetzt zwei Tage lang versucht mit allen möglichen Sequenzen die ich hier und im Web zum DS1307 gefunden habe eine Anwort aus dem Chip zu entlocken. Nada. Habe mir mittlerweile auch schon die einfachen 24C32 Lese und Schreibbefehle angeeignet, da dieses EEPROM ebenfalls mit auf dem Modul sitzt, dieses lässt sich wunderbar ansteuern. Bei den ersten Writes erhalte ich als TWI Status 0x18 und 0x28 zurück. Wenn ich nun wieder die Writesequenz für den 1307 teste dann erhalte ich 0x20 und 0x30 wie hier schon beschrieben. Habe das CH sowie die RS Register versucht zu beschreiben, aber der Chip gibt leider garkein Zeichen von sich. Mein Oszilloskop ist leider zur Zeit verliehen, konnte nur sicherstellen das Vcc Vbat im grünen Bereich liegen. Das Fluke scheint aber die 50kHz Clk schon nicht mehr zu erkennen. Hänge witzigerweise auch an einem STK500v2 und benutze auch die HArdware TWI wie der Threadersteller, µC ist ein mega8535 über nen 8MHz Quarz auf dem STK Sockel. Habt ihr noch ne Idee was man irgendwie debuggen oder versuchen könnte ?
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.