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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
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!
Benjamin Ihrig schrieb: > 2000ms * 16000000Hz / 1024 = 31250000 Formel richtig, Ergebnis falsch. Tipps mal in den Taschenrechner ein.
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.
:
Bearbeitet durch User
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.
:
Bearbeitet durch User
Benjamin Ihrig schrieb: > Beim > hochfahren des Wertes soll sich die Frequenz möglichst linear dazu > steigern. Das ergibt dann eine Schrittweite von 0,195Hz.
So, ich habe es geschaft, mit CTC-Modus und einem Prescaler von 1024. Danke an alle die geholfen und Tipps gegeben haben! Gruß, Benjamin
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.