Archiv verlassen und diese Seite im Standarddesign anzeigen : Jede Sekunde ein Timer Interrupt
Johannes G.
21.09.2006, 18:05
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
SprinterSB
22.09.2006, 11:12
Ein Beispiel ist da:
https://www.roboternetz.de/wissen/index.php/Hallo_Welt_f%C3%BCr_AVR_%28LED_blinken%29#Alles_in _einer_Datei
Die Genauigkeit ist abhängig von der Genauigkeit des Takts und davon, ob die Division in
#define OCR_VAL (F_CPU / INTERRUPTS_PER_SECOND -1)
einen Rest hat (ungenau) oder nicht (genau).
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.
#define PRESCALE 64
INTERRUPTS_PER_SECOND 1
#define OCR_VAL (F_CPU / Prescale / INTERRUPTS_PER_SECOND -1)
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.
LostInSpace
06.10.2006, 17:52
hi,
vielleicht hilft dir auch folgender link weiter
Die genaue Sekunde (http://www.mikrocontroller.net/forum/read-4-57760.html#new)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.