-
-
Erfahrener Benutzer
Fleißiges Mitglied
I2C Hilfe
Hallo zusammen
Ich benötige für die Ansteuerung eines Uhren-IC's über I2C Hilfe...
Ich arbeite mit der I2C Bibliothek von Peter Fleury.
Das Programm könnte eigentlich zum laufen kommen, jedoch denke ich, dass ich eine falsche Reihenfolge der Befehle habe.
Wenn ich zum Beispiel ein Register beschreiben will, mache ich folgendes:
I2C_Start (Adresse des IC's+0 am Schluss für "Write")
I2C_Write (Adresse des Registers im IC)
I2C_Write (Wert den ich ins Register schreiben will)
I2C_Stopp()
Wenn ich etwas lesen will mache ich es folgendermassen:
I2C_Start (Adresse des IC's+0 am Schluss für "Write")
I2C_Write (Adresse des Registers im IC)
I2C_Stop()
I2C_Start (Adresse des IC's+1 am Schluss für "Read")
daten = I2C_Read_NAck (Adresse des Registers im IC)
I2C_Stop()
Leider funktioniert beides nicht... Ich denke ich habe einen total falschen Ablauf....
Ich brauche diese Ansteuerung dringend und habe keine Zeit, lange einen Code zu schreiben, darum möchte ich diese Bibliothek verwenden. Ich hoffe jemand kann mir den korrekten Ablauf beschreiben. Ich würde mich freuen. Den Rest kann ich mir dann schon zusammenreimen, wie's weiter geht...
Danke!!
-
Erfahrener Benutzer
Robotik Einstein
So ne Bibliothek gibt dir doch nur die Grundbausteine für I2C.
Ob die Steine so sind, wie deine Uhr sie braucht, weiß alleine die Beschreibung zu deiner Uhr...
Freilich sieht's aus wie das Protokoll, das viele I2C Slaves verlangen.
Das byte i2c_readnack() bekommt kein Argument, und vorne fehlt ein i2c_init().
-
Erfahrener Benutzer
Fleißiges Mitglied
Das I2C_INIT habe ich nur hier vergessen. Im Code hab ichs schon drin.
Ich verstehe nur nicht ganz wie ich lesen kann...
Welches soll ich nehmen...
readack oder readnack oder was?
Ich probier nochmals ein bisschen rum, jedoch fehlt mir eben schon der Einstieg. Es handelt sich um einen DS1307 Uhren-IC, für die, die das Datenblatt mal anschauen möchten!!! Danke!! Ist wirklich dringen!!
Merci
-
Erfahrener Benutzer
Robotik Einstein
Machen die i2c-Routinen überhaupt was?
Wenn ein Slave nicht richtig verdrahtet ist, dann hängen sich Fleurys Routinen chic in ne Endlosschleife...
Check das mal, ob du überhaupt über i2c_start() rüberkommst.
Laut Spez sendet i2c_readNak() kein ACK nache dem letzten Receive. Beim 24C02 sieht ein Sequential Read also so aus:
...
i2c_readAck();
i2c_readAck();
i2c_readNak();
i2c_stop().
-
Erfahrener Benutzer
Fleißiges Mitglied
Die Routinen laufen eigentlich schon. Erst wenn ich eine falsche Adresse angegeben wird, bleibt es in einer Endlosschleife hängen...
Wie siehts denn eigentlich mit den Ports aus? Muss ich die zuerst noch als Ein- bzw. Ausgänge definieren?
-
Erfahrener Benutzer
Robotik Einstein
Das macht i2c_init(), zumindest für die Softwareversion i2cmaster. Für die Hardwareversion twimaster braucht man die Ports überhaupt nicht anzufassen, das wird von der TWI-Einheit gemanagt, analog zum UART, wo man sich auch um nix kümmern muss.
Ein Blick in die Source von i2cmaster offenbart einen bug bei großen AVRs.
Fleury geht davon aus, daß PINn, DDRn und PORTn aufeinander folgen. Für große ATmegas ist das AFAIK nicht immer so (zB PortE).
Welche Version verwendest du denn?
Sonst alles gecheckt?
- #define für CPU-Frequenz (nicht notwendig gleich deiner Quarz-Frequenz)
- #defines für Ports (falls Soft-Version)
- Pullups an SCL und SDA
- Slave-Adresse
- Objekte neu generiert nach Anpassung der Makros? Wirklich?
- Ist das Slave-Protokoll so wie im Slave-Manual?
Ich hab mir gestern nach deinem Post mal das Fleury-Zeug geholt, weil ich auch noch was via I2C machen werde.
Hab noch ein 24C02 rumfliegen und an nen Mega8 gestöpselt.
Ging alles auf Anhieb so wie man sich das wünscht; allerding mit etwas angestaubtem Compiler (gcc 3.3) und eigenem Makefile. Aber das sollte nix zur Sache tun...
BTW: *Was* funktioniert denn dabei nicht?
-
Erfahrener Benutzer
Fleißiges Mitglied
Das komische ist, dass ich mit der genau gleichen Programmabfolge es schon mal zum laufen brachte, jedoch mit DIL-Version auf dem Steckbrett.
Ich könnte mir natürlich auch vorstellen, dass der Baustein kaputt ist, den ich jetzt verwende. Ich habe zusätzlich noch einen Temp- und Feuchtigkeitsmesser über I2C. Ich werde es mal mit dem versuchen...
Werde deine Ratschläge befolgen...
-
Erfahrener Benutzer
Fleißiges Mitglied
Note: Was isch komisch finde...
Habe geschaut was die Fleury-Library eigentlich so macht...
Beim I2C Write wird der zu schreibende Wert ins TWDR (oder wie auch immer) geschrieben.
GENAU der gleiche Wert bekomme ich beim I2C Read geliefert....
Könnte es sein, dass der Wert nie "abgeholt" wird???
Warum bleibt dann das Programm nicht hängen?? Das ACK scheint es zu bekommen...!
-
Erfahrener Benutzer
Robotik Einstein
Also wenngenau die gleiche Software mit dem gleichen Baustein funktioniert hat, dann hast du deine Antwort...
Entweder ist der neue Baustein gefrittet oder falsch verdratet (kalte Lötstelle, Lötbrücke). Dein Steckbrett hast du bestimmt immer noch, teste mal mit dem gleichen Binary gegen.
Das ACK beim read geht vom Master zu Slave: Im 9ten Buszyklus zieht der Empfänder SDA auf low um dem Empfänger den erfolgreichen Transfer zu signalisieren. Und beim write gibt dir der TWI nen Fehler, denn kein ACK vom Slave kommt. Aufhängen sollte ich da nix.
-
mit der bibliotek kenne ich mich nicht aus aber nach jedem write musst du auf ack warten ich hofe das write mach das bei dir glich mit sonnst musttu selbst auf ack warten
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen