Ich habe immer wieder mit dem Phänomen zu kämpfen dass bei einer kleinen Änderung in einer Funktion auf einmal das ganze Programm nicht mehr funktioniert. Und das oft obwohl bei normalen Ablauf diese eine Funktion erst spät aufgerufen wird.
Ein Beispiel: in einer Fahrfunktion wollte ich ein Timeout einbauen, dazu habe ich die globale Zeit auf eine Änderung überprüft. Der Robi hat dann nach ca 10s Fahrzeit mit Resets angefangen, irgendwelche anderen Funktionen aufgerufen, und zum Schluss auf gar nichts mehr reagiert. Diese eine Fahrfunktion wird erst nach ca 30 Minuten Fahrzeit aufgerufen, warum kann die also gleich nach dem Einschalten solche Störungen verursachen?
Inzwischen wurde das Timeout anders gelöst, das Programm erheblich erweitert, und funktioniert so immer noch.
Gestern gab es wieder so ein Problem, zur besseren Drehzahlregelung habe ich die schon vorhandene Funktion der Drehzahlüberwachung auch in die vorhande Wartefunktion eingebaut. (Der Robi wartet vor jeder Richtungsänderung 0.5s). Und wieder hat das Programm nicht mehr richtig gearbeitet, es wurde alle paar Sekunden immer wieder von vorne gestartet.
Die Überwachung in der Wartefunktion musste ich rausnehmen, dafür wurde in Drehzahlregelung ein PID Regler eingebaut der auch einiges an Variablen und Speicherplatz benötigt, und es funktioniert perfekt.
Woher kann so ein Verhalten kommen?
Ist der Atmega schon zu Tode geflasht??
Oder macht der Compiler manchmal einfach Mist??
Das Programm ist zu umfangreich um es komplett im Simulator laufen zu lassen (wie GPS, Kompass und Odometrie simulieren?), und wenn ich Teile entferne ist der Simulation nicht mehr vergleichbar und damit sinnlos.
Es geht um einen Atmega32, AVR Studio 4.17, WinAVR-20090313.
Program: 24970 bytes (76.2% Full)
Data: 1366 bytes (66.7% Full)
Build succeeded with 0 Warnings...
Es wäre gut diese Probleme lösen oder erklären zu können, um nicht immer wieder umständliche Lösungen für eigentlich einfache Aufgaben finden zu müssen.
LG!
Lesezeichen