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