TWI Atmega128

Gast #579886
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?
Gast #579986
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
Gast #580020
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.
Gast #580302
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?
Gast #580432
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 ;)
Gast #580533
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

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