Forum: Mikrocontroller und Digitale Elektronik Timer- und Impulserzeugung-Fragen


von Jörg Maaßen (Gast)


Lesenswert?

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

von Florian Pfanner (Gast)


Lesenswert?

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

von Jörg Maaßen (Gast)


Lesenswert?

Hallo Florian,

Danke alles bestens.

Gruß Jörg

von BernhardT (Gast)


Lesenswert?

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

von Jörg Maaßen (Gast)


Lesenswert?

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

von BernhardT (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.