Forum: Mikrocontroller und Digitale Elektronik Peter Fleury I2C Interruptgesteuert


von jmax (Gast)


Lesenswert?

Hi
ich benutze einen ATMEGA 32 um per I2C einen PortExpander anzusteuern.
Mit der Library von Peter Fleury funktioniert dies auch.

Jedoch möchte ich nun auf Interruptbetrieb umsteigen um möglichst alle 
while schleifen zu beseitigen.

Bis jetzt sieht meine start_wait funktion wie folgt aus:

void i2c_start_wait(unsigned char address)
{
    uint8_t   twst;


      // send START condition
      TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN) | (1<<TWIE);
    sei();
}

das Programm geht nach dem sei(); auch in den ISR:

ISR (TWI_vect)
{
 uint8_t   twst;

while ( 1 )
    {

      // check value of TWI Status Register. Mask prescaler bits.
      twst = TW_STATUS & 0xF8;
      if ( (twst != TW_START) && (twst != TW_REP_START)) continue;

      // send device address
      TWDR = address_1;
      TWCR = (1<<TWINT) | (1<<TWEN);

      // wail until transmission completed
      while(!(TWCR & (1<<TWINT)));

      // check value of TWI Status Register. Mask prescaler bits.
      twst = TW_STATUS & 0xF8;
      if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
      {
          /* device busy, send stop condition to terminate write 
operation */
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);

          // wait until stop condition is executed and bus released
          while(TWCR & (1<<TWSTO));

          continue;
      }
      //if( twst != TW_MT_SLA_ACK) return 1;
      break;

  }

}


Beim debuggen funktioniert dies auch und die Ausgänge des PortExpanders 
können beschrieben werden.
Wenn jetzt das Programm durchlaufen lasse (ohne debuggen) bleibt es 
immer bei der Stop Condition hängen.

Hat jemand eine Idee?

von Karl H. (kbuchegg)


Lesenswert?

Was machen die ganzen while in der ISR?

Wenn du auf Interrupt Betrieb umstellst, dann musst du auch alles auf 
Interrupt Betrieb umstellen! So hat das keinen Sinn.

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.