Hallo,
ich suche eine optimale Lösung für die folgende Situation:
ATmega1284p, 19660800Hz
Ich möchte verschiedene Zeiten (Timeouts, Delays) warten können, ohne den MC nur Däumchen drehen zu lassen.
Meine Zeiten möchte ich in ms angeben können.
Dazu dachte ich mir zunächst das folgende:
Ich reserviere eine ausreichende Anzahl Register, z.B. R2, R3, R4 als Timerflags
Ich setze eines meiner Register (z.B. ldi R2,40)
In einer ISR, die jede ms aufgerufen wird, dekrementiere ich R2, R3, R4 solange sie größer als 0 sind.
In meiner Hauptschleife teste ich R2 auf 0 und kann dann (40ms später) reagieren.
Dieser erste Entwurf gefällt mir aus verschiedenen Gründen nicht. Vielleicht kann mir jemand helfen ihn zu verbessern.
Meine Einwände:
Wolfgang
ich suche eine optimale Lösung für die folgende Situation:
ATmega1284p, 19660800Hz
Ich möchte verschiedene Zeiten (Timeouts, Delays) warten können, ohne den MC nur Däumchen drehen zu lassen.
Meine Zeiten möchte ich in ms angeben können.
Dazu dachte ich mir zunächst das folgende:
Ich reserviere eine ausreichende Anzahl Register, z.B. R2, R3, R4 als Timerflags
Ich setze eines meiner Register (z.B. ldi R2,40)
In einer ISR, die jede ms aufgerufen wird, dekrementiere ich R2, R3, R4 solange sie größer als 0 sind.
In meiner Hauptschleife teste ich R2 auf 0 und kann dann (40ms später) reagieren.
Dieser erste Entwurf gefällt mir aus verschiedenen Gründen nicht. Vielleicht kann mir jemand helfen ihn zu verbessern.
Meine Einwände:
- Zu dem Zeitpunkt, zu dem ich R2 setze, kann der nächste Interrupt kurz bevorstehen oder gerade eben verstrichen sein.
D.h. ich habe einen maximalen Fehler von 1ms (im Mittel 0,5ms). Natürlich könnte ich meine Zeitbasis verkleinern, aber damit
zwacke ich dem MC zusätzliche Rechenzeit für die ISR ab. - Ich finde keine CTC / Prescaler Werte für glatte ms, 1/10ms, 1/100ms Werte
- Ich will nicht unbedingt all zu viele Register für diesen Zweck reservieren
Wolfgang