Forum: Mikrocontroller und Digitale Elektronik Wie Frequenz von Timer berechnen


von Mathias O. (m-obi)


Lesenswert?

Hallo,

ich weiß nicht ganz was ich rechnen muss, wenn ich die Endfrequenz haben 
möchte, mit Hilfe des Prescaler. Bei einem Prescaler von 1024 muss ich 
einfach durch 1000 rechnen, das wär bei mir bei 16 MHz, 16 kHz, das weiß 
ich. Aber wie ist es bei 8, 64 und 256?


Gruß
m-obi

von holger (Gast)


Lesenswert?

>Bei einem Prescaler von 1024 muss ich
>einfach durch 1000 rechnen,

Nein, durch 1024

von Michael U. (amiga)


Lesenswert?

Hallo,

wie kommst Du auf die Idee, bei einem Prescaler (Vorteiler) von 1024 
durch 1000 teilen zu müssen???
Wenn ich eine Frequenz durch 1024 teile, muß ich auch 16000000/1024 = 
15625 rechnen. Oder eben durch 8, 64, 256...

Gruß aus Berlin
Michael

von Mathias O. (m-obi)


Lesenswert?

Ah ok ich habe das "ca." hier nicht gelesen:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_Vorteiler_.28Prescaler.29

Aber was muss ich machen, wenn ich eine grade Frequenz haben möchte, 
also genaue 16 kHz?

von Richard U. (ronw)


Lesenswert?

Wieso rechnest du bei einem Vorteiler von 1024 durch 1000?
Der Vorteiler gibt ja an, wieviele Perioden des Eingangssignals in eine 
Periode des Ausgangssignals umgesetzt werden. Damit entspricht der 
Vorteiler gleichzeitig auch dem Verhältnis der Ausgangsfrequenz zur 
Eingangs-/Systemfrequenz.

von Andrew T. (marsufant)


Lesenswert?

Mathias Obetzhauser wrote:
> Ah ok ich habe das "ca." hier nicht gelesen:
>
> 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_Vorteiler_.28Prescaler.29
>
> Aber was muss ich machen, wenn ich eine grade Frequenz haben möchte,
> also genaue 16 kHz?

Nun, indem Du 16kHz x 1024 rechnest und das Ergebnis als 
(Quarz)-taktfrequenz einkaufst.

Was meinste dazu?

Andrew

von Mathias O. (m-obi)


Lesenswert?

Aber wenn ich jetzt einen Quarz habe mit 16 MHz, kann ich daraus nicht 
jede x-beliebige Frequenz errechnen, also 100 kHz oder 5 MHz oder oder 
oder?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mathias Obetzhauser wrote:

> Aber wenn ich jetzt einen Quarz habe mit 16 MHz, kann ich daraus nicht
> jede x-beliebige Frequenz errechnen, also 100 kHz oder 5 MHz oder oder
> oder?

Du hast die zweite und dritte Schraube übersehen, an denen du drehen 
kannst:

Nach wievielen Timercounts wird ein Interrupt bzw. eine Aktion an 
bestimmten Pins ausgelöst? Das kann man auch noch in 256 Stufen (8-Bit 
Timer) oder 65536 Stufen (16-Bit Timer) tunen.

Und in der Interrupt-ISR selbst kannst du noch Maßnahmen ergreifen, um 
auf deine Wunschfrequenz zu kommen. Z.B. einen Softwarezähler benutzen, 
um die Frequenz weiter herabzusetzen oder die Grenze für den Timercounts 
anpassen, um "krumme" Werte geradezubiegen [[AVR - Die genaue Sekunde / 
RTC]]

von Mathias O. (m-obi)


Lesenswert?

Ich weiß wie ich es mache. Wenn der Timer0 hochzählt, zählt parallel 
auch ein Variable hoch. Wenn der Timer0 bei 255 angelangt ist, setzt er 
sich zurück auf 0, aber die andere Variable zählt trotzdem weiter. Dabei 
setzte ich einen Prescaler von 256 ein und komme auf 62,5 kHz. Wenn 
jetzt die Variable bei 625 angekommen ist, der Timer0 hat dann 2. 
Durchläufe durch und ist aktuell bei 115, setzte ich die Variable und 
den Timer0 wieder auf 0, Dann bin ich genau bei 10 ms angekommen, also 
100 Hz, dass was ich brauche.

Klingt das plausibel?

von Oliver (Gast)


Lesenswert?

>Wenn der Timer0 hochzählt, zählt parallel
>auch ein Variable hoch.

Und wie willst du das machen?

Ich schlage einen prescaler von 64 vor, dazu den Timer 250 Zyklen zählen 
lassen. Das gibt dann genau 1ms. Davon 10, und du hast deine 10ms.

Oliver

von Mathias O. (m-obi)


Lesenswert?

> Und wie willst du das machen?

Immer wenn der Wert des Timer0 wechselt also zb von 123 auf 124, zählt 
die Variable um 1 hoch.

> Ich schlage einen prescaler von 64 vor, dazu den Timer 250 Zyklen zählen
> lassen. Das gibt dann genau 1ms. Davon 10, und du hast deine 10ms.

Wie sag ich denn den Timer dass er nur bis 250 zählen soll?

von Oliver (Gast)


Lesenswert?

>Immer wenn der Wert des Timer0 wechselt also zb von 123 auf 124, zählt
>die Variable um 1 hoch.

Die genaue Funktion des Timers hast du noch nicht so ganz verstanden, 
oder?

>Wie sag ich denn den Timer dass er nur bis 250 zählen soll?

Bei den neueren AVRS kann der Timer0 CTC-Mode (guggst du ins 
Datenblatt). Bei den älteren, die auf Timer0 nur Normal-Mode können, 
musst du halt das Timerregister in der Overflow-ISR mit 256-250 = 6 
laden, dann läuft der Timer nach 250 Zyklen über (guggst du ins 
Tutorial). Da würde ich aber zusätzlich mal den Simulator anwerfen, um 
zu überprüfen, ob da beim Laden am Anfang der ISR nicht schon ein 
Timertakt vergangen ist.

Oliver

von Mathias O. (m-obi)


Lesenswert?

> Die genaue Funktion des Timers hast du noch nicht so ganz verstanden,
> oder?

Wieso das kann man doch mit dem machen, was ist daran so falsch?

von Thomas (Gast)


Lesenswert?

> Wieso das kann man doch mit dem machen, was ist daran so falsch?

Nein.
Der Timer löst nur einen Interrupt aus (sprich führt Code aus, der dann 
z.Bsp eine Variable ändert) beim Nulldurchgang, nicht beim beliebigen 
Ändern des Zählerregisters.
D.h. wenn Du den Zähler mit 100 lädst, dann zählt er bis 0 runter (oder 
auch rauf, oder ...) und dann passiert der Interrupt. In der 
Interruptroutine kanst Du dann Deinen Code stellen (zum Ändern der 
Variablen, etc).

von Mathias O. (m-obi)


Lesenswert?

Also ich möchte mit dem Timer einen Triac zünden. Dann nehm ich lieber 
die Idee von Oliver. Aber wie sage ich dann der Triac soll bei zb 7,5ms 
nach dem Nulldurchgang zünden. Als wie soll ich den Timer sagen wann er 
den Interrupt auslösen soll, weil er hat ja dann schon min. 7 Durchläufe 
hintersich?

von Michael Wilhelm (Gast)


Lesenswert?

Da brauchst du als erstes eine Synchronisation zur Netzspannung. Die 
Sinus Nulldurchgänge must du erkennen.

Die Suche sollte einiges ergeben. Wurde hier schon des öfteren 
angesprochen.

MW

von was-willst-du (Gast)


Lesenswert?

Du bist nicht von Phoenix Contact,oder ?

Wenn ja, was machst Du da? Triax anzünden?

von Michael U. (amiga)


Lesenswert?

Hallo,

Mathias Obetzhauser wrote:
> Aber wenn ich jetzt einen Quarz habe mit 16 MHz, kann ich daraus nicht
> jede x-beliebige Frequenz errechnen, also 100 kHz oder 5 MHz oder oder
> oder?

Teile die Quarzfrequenz durch die gewünschte Frequenz.
Wenn das Ergebnis Ganzzahlig ist, geht es.

Wenn nicht, bleibt ein Restfehler, den Du ja ausrechnen kannst und dann 
entschieden, ob er für Deine Anwendung zulässig ist.

Wenn Du 16000Hz haben willst:
16000000/16000 = 1000. Geht also.
Jetzt durch die möglichen Vorteiler teilen, ob die ganzzahlig sind:
1000/256 = 3,xxx geht nicht.
...
1000/8 = 125 passt. Also Quarz 16MHz, Prescaler 8, Counter auf 125 macht 
genau 16000Hz.

Gruß aus Berlin
Michael

von Mathias O. (m-obi)


Lesenswert?

Doch bin ich, und das worum es hier geht ist rein privat.

Um die Erkennung des Nulldurchgangs geht es hier nicht.

von Oliver (Gast)


Lesenswert?

>Wieso das kann man doch mit dem machen, was ist daran so falsch?

Wenn dein Programm nichts anderes zu tun hat, als 10ms zu warten, könnte 
man auch eine Programmschleife programmieren, deren Durchlauf genau 10ms 
dauert. _delay_ms(10.0) macht genau das. Nur kannst du dann in der Zeit 
nichts anderes mehr machen.

Der Gag der Timer besteht darin, daß die, einmal gestartet, völlig 
unabhängig vom Programm des Controllers vor sich hin zählen, und sich 
nur bei bestimmten Bedingungen melden. Melden bedeutet, einen Interrupt 
auszulösen. Bei welchen Bedingungen ein Timer einen Interrupt auslösen 
kann, und wie man das einstellt, steht im Datenblatt. Das muß man 
tatsächlich lesen.

Oliver

von Johannes M. (johnny-m)


Lesenswert?

So, ich habe im AVR-GCC-Tutorial mal nen ausführlicheren Abschnitt 
zu Thema CTC eingebaut (vorläufig im Abschnitt "16-Bit-Timer", habe 
allerdings den Eindruck, dass das ganze Tut mal ein bisschen umgebaut 
werden sollte).

Das sollte auch "Mr. Lernresistent" Mathias Obetzhauser verstehen...

von Karl H. (kbuchegg)


Lesenswert?

Johannes M. wrote:
> So, ich habe im AVR-GCC-Tutorial mal nen ausführlicheren Abschnitt
> zu Thema CTC eingebaut (vorläufig im Abschnitt "16-Bit-Timer", habe
> allerdings den Eindruck, dass das ganze Tut mal ein bisschen umgebaut
> werden sollte).
>
> Das sollte auch "Mr. Lernresistent" Mathias Obetzhauser verstehen...

Kann ich mir ehrlich gesagt nicht vorstellen.
Das Problem ist ja doch, dass das Verständnis fehlt, wie so ein Timer 
eigentlich arbeitet. Wenn man das erst mal verstanden hat (und das ist 
wirklich super-, mega-, hyper- simpel!), dann stellt sich die ganze 
Frage nach "Wie berechne ich die Einstellung für eine bestimmte 
Frequenz" erst gar nicht.
Dazu muss man aber verstanden haben, wie der Timer funktioniert und 
nicht einfach nur stur und stupid irgendwelche Formel anwenden.

(So wie im Offtopic Bereich jemand erzählt hat, dass eine halbe 
Abiturientenklasse nicht in der Lage war die Oberfläche eines Quaders 
auszurechnen, weil keiner mehr die einmal auswendig gelernte Formel 
wusste. Wozu Formel? Ein Quader hat 6 Rechtecke und von einem Rechteck 
wird man ja wohl nocht die Fläche ausrechnen können. Ist hier nicht 
anders. Wer begriffen hat, wie ein Timer funktioniert, braucht die 
Formeln im Datenblatt nicht. Die ergeben sich ganz von alleine aus der 
Funktionalität.)

von Katapulski (Gast)


Lesenswert?

> Ein Quader hat 6 Rechtecke
Manchmal hat er aber auch 2 Quadrate und 4 Rechtecke. Das macht die 
Sache
außerordentlich schwierig....;-)

gez, Katapulski

von Paul Baumann (Gast)


Lesenswert?

Ein wichtiger Zusammenhang zwischen der Timerauflösung und den
Abmessungen eines Kontrollers besteht ja auch noch.
Nicht umsonst haben manche kleineren AVR-Typen keinen 16-Bit Timer.
Grund: Er paßt nur diagonal in den Schaltkreis und blockiert damit
einige Portpins.

schnell fort
Paul

von Johannes M. (johnny-m)


Lesenswert?

Paul Baumann wrote:
> *schnell fort*
Aber ganz schnell...;-)

von Mathias O. (m-obi)


Lesenswert?

Ich habe das verstanden wie ein Timer funktioniert. Ich habe halt nur 
das ca. im Tut überlesen. Warum müsst ihr immer auf die Leute rumhacken, 
die erst Anfänger sind. Ich muss sagen das ist echt asozial.

von Johannes M. (johnny-m)


Lesenswert?

Mathias O. wrote:
> Ich habe das verstanden wie ein Timer funktioniert. Ich habe halt nur
> das ca. im Tut überlesen. Warum müsst ihr immer auf die Leute rumhacken,
> die erst Anfänger sind. Ich muss sagen das ist echt asozial.
Sorry, nein, Du hast (oder zumindest hattest) es nicht verstanden, 
sonst hättest Du den Quatsch mit der parallel mit hochzählenden 
Variablen nicht geschrieben.

Und Du bist jetzt schon eine ganze Weile hier im Forum unterwegs und 
fragst immer wieder nach absolut grundlegenden Sachen, die in den 
Tutorials hinreichend erläutert sind. Du willst dann z.T. fertigen Code 
geliefert bekommen (wie z.B. in dem ATMega16-Timer-Beitrag im GCC-Forum) 
oder gibst Dir einfach alle Mühe, die Erklärungen, die Du hier bekommst, 
nicht zu verstehen (das bezeichnet man dann als Lernresistenz).

Du hinterlässt den Eindruck, dass Du alles detailliert vorgekaut 
bekommen möchtest, aber von den Erklärungen nur das glaubst, was Du 
glauben willst. Das hat nichts mehr mit normalen Anfängerfragen zu 
tun. OK, es gibt schlimmere, aber versuche doch wenigstens mal, Dir 
selbständig Informationen zu beschaffen.

BTW: Welches "ca." im Tut willst Du überlesen haben?

von spess53 (Gast)


Lesenswert?

Hi

>Ich habe das verstanden wie ein Timer funktioniert. Ich habe halt nur
>das ca. im Tut überlesen.

Dann hätte dir das auffallen müssen.

>Warum müsst ihr immer auf die Leute rumhacken,
>die erst Anfänger sind. Ich muss sagen das ist echt asozial.

Das hat nur bedingt mit Anfängern zu tun. Aus der Fragestellung (oder 
nach spätestens 2-3 Antworten)  kann man meist erkennen, ob der 
Fragesteller schon versucht hat sich zu informieren und das Problem 
selbst zu lösen. Die allergische Reaktion entsteht hier meist, wenn das 
nicht ersichtlich ist. Und ich bin der Meinung, nicht auf dich bezogen, 
das solches Schmarotzen assozial ist.

MfG Spess

von holger (Gast)


Lesenswert?

@ Johannes

ABO

>BTW: Welches "ca." im Tut willst Du überlesen haben?

Welcher Prescaler teilt schon durch "ca." ;)
Der gesunde Menschenverstand ist hier gefordert.

von Mathias O. (m-obi)


Lesenswert?

Ich beschäftige mich erst seit kurzer zeit mit dem Timer. Habe das Tut 
über Timer mehrmals durchgelesen. Und ich habe nur das ca. überlesen, 
ich dachte es wären genau 16 kHz, deswegen geteilt durch 1000 und nicht 
1024.Man könnte ja im Tut den richtigen Wert mit ein paar 
Nachkommastellen hinschreiben und ein Beispielcode in C wäre auchmal 
angebracht, dann würds auch nicht so viele "dumme" Fragen (wie von mir) 
geben.

Und es tut mir leid, ich werde in Zukunft einfach meine Klappe halten 
und nur noch sinnvolle Fragen posten.
Hab ja leider durch meine Fragen, schon ein echt negatives dummes Bild 
von mir hinterlassen. Dabei will ich das nur richtig lernen.

von Johannes M. (johnny-m)


Lesenswert?

Mathias O. wrote:
> Ich beschäftige mich erst seit kurzer zeit mit dem Timer. Habe das Tut
> über Timer mehrmals durchgelesen. Und ich habe nur das ca. überlesen,
> ich dachte es wären genau 16 kHz,
Aaah, das "ca." meinst Du. OK, verstehe.

> Und es tut mir leid, ich werde in Zukunft einfach meine Klappe halten
> und nur noch sinnvolle Fragen posten.
Naja, viele Fragen erledigen sich durch genaues Lesen und manchmal auch 
ein bisschen selbständiges Nachdenken mit gesundem Menschenverstand, 
bevor sie überhaupt hier im Forum gestellt werden müssen.

> Hab ja leider durch meine Fragen, schon ein echt negatives dummes Bild
> von mir hinterlassen.
Das geht im Normalfall recht schnell...

> Dabei will ich das nur richtig lernen.
Das ist ein Wort. Zum Lernen gehört eben auch, dass man sich selbst 
Gedanken macht und auch versucht, aus ansatzweisen Erklärungen etwas 
herauszuholen und nicht sofort nach fertigem Beispielcode zu schreien.

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.