Ich hoffe mir kann jemand bei meinem Problem helfen:
Schon vor einigen Wochen habe ich ein Programm auf den Uno geschrieben, dass seit dem stabil läuft. Dieses Programm nutzt den Timer 2 der bei Überlauf eine Interruptroutine aufruft. In dieser ISR gibt es eine weitere Unterteilung, so dass eine längere Bearbeitung nur jede Sekunde einmal stattfindet. Dann möchte ich innerhalb dieser ISR über den I2C (ich benutze Wire.h) ein paar Werte aus einem AD-Wandler auslesen.
Ich für den ADC habe ich ein Testprogramm geschrieben, das einzeln für sich ebenfalls einwandfrei läuft. Binde ich es ein, hängt sich das komplette System auf. Kommentiere ich den Aufruf der I2C-Geschichte aus läuft wieder alles einwandfrei.
Meine Frage: Was mache ich falsch?. Sind vielleicht irgendwelche Konflikte von Wire.h mit Timer 2 bekannt? Könnte evt. auch der Timer 1 eine Rolle spielen, den benutze ich zum Dimmen einer LED.
Ich bin für jede Hilfe dankbar und kann bei Bedarf natürlich auch den Code posten.
Setzte in der ISR lediglich eine Variable auf WAHR, und frage im der loop ab, ob sich der Wert geändert hat. ISR muss möglichst züglg von statten gehen.
soweit ich weiß (kann mich irren) benutzt WIRE.H Interrupts. In einer ISR sind Interrupts aber gesperrt.
Wenn man mehrere Programmteile zusammenfügt, die einzeln laufen, kann es passieren, dass insgesamt zuviel RAM verbraucht wird. Folge: Der Controller schreibt Speicherinhalte kaputt und das führt in der Regel zu nicht vorhersehbarem Verhalten - meistens Neustart nach Absturz.
Ich würde zunächst mal das Programm so ändern, dass in der ISR ein globales Flag gesetzt wird, und je nachdem wie es steht, außerhalb der ISR die Werte vom ADC lesen. Dann mal schauen, ob es läuft.
Wie Ralf schon sagte, da kollidiert scheinbar der Timer. I2C und SoftSerial funzen auch nicht zusammen. Nachdem ich ein I2C LCD in den Code eingefügt hatte, kam nichts mehr vom GPS-Modul
Das sind so kleine Gemeinheiten, mit denen u.U. man rechnen muß