Forum: Mikrocontroller und Digitale Elektronik I²C Verbidung zwischen Atmega644(Master) und DS1307(Slave)


von Christoph S. (cs13)


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

von 121212qw (Gast)


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

von Christoph S. (cs13)


Lesenswert?

Vielen Dank!

Das heißt mein TWSR setze ich 0 oder?

Hättest du sonst noch irgendwelche Tipps, auf was ich achten 
muss/sollte?

Lg
Christoph

von 121212qw (Gast)


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

von Christoph S. (cs13)


Lesenswert?

Hallo

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

Warum bekomme ich bei TWSR=0 50kHz?
Weil wenn ich TWBR auf den werd 72 setze, habe ich 100kHz.
Nur wenn ich TWBR auf 152 lassen würde, hätte ich 50kHz oder?

lg
Christoph

von 121212qw (Gast)


Lesenswert?

Hi

>Nur wenn ich TWBR auf 152 lassen würde, hätte ich 50kHz oder?

Ja.

MfG Spess

von Christoph S. (cs13)


Lesenswert?

Danke nochmal für deine Hilfe!

lg
Christoph

von Christoph S. (cs13)


Angehängte Dateien:

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

von Steffen (Gast)


Lesenswert?

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

von Steffen (Gast)


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.

von Steffen (Gast)


Lesenswert?

Na toll - jetzt löscht er seine Antwort wieder und meine ist überflüssig 
geworden :-)

von Jack B. (jackbraun)


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.

von Steffen (Gast)


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.

von Christoph S. (cs13)


Lesenswert?

Dankeschön für die vielen Rückmeldungen.

Ich werde das ganze heute mal mit den 10k Pull-ups probieren, wenn
ich zuhause bin!:)

Mit freundlichen Grüßen
Christoph

von Christoph S. (cs13)


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

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.