Forum: Mikrocontroller und Digitale Elektronik TWI - Hilfe!


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe Mikrocontrollergemeinde!

ich hab erhebliche Verständnisprobleme mit dem TWI Bus und hab trotz 
meiner knapp 4 stündigen Forensuche keine Erleuchtung gefunden. Bevor 
ich mit meinem Projekt begonnen hab, dachte ich, TWI programmieren ist 
einfach ein bißchen Copy/Paste, bißchen Adressen vergeben und fertig ist 
der Lack.
Ich möchte ja auch nicht viel, nur den ein oder anderen Portexpander 
ansprechen mit meinem ATXmega....kann ja nicht so schwer sein.... oder 
?!

Ich hab mir schon mal was zusammengebaut um einfach irgendwas zu meinem 
Expander zu senden, nur schrieben, nicht lesen.

Mich verunsichert die Tatsache, das ich in jedem Beispielcode 
Startbedingungen usw...auftauchen...allerdings soll das angeblich so 
schonmal Funktioniert haben...kann das sein ?!





Gruß Frank

von Frank B. (f-baer)


Lesenswert?

Was für einen Portexpander möchtest du denn ansprechen?
Für I2C-Verbindungen braucht es immer eine Start- und Stoppbedingung.

von Rainer Unsinn (Gast)


Lesenswert?

Frank schrieb:
> Bevor
> ich mit meinem Projekt begonnen hab, dachte ich, TWI programmieren ist
> einfach ein bißchen Copy/Paste, bißchen Adressen vergeben und fertig ist
> der Lack.

Programmieren ist nie einfach, da man sein Köpfchen anstrengen muss. Mit 
Copy/Paste fremden Code verwenden, geht in den meisten Fällen schief, da 
selten klar ist, was genau der Programmierer mit genau diesem Stück Code 
erreichen wollte. Anders sieht es mit Libs aus, die sind idR 
dokumentiert, doch auch dort musst du dich an die Vorgaben halten und 
z.B. die nötigen Variablen exakt übergeben.

Beschreibe vielleicht erstmal dein Problem. Falls du Verständnisprobleme 
zum TWI hast, google mal nach I2C, so heißt das Ding nämlich bei 
richtigen Controllern.

von Frank (Gast)


Lesenswert?

Hallo,

danke erstmal für die zügige Rückmeldungen!



Frank Bär schrieb:
> Was für einen Portexpander möchtest du denn ansprechen?

PCF8574. Die Adressierung müsste soweit stimmen ( siehe Code ), 
allerdings besteht das Problem im Moment in der Initialisierung... und 
genau da liegt mein Verständnisproblem.

In den meisten Codes wird als Starbedingung folgendes verwendet:

#define pcf_adress 0x20

void i2c_init(void)
{
  TWBR = (1 << 0) | (1 << 1) | (1 << 3);  //TWBR=11
}

int8_t i2c_send_start(uint8_t adress)
{
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);  //Sende Start Condition
  while(!(TWCR & (1<<TWINT)));  //Warte bis Ende

  if(!(TWSR & 0x08))  //Wenn Startvorgang fehlgeschlagen
        return -1;

  TWDR = adress;  //Adresse senden
  TWCR = (1 << TWINT) | (1 << TWEN);  //Clear TWINT bit in TWCR to start 
transmission of address

  while(!(TWCR & (1 << TWINT)));  //Warte bis Übertragung beendet ist

  if(!(TWSR & 0x20))  //Wenn Übertragung von SLA+W fehlgeschlagen
    return(-2);

    return 0;
}

void i2c_send(void)
{
  TWDR= //TWDR=Data,
  TWCR = (1 << TWINT) | (1 << TWEN);  //Clear TWINT bit in TWCR to start 
transmission of address

  while(!(TWCR & (1 << TWINT)));  //Warte bis Übertragung beendet ist
  lcd_put_d(0);
}

void i2c_stop(void)
{
  TWCR= (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
  while(!(TWCR & (1 << TWSTO)));
  lcd_put_d(0);
}




usw....

das ist zwar ein LCD...aber die Kommunikation sind ja nicht grundlegend 
Verschieden oder ?! mein Ziel ist es einfach irgendwie Kommunikation 
zwischen Xmega und PCF herzustellen, dann fällt mir auch das Verständnis 
leichter.


Gruß  Frank

von Dominik M. (lauso)


Lesenswert?

Hallo Frank,
Dein Code ist ein wenig dürftig!
Es fehlt noch die Beschreibung das die verwendeten Pins als open 
collectors wired AND gesetzt werden müssen (siehe XMega Manual 19.3. 
General TWI Bus  Concepts).
Außerdem macht es keinen Sinn den TWI Bus permanent in der While 
schleife immer wieder zu initialisieren.

von Frank (Gast)


Lesenswert?

Hallo Dominik,

danke für die Antwort, ich hab mir den Teil auch durchgelesen, 
allerdings fällt mir die Realisierung ein wenig schwer! ich find auch 
kein Beispiel dazu.

ich habnoch was gefunden: Beispielprogramme ( 
http://www.mikrocontroller.net/articles/Port-Expander_PCF8574 )

allerdings ist es mir unklar wie ich diese einbeziehe.

Gruß Frank

von Mark (Gast)


Angehängte Dateien:

Lesenswert?

Hi, danke für die Antworten..

ich hatte zwischenzeitlich noch andere grundlegende Probleme mit dem 
Controller, aber die sind jetzt gelöst!

ich hab die Initialisierung raus aus der while Schleife genommen und die 
verwendeten Pins als WiredAND gesetzt!

Ich möchte jetzt mal die SCL an PortC messen, hab allerdings nix 
angeschlossen! Ist das ein Problem wegen dem ACK?
..auf jedenfall kommt nix raus :(

hab mal mein sachen hochgeladen (incl. TWI header ) -> wo ist der 
fehler?

Gruß Mark

von Mark (Gast)


Lesenswert?

Sorry hab mich ein wenig unverständlich Ausgedrückt.

Mark schrieb:
> hab allerdings nix
> angeschlossen!

damit meine ich: es ist kein Slave angeschlossen, die Pins sind quasi 
offen!

Gruß Mark

von Spess53 (Gast)


Lesenswert?

Hi

>damit meine ich: es ist kein Slave angeschlossen, die Pins sind quasi
>offen!

Aber die Pull-Up-Widerstände sollten schon dran sein.

MfG Spess

von Simon K. (simon) Benutzerseite


Lesenswert?

Rainer Unsinn schrieb:
> google mal nach I2C, so heißt das Ding nämlich bei
> richtigen Controllern.

Der war gut. Die Bezeichnung ist Herstellerabhängig.
http://de.wikipedia.org/wiki/I%C2%B2C

von Dominik M. (lauso)


Lesenswert?

Hallo Frank,
der ist recht leicht einzubinden.
wichtig ist die Pull ups nicht zu vergessen.
ansonsten Adressbyte senden und welche Ausgänge Du setzen willst.
P0 entspricht Bit 0, P1 entspricht Bit1 .... P7 entspricht Bit7.
Wenn Du nicht weißt welche Adresse Dein Chip hat kannst Du einen Zähler 
hochzählen lassen und entsprechend die Ausgänge setzen. Wenn LED's 
angeschlossen sind kann man so die Adresse herausbekommen.
Wenn Du noch Code brauchst schau mal hier: 
Beitrag "Xmega 128a1 TWI Schnittstelle"

von Mark (Gast)


Lesenswert?

Hallo, ich hab jetzt zusätzlich 10kOHM wiederstände (SCL+SDA) gegen VCC 
gelötet und möchte eigentlich nur das ein Clock signal oder irgendwas 
messbares ausm Controller kommt ( Erfolgserlebnis ) ...aber da tut sich 
nix :( meine PCF Expander machen auch was sie wollen......jemand noch 
einen Tip ?

Dominik M. schrieb:
> ansonsten Adressbyte senden und welche Ausgänge Du setzen willst.
> P0 entspricht Bit 0, P1 entspricht Bit1 .... P7 entspricht Bit7.
> Wenn Du nicht weißt welche Adresse Dein Chip hat kannst

Das hab ich soweit verstanden.

Dominik M. schrieb:
> Wenn Du noch Code brauchst schau mal hier:
> Beitrag "Xmega 128a1 TWI Schnittstelle"

Danke. Allerdings ist der Code mit Codevision gemacht und passt einfach 
nicht zu meinem Modul (USB, usw...). Ich arbeite mit avrstudio

Gruß Mark

von Dominik M. (lauso)


Lesenswert?

Hallo
10K Vorwiderstände finde ich arg groß.
4K7 ist bei einem Slave denke ich i.O.
Wenn man mehrere slaves hinter dem Bus hat kann auch ohne Probleme auf 
2k2 runter gehen.
Mark schrieb:
>Allerdings ist der Code mit Codevision gemacht und passt einfach
>nicht zu meinem Modul (USB, usw...). Ich arbeite mit avrstudio
 Der Code ist in der Tat für Code Vision geschrieben. Ich habe es mir 
entsprechend hierfür umgeschrieben. Hilfreich war hierfür der Code vom 
Gast GG.

von Mark (Gast)


Lesenswert?

Hallo,

@ Dominik
danke für die Info, aber der Code von GG verunsichert mich nur nochmehr, 
da sind so Grundlegende Dinge wie die #include dateien nicht eingebunden 
usw.. und dieses ganze rtc bringt mirnix, ich hab keine ahnung wie ich 
das auf meine PCF zuschneiden soll, was mir im Moment aber auch Wurst 
ist.

Ich schaff es ja nichtmal ein Signal herauszumessen...und das ist viel 
schlimmer :(

Gruß

von Mark (Gast)


Lesenswert?

Mark schrieb:
> da sind so Grundlegende Dinge wie die #include dateien nicht eingebunden

sorry, hab nen kleinen Denkfehler gemacht

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.