Hi kann mir eventuell jemand erklären wie das mit dem toggeln, um auf eine bestimmte Frequenz zu kommen, funktioniert? Also um zum Beispiel mit einem 8 Mhz µC an einem Pin eine Frequenz von 35 Khz zu erzeugen. Wenn ich die Werte habe kann ich doch nen Timer benutzen,mit dem Wert vorladen,und bei Überlauf nen Interrupt machen um Pin zu setzen und zu löschen. Stimmt das so ungefähr? Meine Frage ist nun wie ich auf die Wert(e)komme und was ich beim Timing beachten muß. Vielen Dank schonmal für eure Hilfe!
>Wenn ich die Werte habe kann ich doch nen Timer benutzen,mit dem Wert vorladen,und bei Überlauf nen Interrupt machen um Pin zu setzen und zu löschen. >Stimmt das so ungefähr? ja, so kann man das machen. Grössere AVR haben auch die Möglichkeit, Pins mit einem Timer ganz alleine zu togglen (onCompare-Pins).
Du brauchst die doppelte Toggle-Frequenz, also 70 KHz, also einen Teiler von ca 114 (8MHz / 70 KHz). Du stellst den Base-Teiler für den Timer auf 1, der Timer zählt dann bis auf 256 (8-Bit) dann tritt ein Overflow-Interrupt auf (beim AVR zumindest) Im Overflow-Interrupt setzt du den Timer dann auf TCNT=256-114 (evtl noch etwas mehr, da 1-2 Takte durch die Interrupt-Behandlung verloren gehen) und togglest den Pin. Das aber lastet den AVR ziemlich schnell aus, so dass man für andere Sachen nicht mehr so viel Rechenzeit hat. Alternativ kann man das auch über einen PWM-Pin machen, da initialisiert man der Timer einmal und er (der AVR) macht dann alles selber. Wie's mit anderen Controllern aussieht weiß ich leider nicht. Gruß Roland
Hallo Carsten, also eigentlich ganz einfach: Das Prinzip mit dem Timer hast du soweit schon richtig erkannt und verstanden. Um die Timerwerte zu berechnen mußt du nur wissen, mit welchem Takt dein Timer betrieben wird, also die Frequenz des Mikrocontrollers und den Prescaler (Vorteiler, welcher den Takt des MCs in einem definierten Verhältnis teilt und damit den Timer versorgt). Dieser Takt mit dem der Timer betrieben wird, bestimmt die Zeit (auch Periodendauer) eines Zählschrittes, also z.B. von 1 zu 2 (Periodendauer = 1 / Frequenz). Wenn der Zählbereich des Timers nicht ausreicht, also du eine "relativ" kleine Frequenz erzeugen willst, dann erhöhe den Prescalerwert um in einen Bereich zu gelangen, in dem du die Frequenz abbilden kannst. Dein Beispiel weitergeführt: Frequenz des Mikrocontrollers: f_mc = 8Mhz Frequenz des Ausgangssignales: f_out = 35 kHz Timergröße: 8 Bit Die Frage, welche sich jetzt stellt, aller wieviel µs mußt du den Pin umschalten: T_out = 1 / f_out = 1 / 35 kHz = 28.57... µs Um sehr genau an diesen Wert heranzukommen, ist es wichtig, den kleinstmöglichen Wert für den Prescaler zuverwenden. T_mc = 1 / f_mc = 0,125 µs die Anzahl der Zählschritte ergibt sich dann aus (T_out / 2) / T_mc = 114,285... T_out / 2 deswegen, da du immer nur bis zu dem Zeitpunkt zählen mußt, an dem du das Ausgangssignal invertierst, also je nur eine halbe Periodenlänge. Da du nur ganze Zahlen als Werte für den Timer verwenden kannst, verwendest du 114 (liegt ja zwischen 0 und 255, dem Wertebereich des Timers) und du brauchst keinen Prescaler verwenden. Zur Kontrolle noch mal die Frequenz ausrechenen, die am Ende wirklich erzeugt wird: f_out_real = 1 / T_out_real = 1 / (2 T_mc 114) = 35,088 kHz ergibt ne Anweichung von 0,25% Viel Spaß beim toggeln...
> ja, so kann man das machen. Grössere AVR haben auch die > Möglichkeit, Pins mit einem Timer ganz alleine zu togglen > (onCompare-Pins). Du meinst so riesige AVRs wie z.B den ATtiny13? ;-)
Vielen Dank soweit für eure Hilfe. Hab übrigens vergessen zu erwähnen daß ich nen Atmega verwende. Hier bin ich gerade im Datenblatt zu Werke und versuche die Methode von Rahul mit den onCompare Pins zu verstehen. Außerdem hab ich hier ja einen 16 bit Timer zur Verfügung!?
Die Methode heißt bei den AVRs übrigens CTC-Modus. Schau Dir das mal genauer an. Wenn Du mit Überläufen arbeitest, musst Du nämlich immer das Zählregister des Timers mit dem Startwert laden, wodurch 1. der Programmieraufwand steigt und 2. das ganze ungenauer wird. Im CTC-Modus initialisierst Du das ganze einmal und dann brauchste Dich nicht mehr drum zu kümmern...
Der 16 Bit-Timer zählt weiter als der 8 Bit-Timer, aber nicht genauer... Um genauer zu werden mußt du die Frequenz erhöhen, also statt 8 MHz deinen Atmel mit 16 MHz betreiben...
@Rolf: Ich arbeite bis jetzt nur mit ATMegas. Dass der Tiny13 das auch kann, wusste ich nicht. Vielleicht hätte ich lieber "aktuelle" oder dergl schreiben sollen.
@ Wadenbeisser: Kann es sein dass du eine +1 vergessen hast bei deiner Rechnung. Hab im Datenblatt des Atmega8515 auf Seite 86 die Formel verglichen. http://www.atmel.com/dyn/resources/prod_documents/doc2512.pdf
Oh, da hab ich mich zweideutig ausgedrückt. Das übliche "Problem" dass der Mikrocontroller bei 0 beginnt zu zählen, also bei 114 Zählschritten muß der OC-Wert 114-1 also 113 sein. Das Rücksetzten des Timers von 113 auf 0 braucht ja auch einen Takt.
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.