Hallo
Kann ich einen Timer so einstellen, dass ich jede Sekunde einen interrupt bekomme?
Und brauche ich dafür ein besonderes Quarz?
Oder geht das nicht bzw nur sehr ungenau?
Viele Grüße,
Johannes
Hallo
Kann ich einen Timer so einstellen, dass ich jede Sekunde einen interrupt bekomme?
Und brauche ich dafür ein besonderes Quarz?
Oder geht das nicht bzw nur sehr ungenau?
Viele Grüße,
Johannes
Ein Beispiel ist da:
https://www.roboternetz.de/wissen/in...in_einer_Datei
Die Genauigkeit ist abhängig von der Genauigkeit des Takts und davon, ob die Division in
einen Rest hat (ungenau) oder nicht (genau).Code:#define OCR_VAL (F_CPU / INTERRUPTS_PER_SECOND -1)
Für OCR_VAL muss gelten 0 <= OCR_VAL < 65536. Im Beispiel ist INTERRUPTS_PER_SECOND auf 1000, also gibt es jede ms eine IRQ. INTERRUPTS_PER_SECOND sollte möglichst klein sein, damit die IRQ-Last möglichst klein ist.
Hier geht also
F_CPU=1000000
INTERRUPTS_PER_SECOND=64
OCR_VAL=15624
Für kleinere Werte von INTERRUPTS_PER_SECOND bekommst du Ungenauigkeit, weil das einem gebrochenen Wert von OCR_VAL entspräche.
Mit einem Prescale von 64 kommst du nur noch einmal pro Sekunde in die ISR, dadurch wied der Code einfacher und die IRQ-Last ist minimal für dieser Aufgabe. Allerding stimmt die obige Formal so nicht, weil die von PRESCALE=1 ausgeht.
Wenn dein AVR einen internen RC-Oszillator hat, kannst den verwenden. Ist allerdings ungenauer als Quarz. ALternativ gehen auch externer Oszillator/Takt, Keramik-Resonator oder RC-Glied.Code:#define PRESCALE 64 INTERRUPTS_PER_SECOND 1 #define OCR_VAL (F_CPU / Prescale / INTERRUPTS_PER_SECOND -1)
Disclaimer: none. Sue me.
hi,
vielleicht hilft dir auch folgender link weiter
Die genaue Sekunde
Lesezeichen