Hallo, ich möchte gern mit einem Atmega644P einen PCF8574 (=Portexpander) mittels I2C ansprechen. Ist im Manual ganz gut beschrieben - mit einer Ausnahme: nirgends finde ich einen Hinweis, wie SDA bzw. SCL konfiguriert werden müssen. Rein als Ausgänge kann ja wohl nicht richtig sein, denn es muß doch erkannt werden, was der Slave sendet (wird bei mir nicht gebraucht), aber wenigstens das Ack. Ich habe keine Ahnung, was im Hintergrund geschieht, wenn man z.B. das Bit zum Senden in TWCR schreibt oder später das Bit für Ack abfragt. Wird dann im Hintergrund automatisch die Portrichung ein- oder umgestellt? In meinem Fall ist es einfach, ich habe die dafür vorgesehenen Ports PC0 und PC1 verwendet (mit externen Pull-ups). Was wäre, wenn ich SDA und SCL z.B. an PA0 und PA1 angeschlossen hätte? Zusatzfrage: SLA_W heißt doch wohl Slave-Adresse mit w wie schreiben? Vielen Dank schon mal! Alexander
Wenn du die Hardware-Unterstützung der I2C-Schnittstelle (=TWI) nutzen willst, bist du an die Pins gebunden. Für Verwendung an anderen Pins bist du auf die Nutzung einer Software-I2C-Schnittstelle angewiesen. Das das auch anders geht, zeigt die Konkurrenz. Gemessen an der Komplexizität der heutigen Mikrocontroller ist es mir ein Rätsel, warum man immer noch auf feste Verdrahtung I/O <-> Pin setzt. Oft nur ein kosmetisches Problem, manchmal aber richtig lästig.
Hi >Ist im Manual ganz gut beschrieben - mit einer Ausnahme: nirgends finde >ich einen Hinweis, wie SDA bzw. SCL konfiguriert werden müssen. >Rein als Ausgänge kann ja wohl nicht richtig sein, denn es muß doch >erkannt werden, was der Slave sendet (wird bei mir nicht gebraucht), >aber wenigstens das Ack. Du brauchst nichts einstellen. Mit dem Setzen von TWEN in TWCR passiert des automatisch. MfG Spess
spess53 schrieb: > Du brauchst nichts einstellen. Mit dem Setzen von TWEN in TWCR passiert > des automatisch. > Hi spess ist es egal, ob interne oder externe Pull-ups? (es sind nämlich externe Pull-ups vorhanden) mfg Alexander
Ein Problem hätte ich noch: Wo findet man heraus, welche Header- oder Source-Files für die Benutzung der Hardware-I2C von nötig sind? Im Manual S. 210 steht z.B. if ((TWSR & 0xF8) != START) ..... oder if ((TWSR & 0xF8) != MT_SLA_ACK)....... Ich habe das installierte WinAVR 20100110 von vorn bis hinten durchsucht und das, was nach TWI / I2C aussah, in mein Programm übernommen: #include <util/twi.h> In dieser Headerdatei kommen START, MT_SLA_ACK usw. usf. tatsächlich vor. Aber nun stellt sich beim Compilieren heraus, daß zwar die Register und deren Bits richtig bezeichnet sind, aber START, SLA_W, MT_SLA_ACK usw. werden nicht akzeptiert. Man kann diese Ausdrücke sicher vermeiden und einfach TWSR abfragen nach 0xF8, aber interessieren würde mich trotzdem, was hier nicht funktioniert. Muß man AVRStudio 5.0 benutzen, wenn man das Manual wörtlich nehmen will? Da soll ja neuerdings ein Compiler enthalten sein??? Gruß Alexander
Alexander Schmeil schrieb: > Muß man AVRStudio 5.0 benutzen, wenn man das Manual wörtlich nehmen > will? Da soll ja neuerdings ein Compiler enthalten sein??? Nein. Die Beispiele im Datenblatt sind in der Regel für den IAR-Compiler geschrieben. Aber mit etwas Lesen in der Doku findet man eigentlich immer raus, wie was geht. In der avrlibc heissen die Bitmasken halt anders. guggst du hier: http://www.nongnu.org/avr-libc/user-manual/group__util__twi.html Oliver
Alexander Schmeil schrieb: > spess53 schrieb: > >> Du brauchst nichts einstellen. Mit dem Setzen von TWEN in TWCR passiert >> des automatisch. >> > > Hi spess > ist es egal, ob interne oder externe Pull-ups? > (es sind nämlich externe Pull-ups vorhanden) nein das ist nicht egal, du brauchst auf jeden Fall externe - die internen, wenn sie in der Betriebsart überhaupt aktivierbar sind, sind viel zu hochohmig. > Ich habe das installierte WinAVR 20100110 von vorn bis hinten durchsucht > und das, was nach TWI / I2C aussah, in mein Programm übernommen: > #include <util/twi.h> > In dieser Headerdatei kommen START, MT_SLA_ACK usw. usf. tatsächlich > vor. > Aber nun stellt sich beim Compilieren heraus, daß zwar die Register und > deren Bits richtig bezeichnet sind, aber START, SLA_W, MT_SLA_ACK usw. > werden nicht akzeptiert. also mit den define's aus dem twi.h sollte es eigentlich gehen ?Was kommt für eine Fehlermeldung? > Man kann diese Ausdrücke sicher vermeiden und einfach TWSR abfragen nach > 0xF8, aber interessieren würde mich trotzdem, was hier nicht > funktioniert. ja, anstelle der Bezeichner kannst du natürlich auch auf den entsprechenden Hexwert des Statuscode's vergleichen. Sascha
Sascha Weber schrieb: > also mit den define's aus dem twi.h sollte es eigentlich gehen > ?Was kommt für eine Fehlermeldung? Die übliche, wenn irgendetwas nicht deklariert ist, erstes Auftreten dieser Deklaration oder so ähnlich. Gruß Alexander
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.