Gast
#152157
Hallo,
ich habe ein etwas komisches Problem, und bin auf der Suche nach ein
paar Stichworten um auf den richtigen Weg zu kommen..
Ich habe ein Master, der macht nix Spektakuläres:
i2c_start(Dev24C02+I2C_WRITE);
warte(10);
i2c_write(0xFF);
warte(10);
i2c_write(0x00);
warte(10);
i2c_write(0xFF);
warte(10);
i2c_write(0x00);
warte(10);
i2c_write(0xFF);
warte(10);
i2c_write(0x00);
warte(10);
i2c_write(0xFF);
warte(10);
i2c_write(0x00);
warte(10);
i2c_stop();
warte(10);
.....
Das läuft als Schleife durch und erzeugt eine bunte Folge von
Lichtlein. Wenn ich im Slave als DebugCode nur:
SIGNAL (SIG_2WIRE_SERIAL){
// TWI Interrupt ausgeloest
PORTB = TWDR;
PORTA = TWSR;
TWCR |=
(1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTO)|(0<<TWSTA)|(0<<TWWC)
;
// Enable TWI again
}
habe, dann klappt es wunderbar, er läuft jahrelang durch ohne ein
Problem..
Sobald ich aber ein paar Ifs einbaue, bleibt er hängen. Und zwar erst
bei mehreren, eine geht noch..
So ungefähr:
SIGNAL (SIG_2WIRE_SERIAL){
// TWI Interrupt ausgeloest
PORTB = TWDR;
PORTA = TWSR;
if((TWSR & 0b11111000) == 0xC8)
{
PORTA = 0xFF;
}
if((TWSR & 0b11111000) == 0xC8)
{
PORTA = 0xFF;
}
if((TWSR & 0b11111000) == 0xC8)
{
PORTA = 0xFF;
}
if((TWSR & 0b11111000) == 0xC8)
{
PORTA = 0xFF;
}
if((TWSR & 0b11111000) == 0xC8)
{
PORTA = 0xFF;
}
TWCR |=
(1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTO)|(0<<TWSTA)|(0<<TWWC)
;
// Enable TWI again
}
Hat jemand eine Idee woran es liegen könnte.. (Die Befehle im Master
sind haben sehr lange Pausen, eigentlich dürfte es daran nicht liegen -
also das er schon sendet während der Slave noch ifft)
Aber es muss ja irgendwas mit der Zeit sein..
bin für Tips dankbar, hab zwar das Datenblatt schon gelesen, aber
nichts zeitkritisches gefunden..
Christian