Witam,
Próbuję dogadać ze sobą dwie ATMegi za pomocą I2C [TWI]. Przeczytałem o tym sporo w dokumentacji, przejrzałem sporo postów na elektrodzie i dalej nie wiem, czemu to nie chce mi działać. Wg symulacji w VMLab program wchodzi w nieskończoną pętlę w zaznaczonym miejscu drugiej funkji (pierwsza przechodzi bez zarzutu).
Czy ktoś może mi pomoc, byłbym bardzo wdzięczny.
To działa OK:
To już nie:
Próbuję dogadać ze sobą dwie ATMegi za pomocą I2C [TWI]. Przeczytałem o tym sporo w dokumentacji, przejrzałem sporo postów na elektrodzie i dalej nie wiem, czemu to nie chce mi działać. Wg symulacji w VMLab program wchodzi w nieskończoną pętlę w zaznaczonym miejscu drugiej funkji (pierwsza przechodzi bez zarzutu).
Czy ktoś może mi pomoc, byłbym bardzo wdzięczny.
To działa OK:
void i2c_init(void)
{
TWSR = 0; //brak preskalera
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
}To już nie:
unsigned char i2c_start(unsigned char address)
{
uint8_t twst;
//START
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// czekaj na zakonczenie transmisji
while(!(TWCR & (1<<TWINT))); <----TUTAJ WCHODZI W PĘTLĘ
twst = TW_STATUS & 0xF8;
//wystapil blad, zwroc 1
if ( (twst != TW_START) && (twst != TW_REP_START)) {return 1;}
// wyslij adres urzadzenia
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
twst = TW_STATUS & 0xF8;
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ){return 1;}
return 0;
}