I2C Bus "störungssicher" machen
Hallo!
Ich habe Probleme mit dem I2C Bus meiner Terrariusteuerung. Ich messe die Temperatur und die Luftfeuchtigkeit im Terrarium mit digitalen I2C Sensoren. Die Kabellängen sind etwas lang für den I2C Bus, aber ich habe sehr gute geschirmte CAN Buskabeln verwendet, und bei einer sehr langsamen Busfrequenz von 2kHz funktioniert das ganze ca. 5 Minuten lang, manchmal auch 10 oder 15, aber dann bleibt der Controller einfach hängen.
Das kann schnell zur Katastrophe werden, z.B. wenn die Beregnungsanlage eingeschalten ist. Wenn dann der Controller hängen bleibt läuft sie einfach weiter bis der Wassertank leer ist, und mein Zimmer überflutet ist.
Ich verwende die I2C Library von Peter Fleury: http://homepage.hispeed.ch/peterfleu...ic2master.html
Die Sensorwerte frage ich mit dem Befehl "i2c_readAck" ab:
Code:
/*************************************************************************
Read one byte from the I2C device, request more data from device
Return: byte read from I2C device
*************************************************************************/
unsigned char i2c_readAck(void)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}
Ich glaube das Problem ist, dass er durch Busstörungen fehlerhafte Signale bekommt, und dann irgendwie in der Endlosschleif feststeckt.
Kann man da etwas einbauen dass das Unterprogramm automatisch die Schleife unterbricht und irgendeinen Fehlercode zurückgibt? Wenn alle 5 Minuten mal ein Messwert "verworfen" wird, weil er fehlerhaft ist, ist das vollkommen egal (es wäre sogar egal wenn 9 von 10 verworfen werden würden :) ), nur darf der Controller nie hängen bleiben.
lg
Christoph