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
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
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
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.
Achso, ich versuche möglist genau 1750 Hz an einem Ausgang hinzubekommen.
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
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
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
Wie 64 dazu ? g "damit ist die Reaktionszeit konstant" Wie meinst du das ? Gruß Stefan
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
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.