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
Was für einen Portexpander möchtest du denn ansprechen? Für I2C-Verbindungen braucht es immer eine Start- und Stoppbedingung.
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.
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
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.
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
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
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
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
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
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"
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
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.
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.