PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ERLEDIGT!!! --- kleines TWI problem - ich seh den Fehler



roboter
16.04.2007, 17:36
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 :
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;
}


das Hauptprogramm sieht folgendermaßen aus:

ausschnitt aus der main.c :
...
Twcr = &B00000100
Twsr = 0
Twbr = 72
sei()
tmp=twi_send_byte(wert, 0x40)
...

Das Problem ist nun, das ich die adresse schicke, und der status dann weder 0x28)noch 0x30 ist, also in der Variablen error steht der wert 0x31.

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!

linux_80
16.04.2007, 19:30
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.

roboter
16.04.2007, 19:56
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.

linux_80
16.04.2007, 22:38
Dann passts ja, oder ?

Hast Du die Pullups in der Leitung ?

Welchen PCF hast Du, den mit Adresse 0x40 oder den 0x70 ?

darwin.nuernberg
16.04.2007, 22:51
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 PCF8574P

Datenblatt des PCF8574 (http://www.reichelt.de/?SID=25ZF@3b38AAAIAAD4Vf6Mcc02d2b5be4adbd465105834 137c3ae0;ACTION=7;LA=6;OPEN=1;INDEX=0;FILENAME=A30 0%252FPCF8574%2523PHI.pdf) Fig.9 auf Seite 8

roboter
17.04.2007, 01:08
Pullups hab ich, ich habe den PCF8574P, also mit der adresse 0x40

roboter
17.04.2007, 08:53
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....

roboter
17.04.2007, 11:46
hat sich erledigt.... O:)

linux_80
17.04.2007, 23:37
Könntest Du uns wissen lassen an was es gelegen hat !?
Wir wollen ja schliesslich wissen was wir mit unserer Antwort angerichtet haben ;-)

roboter
18.04.2007, 17:12
Klar, entschuldige O:)

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 ](*,) ](*,) ](*,) ](*,)