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