Forum: Mikrocontroller und Digitale Elektronik Schwierigkeiten beim Lesen das Manuals / TWI Atmega 644


von Alexander S. (knut740)


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

von H.Joachim S. (crazyhorse)


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.

von spess53 (Gast)


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

von Alexander S. (knut740)


Lesenswert?

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

von Alexander S. (knut740)


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

von Oliver (Gast)


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

von Sascha W. (sascha-w)


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

von Alexander S. (knut740)


Lesenswert?

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
Noch kein Account? Hier anmelden.