I²C Verbidung zwischen Atmega644(Master) und DS1307(Slave)

OP #2799173
Lesenswert?

Hallo,

Ich bin ziemlich neu in der Elektronikbranche und arbeitete gerade an 
einem Projekt wo ich eine I²C Verbindung zwischen meinem Atmega644 und 
dem DS1307 herstellen will.

Ich will die vom DS1307 übergebene Zeit und das Datum, dann in einigen 
Berechnungen einbinden die der µC durchführen soll..

Momentan stecke ich aber bei der Einstellung der SCL Frequency.
Ich hab die Datenblätter jetzt schon ein paar mal durchgelesen, aber ich 
komm auf keine sinvolle Lösung.
Mein Atmega644 wird mit einem 16MHz Quarz getaktet und die I²C 
Verbindung mit dem DS1307 soll laut Datenblatt mit 100kHz  erfolgen.

das habe ich im Internet gefunden:

void twi_init(void)
{

  TWSR |= (1 << TWPS1) | (1 << TWPS0);  //Prescaler=64
  TWBR = 152;        // SCL=50KHz @ 16 MHz
  TWCR |= (1 << TWEN);  //TWI aktivieren

}

Nur verstehe ich nicht wie man auf  den Wert 152 kommt.
Die Formel auf Seite 206 im Datenblatt, gibt mir auch keinen 
Aufschluss..

Es wäre toll, wenn jemand von euch der mehr Erfahrung hat als ich, mir 
helfen könnte.

Vielen Dank schon mal im voraus!

Lg
Christoph
Gast #2799205
Lesenswert?

Hi

>Nur verstehe ich nicht wie man auf  den Wert 152 kommt.
>Die Formel auf Seite 206 im Datenblatt, gibt mir auch keinen
>Aufschluss.

Setze für TWPS Null ein und stelle die Formel nach TWBR um.

MfG Spess
Gast #2799231
Lesenswert?

Hi

>Das heißt mein TWSR setze ich 0 oder?

Ja. Mit

TWSR |= (1 << TWPS1) | (1 << TWPS0);  //Prescaler=64

bekommst du einen TWI-Takt von etwas über 800Hz. Mit TWSR=0 werden es 
50kHz. Nur warum 50kHz? Üblich sind 100 oder 400kHz.

MfG Spess
OP #2973543
Lesenswert?

Hallo,

ich bins wieder, hatte in den letzten
Monaten sehr viel zu tun und bin erst jetzt wieder dazu gekommen, mein
Programm auf meinen Atmega zu spielen.

Allerdings habe ich ein Problem und zwar bekomme ich immer eine 
Fehlermeldung beim übermitteln der Adresse.
Ich habe schon mit einem Oszi nachgemessen und die Signale stimmen 
außer, dass die ansteigende Flanke sehr stark abgerundet.
Ich bin mir ziemlich sicher das hier der Fehler begraben liegt, nur 
leider habe ich keinen Plan, warum das so ist..
Die Start-Condition wird vom DS1307 angenommen.

Hat von euch schon mal jemand so ein Problem gehabt?
ich habe versucht meine Kabel vom Master zum slave so kurz wie möglich 
zu halten(2,5cm), desahlb glaube ich kaum das es an der Verkabelng 
liegt..

Die Schaltung findet ihr im Anhang..

Es würde mich riesig freuen, wenn mir da wer weiterhelfen könnte!

Mit freundlichen Grüßen,
Christoph
Angehängte Dateien:
Gast #2973609
Lesenswert?

I2C ist ganz anders festgelegt. Keiner der Teilnehmer zieht die Leitung 
auf Logisch 1 (high). Das erledigen die Pullup Widerstände.

Zitat Wikipedia:
I²C benötigt zwei Signalleitungen: Takt- (SCL) und Datenleitung (SDA). 
Beide liegen mit den Pull-up-Widerständen RP an der Versorgungsspannung 
VDD. Sämtliche daran angeschlossenen Geräte haben 
Open-Collector-Ausgänge, was zusammen mit den Pull-up-Widerständen eine 
Wired-AND-Schaltung ergibt.


Ob die TWI Ausgänge des AtMega sich überhaupt auf "Ausgang" schalten 
lassen, solange das TWI aktiviert ist, weiß ich nicht.
#2973614
Lesenswert?

>Ich halte 2k2 als Pullupwiderstände für etwas gering. Probier das ganze
>doch mal mit 10k Pullups.

Pullups sind eigentlich unnötig: Beim Schreiben schaltet man SDA auf
Ausgang (DataDirectionRegister) und beim Lesen stzt man SDA auf Eingang 
und
gleichzeitig den PortPin(SDA) auf 1.
Gast #2973618
Lesenswert?

Und wenn der angeschlossene I2C Teilnehmer Click-Streching versucht, 
weil seine Daten noch nicht fertig sind? Dann gibt der µC 5V auf die 
Taktleitung und das I2C Device versucht die Taktleitung auf 0V zu 
halten. Dann ist nur die Frage, wer früher aufgibt.

Wozu gibt es Spezifikationen, wenn sich ja doch keiner dran hält? Zwei 
Widerstände kosten jetzt auch nicht die Welt.
OP #2974630
Lesenswert?

Hallo,

Hab jetzt die zwei Pull-ups mit 2,2kOhm durch zwei mit 8kOhm 
asgestauscht(hatte keine 10kOhm daheim). Aber er erkennt meine Adresse 
noch immer nicht..
Hab jetzt leider auch kein Oszi daheim um zu kontrollieren, ob die 
Flanken steiler geworden sind :/

Andere mögliche Fehlerquellen werdet ihr mir wahrscheinlich keine mehr 
sagen können, oder?

Mfg,
Christoph

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren