Hallo zusammen,
ich bin ziemlich neu in der Programmierung von Mikrocontrollern und bin
in folgender Fragestellung leider nicht fündig geworden.
Ich arbeite mit einem ATTINY 2313.
Ich muss Impulse an einen Ausgang (PD2) legen. Deren Geschwindigkeit ist
abhängig vom Wert einer Variablen (8bit, also 0-255). Der Abstand
zwischen den Pulsen soll von 2s (Wert 1) bis 20ms (Wert 255) gehen (also
0,5Hz bis 50Hz). Beim Wert 0 sollen keine Pulse erzeugt werden. Beim
hochfahren des Wertes soll sich die Frequenz möglichst linear dazu
steigern.
Ich betreibe den ATTINY mit einem 16Mhz Quarz. Die Pulse sollen in
TIMER1 generiert werden.
Kann mir jemand helfen, oder einen Tipp geben? Falls ihr weitere Infos
benötigt, einfach Fragen.
Danke im Voraus!
Benjamin
Benjamin Ihrig schrieb:> Der Abstand> zwischen den Pulsen soll von 2s (Wert 1) bis 20ms (Wert 255) gehen (also> 0,5Hz bis 50Hz).
Mit welchen Abstufungen? Wie lange sollen die Pulse sein?
> Beim Wert 0 sollen keine Pulse erzeugt werden. Beim> hochfahren des Wertes soll sich die Frequenz möglichst linear dazu> steigern.>> Ich betreibe den ATTINY mit einem 16Mhz Quarz. Die Pulse sollen in> TIMER1 generiert werden.
Ist doch schon ein Ansatz.
Sieh dir zb mal die kurze Abhandlung über Timer hier an
FAQ: Timer
und wie man zb eine PWM da einsetzen könnte. Die PWM wird ein bischen
zweckentfremdet, indem sie immer einen 50% Dutycycle generiert und dafür
wird dann der TOP Wert geändert um die Wiederholfrequenz zu variieren.
Und dann musst du eben mal ein bischen rechnen, ob du damit die 2s bei
16Mhz noch hinkriegst.
Wenn nicht, dann muss man den Pin eben "händisch" schalten. Ist auch
kein Beinbruch, vor allen Dingen dann nicht, wenn der Tiny sonst nicht
viel zu tun hat.
Danke für die Antwort, die FAQs sind echt informativ. Die zwei Sekunden
bekomme ich aber mit PWM nicht hin. Bei 16Mhz Takt und einem Prescaler
von 1024 bin ich immernoch bei 15625 Ausführungen pro Sekunde.
Wie würde ich das ganze am besten angehen, wenn ich es händisch lösen
wollte?
Benjamin Ihrig schrieb:> Kann mir jemand helfen, oder einen Tipp geben?
PD2 ist ein etwas ungünstiger Ausgang; aber gehen würde es auch damit.
Ohne Dir jetzt irgendwelche Hausaufgaben zu lösen, ein Link auf eine
Anzahl verschiedener Impuls-/Frequenzgeneratoren mit AVRs.
http://www.mino-elektronik.de/Generator/takte_impulse.htm
Wenn Du die Funktion/Programme nachvollziehen kannst, sollte Dir eine
eigene Lösung nicht mehr schwer fallen.
Benjamin Ihrig schrieb:> Danke für die Antwort, die FAQs sind echt informativ. Die zwei Sekunden> bekomme ich aber mit PWM nicht hin. Bei 16Mhz Takt und einem Prescaler> von 1024 bin ich immernoch bei 15625 Ausführungen pro Sekunde.
falsch gerechnet.
Welchen Top Wert brauchst du, damit bei einer Frequenz von 16Mhz und
einem Vorteiler von 1024 damit ein PWM Zyklus 2s (also 2000ms) dauert?
2000 * 16000 / 1024 = 31250
31250 ist in Reichweite eines 16 Bit Wertes. Wenn du also einen PWM
Modus nimmst, bei dem du den Top Wert vorgeben kannst, zb Modus 14, dann
stellst du das ICR1 Register auf 31250 und du kriegst bei 16Mhz und
einem Vorteiler von 1024 genau 2 PWM Zyklen in der Sekunde. Jeder PWM
Zyklus ist eine komplette SChwingung, ergo ergeben sich 2Hz am Pin.
Da du allerdings den PWM Pin nicht frei hast, sondern am Pin PD2
rausgehen willst, kann der Timer das nicht selber regeln, sondern du
musst dich an die Interrupts halten, und in der ISR den Pin selbst
umschalten.
Tja. Und der Rest ist jetzt nur noch eine Herleitung der Formel, wie du
den Stellbereich von 0 bis 255 auf den Zeitbereich von 20 bis 2000
abbildest und das wiederrum weiter zu einem TOP (Register ICR1) Wert
umrechnest. Den setzt du und wenn alles richtig ist, dann toggelt der
Pin in den gewünschten Zeiten. D.h. plus minus ein kleiner Fehler, weil
sich die Umrechnungen nicht in ganzzahligen Vielfachen ausgehen.
Bei den kleineren Zeiten kann es auch sinnvoll sein, einen kleineren
Vorteiler zu nehmen, weil du ja deine Zeitabstufung nur in Schritten
dieses Vorteilers möglich ist. Das kann man aber zb in Excel alles mal
mit verschiedenen Vorteilern durchspielen und dort ablesen, ab welchen
Zeiten (und damit ab welchen Stellwerten) ein kleinerer Vorteiler
möglich ist. Generell willst du immer den kleinsten Vorteiler nehmen,
der geht. Ein Vorteiler ist dann geeignet, wenn du damit einen TOP Wert
erhältst, der kleiner als 65536 ist.
Karl Heinz schrieb:> Welchen Top Wert brauchst du, damit bei einer Frequenz von 16Mhz und> einem Vorteiler von 1024 damit ein PWM Zyklus 2s (also 2000ms) dauert?>> 2000 * 16000 / 1024 = 31250
Ich glaube ich habe Verstanden wie es gemeint ist, aber wäre die Formel
mit 16MHz nicht folgende?
2000ms * 16000000Hz / 1024 = 31250000
Das wäre dann bei 16bit schon wieder ein Problem. Muss ich dann einen
zusätzlichen Zähler laufen lassen?
Benjamin Ihrig schrieb:> Ich glaube ich habe Verstanden wie es gemeint ist, aber wäre die Formel> mit 16MHz nicht folgende?>> 2000ms * 16000000Hz / 1024 = 31250000>> Das wäre dann bei 16bit schon wieder ein Problem. Muss ich dann einen> zusätzlichen Zähler laufen lassen?
Nein, mein Fehler! Sorry!
Peter Dannegger schrieb:> Benjamin Ihrig schrieb:>> 2000ms * 16000000Hz / 1024 = 31250000>> Formel richtig, Ergebnis falsch.> Tipps mal in den Taschenrechner ein.
Fast. Auf die Einheiten kommts an.
Karl Heinz schrieb:> zb Modus 14, dann> stellst du das ICR1 Register auf 31250 und du kriegst bei 16Mhz und> einem Vorteiler von 1024 genau 2 PWM Zyklen in der Sekunde.
Ich will ja nicht pedantisch sein.
Aber damit erhält man nur ungefähr 2 Zyklen pro Sekunde.
mfg.
Thomas Eckmann schrieb:> Karl Heinz schrieb:>> zb Modus 14, dann>> stellst du das ICR1 Register auf 31250 und du kriegst bei 16Mhz und>> einem Vorteiler von 1024 genau 2 PWM Zyklen in der Sekunde.>> Ich will ja nicht pedantisch sein.> Aber damit erhält man nur ungefähr 2 Zyklen pro Sekunde.
:-)
Ich hatte beim Überlegen was ich schreiben will noch daran gedacht, und
es dann doch wieder verschwitzt.
Danke für die Ermahnung.
Natürlich muss das ICR1 mit 31249 geladen werden, wenn der Timer von 0
beginnend 31250 Zyklen abzählen soll.
Wenn Du nicht unbedingt mit 150 km/h vor den Baum fahren musst
(Rechenleistung), fahr doch einfach ein bisschen langsamer.
Mit einem 8MHz Quatsch geht’s gemütlicher und die minimale Zeit geht
runter.
Ist Dir das immer noch zu "schnell": Angeblich soll es Quarze mit noch
geringerer Frequenz geben.
Übrigens: Die Sache mit dem linearen Zusammenhang zwischen Zählerwerten
und Zeiten kannst Du Dir ruhig abschminken.
Amateur schrieb:> Übrigens: Die Sache mit dem linearen Zusammenhang zwischen Zählerwerten> und Zeiten kannst Du Dir ruhig abschminken.
Linear kann er es schon machen. Nur gibt es Quantisierungsfehler weil
1800 und 256 leider keinen gemeinsamen ganzzahligen Teiler haben. Kommt
drauf an, wofür er es braucht, ob das relevant ist oder nicht.
Benjamin Ihrig schrieb:> Beim> hochfahren des Wertes soll sich die Frequenz möglichst linear dazu> steigern.
Das ergibt dann eine Schrittweite von 0,195Hz.