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
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
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ß