Peter Fleury I2C Interruptgesteuert

Gast #2564189
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren