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
>Bei einem Prescaler von 1024 muss ich >einfach durch 1000 rechnen, Nein, durch 1024
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
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?
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.
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
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?
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]]
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?
>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
> 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?
>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
> 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?
> 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).
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?
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
Du bist nicht von Phoenix Contact,oder ? Wenn ja, was machst Du da? Triax anzünden?
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
Doch bin ich, und das worum es hier geht ist rein privat. Um die Erkennung des Nulldurchgangs geht es hier nicht.
>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
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...
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.)
> Ein Quader hat 6 Rechtecke
Manchmal hat er aber auch 2 Quadrate und 4 Rechtecke. Das macht die
Sache
außerordentlich schwierig....;-)
gez, Katapulski
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
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.
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?
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
@ Johannes
ABO
>BTW: Welches "ca." im Tut willst Du überlesen haben?
Welcher Prescaler teilt schon durch "ca." ;)
Der gesunde Menschenverstand ist hier gefordert.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.