Forum: Mikrocontroller und Digitale Elektronik RTC DS1307 antwortet stets mit Not Acknowledge


von Simon (Gast)


Angehängte Dateien:

Lesenswert?

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

von Michael Nagler (Gast)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

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

von 1307 (Gast)


Lesenswert?

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.

von Mathias D. (gonium)


Lesenswert?

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

von Simon (Gast)


Lesenswert?

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.

von Michael Nagler (Gast)


Lesenswert?

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.

von Karlheinz D. (kdruschel)


Lesenswert?

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

von Marius (Gast)


Lesenswert?

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