Hallo, nachdem ich mein Java-Projekt nun abgeschlossen habe, hatte ich wieder Zeit für AVRs und hab mir eine zweite Binäruhr gebaut (endlich). Im Zuge dessen habe ich in Visual Basic ein kleines Programm geschrieben, um mir die Werte für die Timer des verwendeten ATMEGA-8 aus zu rechnen. Nun würde ich gerne wissen, ob die Werte so auch korrekt sind (Ich benutze die Formeln aus dem Datenblatt des ATMEGA-8, sind die bei einem anderen AVR anders?). mit freundlichen Grüßen, Valentin Buck
Valentin Buck schrieb: > Nun würde ich gerne wissen, ob die Werte so auch korrekt sind Ist falsch. Mit deinen Werten hast du eine CTC Frequency von 2 Hz > (Ich > benutze die Formeln aus dem Datenblatt des ATMEGA-8, sind die bei einem > anderen AVR anders?). Nein. Denn das Prinzip nach dem ein Timer funktioniert ist immer gleich. Ein Baustein bekommt einen Zähltakt vorgeworfen und zählt vor sich hin. Bei bestimmten Zählerständen passiert etwas. Hat man dieses simple Prinzip erst einmal verstanden, braucht man auch die Formeln im Datenblatt nicht mehr und macht auch nicht die dummen Fehler, dann die falschen Formeln zu verwenden. Was im übrigen nicht heißen soll, dass so ein Rechner unpraktisch ist.
Im Datenblatt steht: fOCnA = fclk_I/O / (2*N*(1+OCRnA)) scilab meint dazu: -->x = 32768 / (2* 256 * (1+63)) x = 1. Warum sollte die CTC-Frequenz dann 2Hz sein? Mit freundlichen Grüßen, Valentin Buck
Valentin Buck schrieb: > Im Datenblatt steht: > fOCnA = fclk_I/O / (2*N*(1+OCRnA)) Wo genau steht das im Datenblatt (unter welcher Überschrift)? > > 1. Das ist die Frequenz mit der ein Pin toggeln würde, wenn er jedesmal in einer ISR um geschaltet wird. > Warum sollte die CTC-Frequenz dann 2Hz sein? Weil für mich der Begriff CTC Frequenz impliziert, das mich interessiert wie oft ein CTC in der Sekunde ausgelöst wird. Dein Timer würde in 1 Sekunde von 0 bis 32767 zählen. Nicht ganz. Denn durch den Vorteiler, kann er in 1 Sekunde nur von 0 bis 32768/256 = 128 zählen. Bei einem Compare Wert von 63 bedeutet das, dass der Timer genau 1/2 Sekunde benötigt um von 0 bis 63 zu zählen. Ergo erfolgt jede Sekunde genau 2 CTC Ereignis, bei dem der Zähler auf 0 zurückgesetzt wird. 2 Ereignis pro Sekunde ist aber 2 Hz
:
Wiederhergestellt durch User
@Karl heinz Buchegger: Ich habe ein kleines Verständnisproblem: Karl heinz Buchegger schrieb: > Wo steht das? Auf Seite 89 im Datenblatt des ATMEGA-8. Karl heinz Buchegger schrieb: > Denn das wären dann 0.5 Hz und nicht 2Hz Wo habe ich 2Hz geschrieben? Karl heinz Buchegger schrieb: > 1 Ereignis pro Sekunde ist aber 1 Hz Das habe ich doch die ganze Zeit errechnet??? EDIT: Durch die Korrektur ist mir das jetzt klar geworden! Ich meine auch nicht die Toggle-Frequenz, sondern die Frequenz, bei der die Timer Compare Interrupts aufgerufen werden. mit freundlichen Grüßen, Valentin Buck
Valentin Buck schrieb: > @Karl heinz Buchegger: > Ich habe ein kleines Verständnisproblem: > > Karl heinz Buchegger schrieb: [Zusammengefasst] Ich habe zwar am Taschenrechner korrekt die 128 Timrtakte ausgerechnet, mich aber beim Zusammenstellen des Postings vertan und stattdessen 64 eingesetzt und damit weiter gerechnet. Nach dem Posting bin ich drauf gekommen und habs korrigiert. Daher waren die ersten Zahlen ganz einfach falsch. >> Wo steht das? > > Auf Seite 89 im Datenblatt des ATMEGA-8. Du musst im Datenblatt immer genau aufpassen wie die Kapitelüberschrift lautet und wovon die Rede ist. Wird vom Timer ein Pin getoggelt oder ist es die Interrupthäufigkeit selber, die ausgerechnet wird. Timer toggeln ist logischerweise immer halb so häufig wie die ISR Häufigkeit, weil es ja 2 ISR Aufrufen bedarf um den Timer 2 mal zu toggeln (und so die 'Schwingung' vollständig zu machen) > > EDIT: Durch die Korrektur ist mir das jetzt klar geworden! Sorry für die Konfusion. Das Endergebnis so wie es jetzt angegeben ist stimmt aber. Der CTC tritt mit 2Hz auf. 32768/256/64 = 2
So. Ich glaube ich habe es verstanden: 1. Die Formel aus dem Datenblatt ist schon richtig, berechnet aber nur die Toggle-Frequenz eines Pins. Da ein Pin nicht in jeder ISR EIN und AUS geschaltet wird, halbiert sich die Frequenz. Wenn man also die Formel zu fOCnA = fclk_I/O / (N*(1+OCRnA)) umformt, dann stimmt das Ergebnis. 2. Ein Zähler funktioniert im Grunde genommen immer gleich. Wenn er getaktet wird, so ist der Grundtakt durch den Vorteiler zu teilen. Da ein Zähler nullbasiert zählt, muss man von dem Compare-Teiler 1 abziehen. DANKE!!! Also: x = (32768 / 256) / (1+127) x = 1.n Wenn jemand noch Verwendung für das nun korrigierte Programm hat, es steht unter der Creative Commons Attribution-NonCommercial-ShareAlike-Lizenz (http://creativecommons.org/licenses/by-nc-sa/3.0/) und ist somit frei für die Nutzung, solange der Hinweis auf mich verbleibt, es nicht verkauft wird und bei Änderungen die selbe Lizenz oder die NonCommercial-Lizenz benutzt wird. Mit freundlichen Grüßen, Valentin Buck
Valentin Buck schrieb: > Da ein Pin nicht in jeder ISR EIN und AUS geschaltet wird, halbiert > sich die Frequenz. Ganz genau. Daher wäre es in deinem Programm vorteilhaft, wenn man das zb mit einer Checkbox einstellen könnte, ob man die Pin Toggle Frequenz haben möchte oder die ISR-Frequenz > Ein Zähler funktioniert im Grunde genommen immer gleich. > Wenn er getaktet wird, so ist der Grundtakt durch den Vorteiler zu > teilen. > Da ein Zähler nullbasiert zählt, muss man von dem Compare-Teiler 1 > abziehen. Jetzt hast du es. Eigentlich ganz simpel :-)
Soo. Noch die wirklich gute Anmerkung von Karl Heinz Buchegger umgesetzt. Lizenz bleibt die gleiche! mit freundlichen Grüßen, Valentin Buck
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.