Schwierigkeiten beim Lesen das Manuals / TWI Atmega 644

#2471393
Lesenswert?

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
#2471406
Lesenswert?

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.
Gast #2471472
Lesenswert?

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
#2472148
Lesenswert?

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
Gast #2472221
Lesenswert?

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
#2472242
Lesenswert?

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

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