Hallo rossir,
ich habe mal einen Blick in deinen Code geworfen.
Schon mal vorab: Mir gefällt vor allem deine intergrierte Gleitwertberechnung für die TIK-Zählerei.
Eine Anmerkung zu der Reihenfolge in asuro.c Init() beim Setzen von ADCSRA und ADMUX. Sollte man nicht umgedreht vorgehen da du mit ADFR und ADSC den Wandler ja schon im 'free running'-Mode startest ohne vorher explizit den Kanal ausgewählt zu haben.
Das folgende sei() erlaubt dann ja nur noch, dass der ADC auch in der Interruptfunktion ankommt.
Ansonsten finde ich extreme Ähnlichkeiten in deinem Aufbau wie ich es schon seit einiger Zeit auch mache.
Auslagern der Datenermittlung in den Interrupt und die 'alten' Funktionen liefern nur noch die Ergebnisse aus der Variablen adcValue[].
Hierzu noch ein Tip. Diese Variable sollte als volatile angelegt werden und in den 'alten' Funktionen sollte vor dem Zugriff auf die Variable der Interrupt gesperrt und danach wieder zugelassen werden.
Liegt daran, dass du sinnvollerweise int-Daten nutzt, die aber dann mehrere Maschinenzyclen zum Auslesen benötigen und somit vom ADC-Interrupt mittendrin unterbrochen werden können. Ein Byte also vom vorletzten ADC-Wert, das andere Byte aber schon vom letzten ADC-Wert.
Hat mich etliche graue Haare gekostet diesen Sachverhalt in der ATmega-Doku zu finden um diese unerwarteten falschen ADC-Werte zu finden.
Ansonsten könnte ich hier noch etwas zu Zeiten beim Ein-/Ausschalten der Sensorbeleuchtungs-LEDs und anderem los werden, aber da kannst du mal bei mir nachsehen. Kommentare sind reichlich vorhanden.
Vorsicht falls du das Programm laufen lässt. Der Asuro fährt mit ein paar Kurven ca. 3-4 Meter weit.
Gruß Sternthaler
Lesezeichen