www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Compare Value Berechnung


Autor: Andreas Müller (andy999mueller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich stehe vor dem Problem, dass ich immernoch nicht verstehe, wie ich 
den Compare-Wert(OCRnX) berechne und wie ich dabei den Prescaler 
verwende, um z.B eine Zeitschleife für 1 Sekunde zu schreiben.
Ich habe einen ATMega128 mit 16Mhz.
Es wäre echt super wenn ihr mir ein Rechenbeispielt geben könntet.

Hoffe auf eure Hilfe.



Gruß Andy

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo genau liegen die Probleme? Generelles Verständnis der Timer-Funktion?

Also:
Das Timer-Zählregister wird in jeder Periode des Taktsignals um eins 
erhöht. Der Prescaler kann genutzt werden, um den CPU-Takt in bestimmten 
Stufen herunterzuteilen. Bei 16 MHz kannst Du den Timer also auf diese 
Weise mit 16 MHz, 16 MHz/2, 16 MHz/8, 16 MHz/64, 16 MHz/256 und 16 
MHz/1024 versorgen. Wenn z.B. der Vorteiler 256 genutzt wird, dann wird 
der Timer mit 62,5 kHz getaktet (eben 16 MHz/256).

Zwischen zwei Erhöhungen vergeht also eine Zeit von 1/62500 s, also 16 
µs. Und jetzt musst Du noch überlegen, wie viele dieser Zählvorgänge Du 
brauchst, um die gewünschte Zeit zu erreichen.

Wenn Du möchtest, dass ein Compare-Ereignis pro Sekunde auftritt, musst 
Du schauen, wie oft z.B. o.g. 16 µs in eine Sekunde hineinpassen. In 
diesem Fall ist es ganz einfach, denn die Rechnung steht umgekehrt schon 
da. Es sind also 62500 Zählereignisse, nach denen das Compare-Ereignis 
auftreten soll.

Wann tritt das Compare-Ereignis auf? Der Komparator vergleicht ständig 
den Wert im Zählregister mit dem Compare-Wert. Wenn er Übereinstimmung 
(Gleichheit) feststellt, dann wird beim nächsten Takt das Compare-Flag 
gesetzt. Im Compare-Register muss also die gewünschte Zykluszahl minus 1 
stehen, damit das Compare-Ereignis präzise kommt.

Autor: Andreas Müller (andy999mueller)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es geht um das Verständnis, denn ich brauche für die Ansteuerung eines 
Servos ein Signal, dass 400µs lang ist.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
16.000.000 / 0,0004 = ????, dann hast Du deinen Teilerfaktor. Diesen 
kannst Du durch Kombinieren des Prescalers und des Timerwertes selbst 
erreichen, eventuell mit zusätzlichen Zählvariablen, die in der 
Interrupt-Service-Routine hochgezählt und verglichen werden.

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.