PDA

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)