Hallo,
Hintergrundidee:
Ich möchte gerne Daten von einem Sensor(L3G4200D) mit einem AVR(ATMega16
mit 8MHz) über SPI(125kHz) auslesen und diese auf einem LCD anzeigen.
Speziell geht es darum, dass ich den Sensor um 360 Grad nach links um
die z-Achse drehe und dann um 360 Grad zurück. Die Gradanzeige soll auf
dem LCD angezeigt werden und demnach am Ende wieder auf Null stehen.
TECHNISCH funktionsfähige Methode:
EIN Timer = 10µs: Alle 10µs wird ein Interrupt ausgeführt und innerhalb
der ISR werden die Daten vom Sensor geholt und diese auf dem LCD
ausgegeben. Problem hierbei, nach hin und rück drehen bekomme ich
zwischen (+/-)10-50 Grad anstatt 0 raus.
Vermutete Problemlösung:
Die Anzege auf dem LCD verzögert den Ablauf und verhindert somit das
wirklich alle 10µs ein neuer Wert eingelesen wird. Um genauere Werte zu
bekommen muss der Sensor also enen separaten Timer vom LCD bekommen.
Lösungsansatz:
Timer1 = alle 10ms ISR(Daten auf LCD ausgeben) ausführen
Timer2 = alle 10µs ISR(Sensordaten auslesen) ausführen
Leider schaffe ich es auf diesem Weg nicht, da immer nur die kürzere ISR
ausgeführt wird. Das Display zeigt also nichts an.
Wenn ich die Zeilen:
1 | Refresh_LCD_Data_X(X, X_add);
|
2 | Refresh_LCD_Data_Y(Y, Y_add);
|
3 | Refresh_LCD_Data_Z(Z, Z_add);
|
in die ISR(TIMER2_COMP_vect) rein schiebe funktioniert beides.
Frage:
Erkennt jemand das Problem hierbei, dass die ISR(TIMER1_COMPA_vect)
nicht ausgeführt wird?