Forum: Mikrocontroller und Digitale Elektronik Timerfrequenzberechung Mega8


von Stefan J. (Gast)


Lesenswert?

Hallöchen !!

hab mal eine ich denke einfache Frage :

Ich verwende z.b. den 16Bit Timer des AVR Mega8.
Immer wenn der Timer das Ende erreicht hat, wird ein Interrupt
ausgelöst.
Wie berechnet sich nun aber die Frequenz, wie häeufig dieser
ausgelöst wird ?

Ich dachte so : (Frequenz des AVR  Prescale  Stufen Zähler) /2

Das würde als Bsp. ergeben : (4MHz  1  64393)/ 2 = 1749,78 Hz

Messtechnisch kommt bei mir mit dem Oszi aber 1652,87 Hz raus.

Irgenwo ein Fehler in der Berechnung ?


Stefan

von leo9 (Gast)


Lesenswert?

verwundert, mein Rechner spuckt für
4000000  1  64393 / 2 = 31 aus, wie kommst du auf 1749 ?
warum 64393, der 16bit Timer läuft doch bei 256*256=65536 über?

grüsse leo9

von Tom Bayer (Gast)


Lesenswert?

Ich kann mir auch nicht so richtig erklären wie du darauf kommst und vor
allem was für ein Ergebnis du misst. Bei 4MHz zäht dein Counter ohne
Prescale alle 250ns einen Wert nach oben. Wenn du diesen Wert jetzt mal
deinen Stufen nimmst(das sind 2^16=65536)kommt man auf
16,384ms->61,035Hz. Formel also fsignal=fosz/presc./Stufen
Grüße Tom

von Stefan J. (Gast)


Lesenswert?

Sorry, war falsch herrum.

(4MHz  1  1143)/ 2 = 1749,78 Hz

Also immer wenn der Interrupt auslöst, wird der Zähler auf 64393
voreingestellt.
Somit ereben sich dann bis zum Ende (65536-64393) 1143 Schritte.

Und ein Ausgang wird nach der Voreinstellung wechselnd auf 0/1 gesetzt.

von Stefan J. (Gast)


Lesenswert?

Achso, ich versuche möglist genau 1750 Hz an einem Ausgang
hinzubekommen.

von leo9 (Gast)


Lesenswert?

Setzt du den Wert in der Interrupt-Routine oder verwendest du die
Capture-Compare Funktionen.
Bei ersterem wäre der Fehler klar. Vom Auftreten des Überlaufs über
Aufruf der Int-Routine bis zum setzten vergehen je nach Code ein paar
us und die machen dein Signal "langsamer".
Bei zweiterem mußt du wohl im Datenblatt nachlesen und den Geier in der
Konfig des Timers suchen.
Welchen Compiler verwendest du und wie schaut der source aus?

grüsse leo9

von Stefan J. (Gast)


Lesenswert?

Ja ich setze den Wert in der Interrupt Routine. Hab ich mir
auch schon gedacht das es wohl einige Zeit dauert bis der Ausgang
angesprochen wird und das Signal wechselt.

Aber ich werde mal versuchen mich an die 1750 Hz so ranzutasten.

Gruß
Stefan

von leo9 (Gast)


Lesenswert?

Herantasten ist s......e, die Dauer bis zu deiner Routine ist variabel
(je nach dem während welchem Befehl der Int. auftritt). Wenn du schon
selber setzten willst, addiere bitte in deiner Int-Routine die 64...
zum aktuellen-Timer Wert dazu, damit ist die Reaktionszeit konstant.

grüsse leo9

von Stefan J. (Gast)


Lesenswert?

Wie 64 dazu ? g

"damit ist die Reaktionszeit konstant"
Wie meinst du das ?


Gruß
Stefan

von Tom Bayer (Gast)


Lesenswert?

Korrigiert mich wenn ich mich irre. Wenn man z.B eine LED mit einer
Frequenz von 1750Hz zum leuchten bringen will muss man sie an und
wieder ausschalten und das ist die Frequenz. Also 1750Hz -> eine
Periode dauert 571us -> halbe Periode an, halbe aus -> 571us/2=285us.
Nun dauert bei 4MHz eine Periode 250ns -> 285us/250ns=ca.1142 Geht man
von einer bestimmten Zeit aus die gebraucht wird um die Aktion
auszuführen, die man aber an den Takten genau sieht nimm einfach als
eingestellten Wert 2^16-x=1145 und danach in der Interruptroutine
zuerst Zähler wieder mit Wert initialisieren und danach Ausgang
komplementieren. Fertig

von Stefan J. (Gast)


Lesenswert?

Mein Bascom Code sieht so aus (Als einfaches Beispiel) :


On Timer1 Ontimer1
Config Timer1 = Timer , Prescale = 1
Enable Interrupts


'---------------------------------------------------------
Do

If Pinc.5 = 1 Then Enable Timer1

If Pinc.5 = 0 Then Disable Timer1


Loop
'---------------------------------------------------------



Ontimer1:
  Timer1 = 64393
  Ftoggle0 = Not Ftoggle0
  Portc.4 = Ftoggle0


Return

von leo9 (Gast)


Lesenswert?

@ stefan:
mit 64... meinte ich deinen Preset-Wert.
Die konstante Reaktion ergibt sich dadurch dass der Timer nach dem Int
vorerst weiterläuft, du setzt ihn auf einen fixen Wert und verlierst
damit die bereits vergangenen Takte. Wenn du aber 64393 dazuaddierst
ist es egal ob die Routine bei Zählerstand 50, 150 oder sonstwas
aufgerufen wird.

ich hoff das ist jetz verständlich.

grüsse leo9

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.