Forum: Compiler & IDEs TWI Atmega128


von TechInfo (Gast)


Lesenswert?

Experimentiere mit dem TWI bzw. I2C.

Habe eine I2C-LCD-Display mit PCF8574-Portexpander an Port D des 
Atmegas128 angeklemmt und möchte nun testen, ob die Kommunikation 
klappt.

Dazu habe ich aus dem Datenblatt des Atmega das C-Example genommen:
1
        i2cSetBitrate(100);
2
3
        cli();
4
  TWCR=(1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
5
  while (!(TWCR & (1<<TWINT)));
6
  TWDR= 0x78 & 0xFE;
7
  TWCR = (1<<TWINT) | (1<<TWEN);
8
  while (!(TWCR & (1<<TWINT)));
9
  TWDR=0x00;
10
  TWCR = (1<<TWINT) | (1<<TWEN);
11
  while (!(TWCR & (1<<TWINT)));
12
  TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);

Damit müßten alle Portpins auf 0 gesetzt werden. Wenn ich aber an den 
Pins des LCD-Displays messe (die mit dem Portexpander-Baustein verbunden 
sind), sind RS, R/W, E sowie D5 auf High Potenzial. Der Rest Low.

Hat jemand noch eine andere Möglichkeit, die TWI-Funktion zu testen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Hat jemand noch eine andere Möglichkeit, die TWI-Funktion zu testen?

Das TWI-Beispiel der avr-libc benutzt Standard-EEPROMs.  Die kannst
du zum Bleistift von alten DIMMs ablöten bzw. gleich da drauf benutzen.

von Jörg X. (Gast)


Lesenswert?

>> TWDR= 0x78 & 0xFE;
ist das die richtige adresse? beim PCF8574 (ohne A) ist die adresse 
"0x4n"
n: 2-14d bzw. 2-E -- hängt von den Pins A0-A2 ab

sonst vl. mal die I2c-Lib von peter Fleury ausprobieren: jump.to/fleury
hth. Jörg

von TechInfo (Gast)


Lesenswert?

Ja du hast Recht, die Adresse war falsch. Aber auch nach der Änderung 
gab es keine Besserung.

Fleury macht es in seinem Beispiel genauso wie im Datenblatt 
beschrieben.

Ich habe mit einem Oszi mal am TCL-Pin gemessen, der ist immer auf High, 
also es wird kein Takt erzeugt. Muss man den TWI noch irgendwie 
aktivieren, außer dass man das TWEN-Bit setzt? Die Bitrate ist auf 
100kHz eingestellt, die Berechnung für das TWBR-Register ergab 72, müßte 
bei 16MHz-CPU-Takt soweit stimmen.

von kosmonaut_pirx (Gast)


Lesenswert?

hallo,
vll dumme frage: die pull-ups aktiviert ?
(oder waren's pull-downs. weiß nicht mehr so genau)
kenne die lib aber nicht.
bye kosmo

von TechInfo (Gast)


Lesenswert?

Es sind Pull-Ups beim LCD-Display gesetzt. Müssen beim AVR die Ports 
auch als Pull-Ups gesetzt werden?

Benutze ja zur Zeit nicht die lib sondern den Code-Schnipsel aus dem 
Datenblatt (s.o.)

von Jörg X. (Gast)


Lesenswert?

Du brauchst an beiden Leitungen Pull-Ups mit ca. 4,7k (die internen 
haben ~20k s. Datasheet, d.h. die sind zu schwach).
Hast du eine Möglichkeit Debug-Infos auszugeben (UART, LEDs, LCD...) ?
Wenn ja, versuch mal, nachdem die Adresse gesendet wurde, das Register 
TWSR auszulesen/~geben.
In der <util/twi.h> stehen Makros für die Status codes (deren Name steht 
im Datenblatt), hier wird TW_MT_SLA_ACK erwartet (s. Datablatt ).

hth. Jörg
ps.: hast du das : 
http://www.asurowiki.de/pmwiki/pmwiki.php/Main/LCDErweiterung ergoogelt?

von TechInfo (Gast)


Lesenswert?

@Jörg

Ich brauche aber nur an jeweils einem Ende den Pull-Up, oder? Die hab 
ich jetzt an der LCD-Platine aktiviert.

Mittlerweile scheint auch eine Kommunikation zu stande zu kommen. Ich 
hatte nach den jeweiligen Kommandos nicht das Status-Register 
ausgelesen. Anscheinend möchte TWI das aber so, denn nachdem ich eine 
entsprechende Abfrage eingefügt hatte, kommt etwas an. Wundert mich nur, 
dass TWI LESEzugriffe unbedingt benötigt...

Danke für die Adresse, habe heute bestimmt 20 verschiedene Pages 
durchgelesen, die war nicht dabei ;)

von Jörg X. (Gast)


Lesenswert?

Wenn die Pull_Ups den richtigen wert haben, spielt es keine große Rolle 
, wo die sind.
Das mit den Lesezugriffen ist merkwürdig. Kannst du mal den Code zeigen?
Schön das es geht. :)

gruß Jörg

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.