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
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
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
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
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
Hi
>Nur wenn ich TWBR auf 152 lassen würde, hätte ich 50kHz oder?
Ja.
MfG Spess
Danke nochmal für deine Hilfe! lg Christoph
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
Ich halte 2k2 als Pullupwiderstände für etwas gering. Probier das ganze doch mal mit 10k Pullups.
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.
Na toll - jetzt löscht er seine Antwort wieder und meine ist überflüssig geworden :-)
>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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.