RCO
26.08.2005, 14:25
Hallo Leute,
mein Titel ist vielleicht etwas verwirrend, drum wrde ich nun mal erläutern worum es geht. Ich möchte mit einem ATmega8 eine varialbe Frequenz von 1 bis ca. 120-150 Hz. Ausgeben bzw. dann einen Interrupt auslösen. Dazu stehen mir leider nur noch die Timer 0 und 2, als 8-Bit-Timer zur Verfügung, bei denen sich nciht die Obergrenze frei wählen lässt. Ich verwende jetzt einen Vorteiler von 1024. Mit den 8-Bit erreiche ich also eine minimalfrequenz von (16M/1024/256) ca. 61 Hz. Das ist deutlich zu hoch, deshalb werde ich auch noch einen Zähler in der IRQ verwenden müssen ("IRQ-Presc."), der ebenfalls quasi als weiterer Prescaler fungiert.
Für schnellere Frequenzen oberhalb der 61 Hz werde ich den Timer in der IRQ mit einem Wert füllen ("Timervorage").
Nun ist es relativ einfach die 2 Werte vür z.B. 100Hz zu bestimmen:
IRQ-Presc. = 0
Timervorabge = 256-156,25 also ca. 100.
Alzu genau muss das ganze eh nicht sein. Es stellt sich aber das Problem, dass nicht ich die Werte bestimme, sondern der AVR sie ausrechnen soll!
Und das möglichst intelligent. Damit möglichst wenig der kostabren Prozessorzeit verloren geht sollte die IRQ so wenig wie möglich aufgerufen werden, also der IRQ-Presc. und die Timervorgabe möglichst klein sein.
Wie lassen sich diese beiden Werte also sinnvoll bestimmen, wenn ich nur eine Anzahl der Ereignisse pro Sekunde vorgebe?
Mir ist schon relativ klar, dass ich zwischen 2 Fällen Unterscheiden sollte, Vorgabe über oder unter 61!
Je nachdem welcher Fall es ist, wird entweder an der Timervorgabe oder dem IRQ-Presc. "gedreht". Allerdings kommen da gerade in dem Bereich um 60 sehr ungenau Werte raus. Für eine Vorabge von 60 wäre z.B. diese Lösung optimal:
IRQ-Presc. = 2
Timervorgabe = 256-130 = 126
16M/1024/130/2 = 60,096
Und damit deutlich genauer als:
(Da unter 60 wird die Timervorgabe 0 und nur mit dem IRQ-Presc gearbeitet)
16M/1024/256/1 = 61
Für 45 ist der Fehler sogar noch gravierender!
Also wie ließe sich das günstig ausrechnen, ohne alle Zahlen durchprobieren zu müssen? Ideen?
Oder anders gefragt:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=664
Wie kriege ich es hin, dass die Variablen Timervorgabe und IRQ-Presc. möglichst klein sind und für X eine "möglichst natürliche" Zahl rauskommt.
mein Titel ist vielleicht etwas verwirrend, drum wrde ich nun mal erläutern worum es geht. Ich möchte mit einem ATmega8 eine varialbe Frequenz von 1 bis ca. 120-150 Hz. Ausgeben bzw. dann einen Interrupt auslösen. Dazu stehen mir leider nur noch die Timer 0 und 2, als 8-Bit-Timer zur Verfügung, bei denen sich nciht die Obergrenze frei wählen lässt. Ich verwende jetzt einen Vorteiler von 1024. Mit den 8-Bit erreiche ich also eine minimalfrequenz von (16M/1024/256) ca. 61 Hz. Das ist deutlich zu hoch, deshalb werde ich auch noch einen Zähler in der IRQ verwenden müssen ("IRQ-Presc."), der ebenfalls quasi als weiterer Prescaler fungiert.
Für schnellere Frequenzen oberhalb der 61 Hz werde ich den Timer in der IRQ mit einem Wert füllen ("Timervorage").
Nun ist es relativ einfach die 2 Werte vür z.B. 100Hz zu bestimmen:
IRQ-Presc. = 0
Timervorabge = 256-156,25 also ca. 100.
Alzu genau muss das ganze eh nicht sein. Es stellt sich aber das Problem, dass nicht ich die Werte bestimme, sondern der AVR sie ausrechnen soll!
Und das möglichst intelligent. Damit möglichst wenig der kostabren Prozessorzeit verloren geht sollte die IRQ so wenig wie möglich aufgerufen werden, also der IRQ-Presc. und die Timervorgabe möglichst klein sein.
Wie lassen sich diese beiden Werte also sinnvoll bestimmen, wenn ich nur eine Anzahl der Ereignisse pro Sekunde vorgebe?
Mir ist schon relativ klar, dass ich zwischen 2 Fällen Unterscheiden sollte, Vorgabe über oder unter 61!
Je nachdem welcher Fall es ist, wird entweder an der Timervorgabe oder dem IRQ-Presc. "gedreht". Allerdings kommen da gerade in dem Bereich um 60 sehr ungenau Werte raus. Für eine Vorabge von 60 wäre z.B. diese Lösung optimal:
IRQ-Presc. = 2
Timervorgabe = 256-130 = 126
16M/1024/130/2 = 60,096
Und damit deutlich genauer als:
(Da unter 60 wird die Timervorgabe 0 und nur mit dem IRQ-Presc gearbeitet)
16M/1024/256/1 = 61
Für 45 ist der Fehler sogar noch gravierender!
Also wie ließe sich das günstig ausrechnen, ohne alle Zahlen durchprobieren zu müssen? Ideen?
Oder anders gefragt:
https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=664
Wie kriege ich es hin, dass die Variablen Timervorgabe und IRQ-Presc. möglichst klein sind und für X eine "möglichst natürliche" Zahl rauskommt.