Hallo,
wenn der Wert 0x31 ist, dann kommt der Fehler ja schon bei der Abfrage von 0x18 oder 0x20, dann hat sich der Slave nicht gemeldet.
Lasse mal die Zeile mit der Zuweisung error = 0x31 weg, dann siehst Du welcher Status wirklich in TWSR war.
Hallo,
habe hier ein kleines I2c-Problem, wahrscheinlich nur ein kleiner Fehler den ich übersehe, wäre nett wenn jemand mal drüberherschauen könnte, zuerst mal mein Code:
die twi.c :das Hauptprogramm sieht folgendermaßen aus:Code:char twi_wait(void) { while (!(TWCR & (1<<TWINT))); uart_putc(TWSR & 0xF8); return (TWSR & 0xF8); } void twi_start(void) { TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); } void twi_stop(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO); } char twi_send_byte(char wert, char addr) { char status,error=0; twi_start(); status=twi_wait(); if((status==0x08) || (status==0x10)) { TWDR = (addr & 0xFE); TWCR = (1<<TWINT) | (1<<TWEN); status=twi_wait(); if((status==0x18) || (status==0x20)) { TWDR=wert; TWCR = (1<<TWINT) | (1<<TWEN); status=twi_wait(); if((status==0x28) || (status==0x30)) { error=0; } else { error=status; error=0x30; } } else { error=status; error=0x31; } twi_stop(); } else { TWCR=0b10000100; error=status; error=0x32; } return error; }
ausschnitt aus der main.c :Das Problem ist nun, das ich die adresse schicke, und der status dann weder 0x2noch 0x30 ist, also in der Variablen error steht der wert 0x31.Code:... Twcr = &B00000100 Twsr = 0 Twbr = 72 sei() tmp=twi_send_byte(wert, 0x40) ...
Ansteuern möchte ich damit einen PCF8574. also ich möchte einige Status-LEDs, die an ihm angeschlossen sind an oder aus machen.
Sieht jemand grade den Fehler?
MFG!
Hallo,
wenn der Wert 0x31 ist, dann kommt der Fehler ja schon bei der Abfrage von 0x18 oder 0x20, dann hat sich der Slave nicht gemeldet.
Lasse mal die Zeile mit der Zuweisung error = 0x31 weg, dann siehst Du welcher Status wirklich in TWSR war.
Jep, genau das meinte ich, der Slave meldet sich nicht.
Zur Verdrahtung: Die Pins A0,A1 und A2 liegen alle an GND.
das 0x31 ist momentan nur zum debuggen drin, ich glaube ursprünglich stand 0x00 drin.
Dann passts ja, oder ?
Hast Du die Pullups in der Leitung ?
Welchen PCF hast Du, den mit Adresse 0x40 oder den 0x70 ?
Er meint die Typen PCF8574AP und PCF8574PZitat von linux_80
Datenblatt des PCF8574 Fig.9 auf Seite 8
Gruss
Darwin (meine Projekte sind auf meiner Pinnwand zu finden)
Pullups hab ich, ich habe den PCF8574P, also mit der adresse 0x40
Hier nochmal das gesamte Program, ich sehe den Fehler einfach nicht...
Er sendet das Startsignal, danach sendet er die adresse und fliiegt raus, der Status ist dann 0x00
Das gleiche Problem habe ich auch mit einem PCF8591, der am Bus hängt....
hat sich erledigt....
Könntest Du uns wissen lassen an was es gelegen hat !?
Wir wollen ja schliesslich wissen was wir mit unserer Antwort angerichtet haben
Klar, entschuldige
Das Problem war einfach nur, das ich manchmal I2C und manchmal den A/D Wandler des Mega8 brauchen. Und die beiden Sachen liegen ja auf den gleichen Pins (PC4 und PC5) Für die A/D Wandlung waren noch kapazitäten an den Pins, an die ich einfach nicht mehr gedacht habe. Wenn man nun das I2C benutzen wollte, waren also an dem Bus zwei Kondensatoren. Die haben mir das Signal dann total verfälscht. Daran hatte ich anfangs nicht mehr gedacht und habe erst den Fehler in der Software gesucht
Lesezeichen