Forum: Mikrocontroller und Digitale Elektronik DS1307 - NACK anstelle von ACK


von Nicky C. (sylvester1975)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich bin gerade am verzweifeln. Ich habe bisher einen MEGA128 in Combi 
mit dem DS1307 betrieben. Die Software funktioniert 1A.

Da der Mega total überdimensioniert war, hab ich nun einen MEGA16 
verwendet und den Code angepasst.

Wenn ich beim Programmstart den DS1307 initialisiere, funktioniert alles 
bestens (Statusregister werden gesetzt - Taktoutput ist messbar). Wenn 
ich aus einem Interrupt kommend jedoch die Uhrzeit hineinschreiben 
möchte, erhalte ich nach Schreiben von SLA+W ein NACK anstelle des lt. 
Datenblatt zu erwartenden ACK. Was ich allerdings nicht verstehen kann, 
denn ich verwende in diesem Teil die gleichen Codeschnipsel wie bei der 
Initialisierung und auslesen der Uhrzeit.

Gleich vorn weg, ich hab bereits Google und das Forum gestresst, Vbat 
liegt mit 3,18V am DS an, die PullUp's egal ob 4,7k oder 8,2k habe ich 
auch schon getauscht, selbst den DS1307 habe ich schon gewechselt und 
bekomme immer das gleiche Ergebnis.

Was auch überhaupt nicht funktioniert, ist die stop condition, wenn ich 
die verwende, kann ich mit einer start condition den DS nicht mehr 
ansprechen. Deshalb verwende ich immer die repeat start condition.

Im Anhang habe ich mal ein paar Codeteile - ACHTUNG ASSEMBLER :-D 
beigefügt.

Hat jemand eine Idee, woran das liegen kann, wie schon oben geschrieben, 
ich verwende den Code mehrfach und in der INITIALISIERUNG funktioniert 
es wunderbar, ich kann die STATUS-Register setzen und die Zeit auslesen, 
aber wenn ich schreiben möchte, weigert sich irgend etwas.
Und auf dem MEGA128 rennt es ohne Stress.

????

Währe schön wenn da jemand noch eine Idee hätte.

von Jadeclaw D. (jadeclaw)


Lesenswert?

Gleicher CPU-Takt?
JTAG-Fuse? (Falls Port-C verwendet )

von Nicky C. (sylvester1975)


Lesenswert?

Hallo,

danke für die schnelle Antwort.

Ja ich verwende den JTAG an Port C, aber dieser liegt an PC2-PC5 SDA und 
SDL liegen doch auch PC0 und PC2

Die CPU-Clock ist die gleiche = 16MHz.

DIE SCL-Frequ. sollte weit unter den DS1307 spezifizieten 100kHz liegen

TWBR=50
TWPS0 gesetzt

Sollte doch, wenn ich mich nicht verrechnet habe bei 38,461kHz liegen 
oder irre ich mich da, aber er liesst und schreibt ja auch, warum aber 
nicht immer?

von Nicky C. (sylvester1975)


Lesenswert?

Sorry falscher Fehler:

SDA und SDL liegen natürlich auf PC0 und PC1

von Nicky C. (sylvester1975)


Lesenswert?

Hallo Zusammen,

hab das Problem gefunden, ich kann es mir zwar nicht erklären, aber 
vielleicht ist es ein Bug im Mega16 - keine Ahnung, denn wie schon 
mehrfach geschrieben, im Mega128 funktionierte die Software.

1. Wenn ich die TWI-Stop_condition verwende und dort TWINT, TWSTO und 
TWEN setze (lt. Datasheet des Mega16) und per "out" in TWCR schreibe, 
dann ist TWINT inactive und wird auch nicht mehr gesetzt - eine Start 
Condition bringt auch nichts. Abhilfe brachte nur ein danach eingefügtes 
löschen von TWCR bevor ich wieder neue Aktionen starten konnte.

2. Ich hab meinen kompletten Code durchsucht, aber keine Stelle gefunden 
wo folgendes geschehen könnte, aber irgendwie wird mein TWBR 
rückgesetzt. sobalt ich nun in die Routine einspringe, schreibe ich es 
zur Vorsicht neu ein und seit dem funktioniert es auch endlich wieder.

Bis denn dann, vielleicht hilft es ja irgendwann mal jemanden beim 
Suchen und erspart 2 zusätzliche graue Haare ;-) .

MfG

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.