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