Hallo, ich möchte über einen ATmega 32 per I2C einen MCP23017 ansteuern und an die IOs LEDs ansteuern. Ich habe jedoch Probleme den MCP23017 anzusprechen. Hier habe ich meine Startfunktion doch ich bekomme kein ACK vom 23017. TBool I2CStart(void){ DDRC &=~ ((1<<DD0)|(1<<DD1)); PORTC = (1<<DD0)|(1<<DD1); TWBR = 0x19; TWSR &= ~((1<<TWPS0) | (1<<TWPS1)); //Prescaler TWCR = ((1<<TWINT)|(1<<TWSTA)|(1<<TWEN)); //start condition while(!(TWCR & (1<<TWINT))); if((TWSR & 0xF8) != TW_START) return EFALSE; return ETRUE; } Hat jemand Erfahrung mit dem MCP23017 und kann mir helfen? Vielleicht hat wer eine brauchbaren Code für mich?
chris Berg schrieb: > DDRC &=~ ((1<<DD0)|(1<<DD1)); > PORTC = (1<<DD0)|(1<<DD1); Das muss heißen: DDRC &=~ ((1<<DDC0)|(1<<DDC1)); PORTC = (1<<DDC0)|(1<<DDC1); Spuckt dein Compiler da keine Fehlermeldung aus?
Nico ... schrieb: > Das muss heißen: > > DDRC &=~ ((1<<DDC0)|(1<<DDC1)); > PORTC = (1<<DDC0)|(1<<DDC1); Muss es nicht PC0/PC1 heissen?
Da hast Du natürlich Recht! Also nochmal: DDRC &=~ ((1<<DDC0)|(1<<DDC1)); PORTC |= (1<<PC0)|(1<<PC1);
>Hier habe ich meine Startfunktion doch ich bekomme kein ACK vom 23017.
Natürlich nicht. Ack kommt erst beim 9ten Bit.
Hab den Code jetzt mit PC0/PC1 ausgebssert, ändert aber nichts. Mit dem Befehl while(!(TWCR & (1<<TWINT))); warte ich ja bis das TWINT Flag gesetzt ist. Aufgrund der Start Condition müsste es ja gesetzt sein. Doch es wird nicht gesetzt!?!?
Anbei eine Lösung: #include "i2cmaster.h" #define CP2317 0x40 //Habe A0 bis A2 auf GND gelegt int main(void) { i2c_init(); // initialize I2C library //Setzte GPB als Ausgänge i2c_start_wait(CP2317+I2C_WRITE); //set device address +write mode i2c_write(0x01); //spreche IODIR von GPB an i2c_write(0x00); //setzte GPB auf Ausgänge i2c_stop(); while(1) { i2c_start_wait(CP2317+I2C_WRITE); i2c_write(0x15); // write adresse = OLATB i2c_write(0xFF); // schalte alle Ausgänge ein i2c_stop(); _delay_ms(500); i2c_start_wait(CP2317+I2C_WRITE); i2c_write(0x15); // write address = OLATB i2c_write(0x00); // schalte alle Ausgänge aus i2c_stop(); } } lg MX
Danke MX. Es Funktioniert super. Hättest du auch ein Beispiel zum einlesen?
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.