Forum: Mikrocontroller und Digitale Elektronik I2C mit ATmega32 und MCP23017


von chris B. (herb)


Lesenswert?

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?

von Nico (nico123)


Lesenswert?

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?

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Nico ... schrieb:
> Das muss heißen:
>
> DDRC &=~ ((1<<DDC0)|(1<<DDC1));
> PORTC = (1<<DDC0)|(1<<DDC1);

Muss es nicht PC0/PC1 heissen?

von Nico (nico123)


Lesenswert?

Da hast Du natürlich Recht!
Also nochmal:

DDRC &=~ ((1<<DDC0)|(1<<DDC1));
PORTC |= (1<<PC0)|(1<<PC1);

von holger (Gast)


Lesenswert?

>Hier habe ich meine Startfunktion doch ich bekomme kein ACK vom 23017.

Natürlich nicht. Ack kommt erst beim 9ten Bit.

von chris Berg (Gast)


Lesenswert?

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

von MX (Gast)


Lesenswert?

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

von chris Berg (Gast)


Lesenswert?

Danke MX.  Es Funktioniert super.

Hättest du auch ein Beispiel zum einlesen?

von Alois O. (aloiso)


Lesenswert?

Danke funktioniert!

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
Noch kein Account? Hier anmelden.