www.mikrocontroller.net

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


Autor: Jörg Maaßen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Pfanner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Maaßen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Florian,

Danke alles bestens.

Gruß Jörg

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Maaßen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: BernhardT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.