Das ist natürlich sehr unvollständig.
Ich habe auch schon eine Idee wie man dies weiter vervollständigen kann,
aber ich kann mir nicht vorstellen das hierfür nicht schon eine fertige
Lösung existiert?
Hallo Karsten,
doch das mache ich schon seit Anfang der "Zeit", ich gebe die F_CPU, die
Timerfrequenz vor und einen TimerN, als Ergebnis erhalten ich den
passenden Prescaler und den besten Vorteiler für diesen TimerN.
Das rechnet mir natürlich der Preprozessor aus, der C Compiler hat also
nur mit Konstanten zu tun und erzeugt somit auch minimalen Code.
Die Formel steht im Datenblatt, in Abhängigkeit vom Timermode.
Alles andere ist Dreisatz.
Mir ist schon klar das dies möglich ist - es hat bisher nur anscheinend
noch keiner eine Lösung dafür veröffentlicht!
Ich versuche mich gerade ebenfalls an einer Lösung und finde das dies
nicht so trivial ist, da ja unterschiedliche Teiler möglich sind.
Für fast jedes Problem das "defined" werden kann wurde dies bereits
getan.
Nur nicht für das Timer Problem. :-(
Hallo Karsten,
dann bin ich mal auf deine Analyse dieses Codes gespannt.
einige wenige Defines und Macros und schon wird es sehr übersichtlich,
oder ?
Die Macros sind für die Codegenerierung für ein atmega32 ausgelegt.
Das erste Define scheint ein Makro zu sein welches für die nachfolgenden
Defines das Register mit dem richtigen Bitmuster lädt.
Danach wird der richtige Vorteiler ermittelt.
Dies habe ich zum transparenten ausprobieren in ein Calc (Excel-Tabelle)
übertragen.
Danach folgen weitere Makros, die die jeweiligen Register mit den
ermittelten Werten laden.
Und nun schaue ich Mal ob das auch mit den Werten passt ...
Ich befürchte die Berechnungen führen noch nicht so wirklich zum Ziel.
Beispiel:
CPU-Frequenz = 8 MHz
Soll-Frequenz = 1Hz
Wie man sieht ist die maximale Zeit die der Timer erreichen kann 8388
ms.
Es würde schon ein Vorteiler von 256 reichen, damit erreicht man 2097
ms.
Deine Teilerermittlung versagt hier aber bereits und gibt einen Error
aus!
Oder ist T1_FREQUENCE nicht die Soll-Frequenz die mit dem Timer erzielt
werden soll?
Karsten,
sehr eigenartig, dass mein Code in vielen Programm immer die richtige
Zeiten generiert.
Du musst meinen Code und die Marcos auf dem Papier durch spielen oder
den Assembleroutput ansehen !
Hallo Karsten,
anbei das korrigierte Sheet.
Da muss man schon meine Formeln genau so eintragen, wie ich sie
angegeben habe.
Wenn man das nicht macht, ist das Ergebnis nicht zu gebrauchen.
Oh ja - natürlich hast Du Recht!
Ich habe (in der Eile) in der Excel-Berechnung
F_CPU/(T1_FREQUENCE*B9) < T1_FREQUENCE
statt
F_CPU/(T1_FREQUENCE*B9) < T1_MAX_COUNTER
verglichen!
Das konnte dann natürlich auch nicht funktionieren.
Hier nun das korrigierte Excel-Sheet.
Zum Vergleich habe ich Mal die Rechnung über die Periodendauer gemacht
(grüner Bereich).
Deine Auswertung ist der gelbe Bereich.
In beiden Fällen kommt man auf einen Vorteiler von 256 und einen Compare
Match Load von 31250.
Ist ja genial.
Nun muss ich mir noch die Makros im Detail anschauen und evtl. auch noch
für einen ATMega8 anpassen.
Das dürfte aber sehr überschaubar sein.
Nochmal Danke dafür das Du Deinen Code mir und der Welt zur Verfügung
gestellt hast.
Ganz so einfach und schnell kommt man als C-Anfänger doch nicht zu so
einer komfortablen Lösung.
Super, Du hast es verstanden.
Und auch die Abstraktion zum Preloadwert, bei einem Overflow Interrupt,
geschafft.
Aber immer wenn ein neuer AVR µC verwendet wird, kann man den Timer0
anstatt im Normal Mode (Overflow) zu betreiben, auch den CTC Mode
(Compare Match) verwenden.
Dadurch entstehen keine Zeitfehler durch das neu Laden des Timers mit
einem neuen Zählerwert.
Unter neuer verstehe ich z.B. die Familie atmega48, atmega88, atmega168
und atmega328p.
Hallo Uwe,
inzwischen habe ich Deine Vorlage ein wenig mit Dokumentation und
Debug-Ausgaben erweitert.
So sieht man direkt welcher Prescaler eingestellt wird und ob die
gewünschte Frequenz auch tatsächlich genau erreicht wird.
Nun müsste man die Routine nur noch universeller für die verschiedenen
Timer ausgestalten ...
In dem Excel-Blatt waren auch noch Fehler, die jetzt hoffentlich alle
ausgebügelt sind.