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)
Lesezeichen