Hallo, Ich bin Neuling in der Programmierung von AVR's und habe mir hier schon diverse Threads zum Thema Timer durchgelesen aber auf meine unten stehenden Fragen noch keine Antworten gefunden. Ich habe folgende Situation. AVR Mega8 mit 16MHz getaktet. Ich möchte einen Takt von 1/1000sec erreichen. Das habe ich mit einem Vorteiler von 64 und Startwert für Timer0 = 6 (256-250) auch erreicht (PINB.0 getoggelt = 500Hz). Am Anfang der Timer-Overflow-Interrupt Routine rette ich erst das SREG und setzen den Startwert für Timer0 wieder auf 6. ldi r0, SREG out TCNC0, Startwert . . . out SREG, r0 Nun meine Fragen: 1. Läuft der Prescaler unabhängig weiter? 2. Gibt es eine Verzögerung des Timers durch das Neusetzen des Startwertes (Jitter)? 3. In der Interrupt Routine möchte ich noch Berechnungen machen und 4-Bytes über RS232 ausgeben. Was passiert, wenn die Berechnungen und/oder die Übertragung der Bytes länger dauert als 1/1000sec (nächster Interrupt schon wieder da)? 4. Welche Art einen Zählimpuls zu erzeugen ist besser Timer-Overflow oder Timer-Compare-Match? 5. Die Genauigkeit des Zählers hängt vom verwendeten Quarz ab. Welchen Art von Takterzeugung sollte man verwenden und was versteht man unter der Angabe +/- 30ppm bei einem 16MHz Quarz? Danke im voraus. Gruß Jörg
Hallo, Zu deinen fragen: 1.: weiß nicht genau was du meinst. Der Timer läuft auch in der interruptroutiene weiter. 2.: bei deinen werten glaub ich nicht. denn der Timer wird ja erst nach 64 Systemzyklen erhöt. Der neue Timerwert wird verwendet sobald du has High-Byte ins Register geschrieben hast. 3.: Wenn du den Interrupt mit sei nicht wieder freigegeben hast gar nichts. wenn doch, dann wird die Interruptroutiene erneut durchlaufen. wenn nicht, dann wird erst nach dem beenden er routiene die nächste Interruptroutiene ausgeführt. 4. Ich bevorzuge Compare-Match, denn da gibts die möglichkeit den zähler automatisch zu löschen. Erspart dir also den Startwert ins Zählregister schreiben. 5. Wenns du ganz genau machen willst, so nimm eine Atomuhr! wenn dir das aber zu teuer ist, so reicht ein gewöhnliches Quarz auch. die Angabe +/- 30ppm gibt an, dass das Quarz je nach Temperatur, luftfeuchte etc. einen drifft um 30 parts per million hat. Also bei 1Mhz ist die maximale abweichung 30 Hz. Hoffe dir geholfen zu haben, wenn nicht, dann nochmal Fragen. Gruß, Florian
Hallo Jörg, Zu 1) ja du kannst das Problem aber beheben in dem du vor dem Laden deines Startwertes PSR10 ( bit 0 ) im SFIOR Register auf eins setzt (= Prescaler Reset). Aber Vorsicht das betrift alle Zähler die den Prescaler verwenden. Gruß Bernhard
Hallo Bernhard, wenn ich den Prescaler auf 0 zurücksetze bekomme ich doch einen zeitlichen Versatz da ja dann ein paar Take nicht gezählt werden oder? Somit habe ich doch keine 1/1000sec mehr. Gruß Jörg
Jörg, stimmt - das spielt wenn du ständig den Timer laufen läst keine Rolle. Nur der erste Interupt kommt halt ein wenig schneller weil der Vorteiler schon einen unbestimmten Wert hat. Wenn du den Timerint aber ein und abschaltest spielt das schon eine Rolle. Gruß Bernhard
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.