www.mikrocontroller.net

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


Autor: Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Nagler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
u8 RTC_read_time(void) {
  if (! i2c_start(RTC_ADR + I2C_WRITE) )
    i2c_write(0x00);  // Adressregister (0) setzen
  else
    return 0xFF;

  if (! i2c_rep_start(RTC_ADR + I2C_READ) ) {
    RTCbuf.second  = i2c_readAck();
    RTCbuf.minutes = i2c_readAck();
    RTCbuf.hours  = i2c_readAck();
    RTCbuf.day    = i2c_readAck();
    RTCbuf.date    = i2c_readAck();
    RTCbuf.month  = i2c_readAck();
    RTCbuf.year    = i2c_readAck();
    RTCbuf.control = i2c_readNak();
  }
  i2c_stop();
  if (RTCbuf.second & (1 << RTC_CH)) // Uhr steht
    return 0x1F; // muss gestellt werden
    else
    return 0;
}

Gruß
Michael

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: 1307 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathias D. (gonium)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Nagler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlheinz Druschel (kdruschel)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marius (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.