Hi, ich möchte mit einem tiny45 frequenzen von 1-1000hz erzeugen. bisher verwende ich einen mega8 (16bit timer1,output compare match toggle) Bei einem tiny45 gibt es keinen 16 bit timer daher sind die erzeugbaren frequenzen nicht sehr niedrig. Gibts nen trick, oder muss ich bei diesem controller die frequenz in software erzeugen?
wenn der prescaler nicht mehr ausreicht: interrupt per timer triggern, im interrupt weiter teilen (counter) und pin "von hand" toggeln.
Basti schrieb: > ich möchte mit einem tiny45 frequenzen von 1-1000hz erzeugen Und sonst nichts? Ich meine damit: wenn der Tiny nichts anderes zu tun hat, kann man natürlich auch ein, sonst verpönte, Endlosschleife verwenden, die einen Startwert herunterzählt. Georg
Basti schrieb: > Hi, > > ich möchte mit einem tiny45 frequenzen von 1-1000hz erzeugen. bisher > verwende ich einen mega8 (16bit timer1,output compare match toggle) > Bei einem tiny45 gibt es keinen 16 bit timer daher sind die erzeugbaren > frequenzen nicht sehr niedrig. > > Gibts nen trick, oder muss ich bei diesem controller die frequenz in > software erzeugen? Gehts um Rechtecke: - in Software weiter runterteilen - fcpu niedriger wählen Gehts nicht zwingend um Rechtecke: - Lookup-Tabelle mit Werten, die per PWM rausschreiben und dann TP-Filtern
Taktquelle? Gehen wir von intern 8 MHz aus. Prescaler für Timer0 auf 1024, Timer0 auf Max = 256 ergibt 30Hz. Wenn man niedriger möchte, muss man den Systemtakt teilen, maximal durch 256. Dann hat man schon 0.1Hz. Wo ist das Problem?
Hi Da gerade von langsamen Frequenzen die Rede war, wäre ggf. 1MHz wählbar. Alternativ, wenn der Chip sonst Nichts zu tun hat: Ausrechnen, wieviele Takte wir bis zur nächsten Flanke Zeit haben. Da diese Zeit den Zählwert des Timer um Längen übersteigt, einen Software-Counter hochzählen. (per Überlauf-Interrupt aufgerufen) Diesen kann man beliebig groß machen. Wenn Dir 8 Bit nicht reichen, nimmst Du statt - inc r5 halt - clr r4 (ganz vorne im Programm, selber definiere ich eine Variable 'zero' und setze Diese auf Null - inc r5 - brne PC+2 - inc r6 (da Register 0...15 nicht mit add/adc benutzt werden können) Wenn Dir 16 Bit (plus die 8 im Timer) nicht reichen, noch nen Register mehr. Wenn nur gesetzt/gelöscht/inc/dec gebraucht wird, gehen die Register 0-15 auch dafür. Diesen Software-Counter fragst Du auf Deine 'Endzeit' ab - wenn Diese erreicht wird, Ausgang toggeln und Software-Counter auf Null setzen. Das 'PC+2' bedeutet, 'springe 2 Befehle nach unten' - Vorsicht, wenn zwischen den Sprung und dem Ziel weitere Anweisungen geschrieben werden! So, dann Butter 'bei die Fische', was hast Du vor, was hast Du bereits gemacht und: Kommst Du hiermit zurecht? Selber programmiere ich in Assembler ... nicht immer der leichteste Weg :)
Hi Äh, add und adc gehen sehr wohl mit r0...r31. Hatte ich mit SUBI verwurschtelt - Asche über mein Haupt! (schrieb ja schon, nicht ganz einfach, Assembler)
posti schrieb: > brne PC+2 Verwende einen vernünftigen Assembler, der Labels unterstützt. > Das 'PC+2' bedeutet, 'springe 2 Befehle nach unten' > Vorsicht, wenn zwischen den Sprung und dem Ziel weitere Anweisungen > geschrieben werden! Je nach Assembler bedeutet das: "springe 2 Byte nach vorne".
> Je nach Assembler bedeutet das: "springe 2 Byte nach vorne".
Das gibt's tatsächlich? Also einen Assembler, der zulässt, mitten in ein
Befehlswort hineinzuspringen, würde ich nicht verwenden wollen.
S. Landolt schrieb: > Also einen Assembler, der zulässt, mitten in ein > Befehlswort hineinzuspringen, würde ich nicht verwenden wollen. Etwas oT: Früher (TM), als Speicherplatz noch knapp und teuer war, war es durchaus üblich, auf das erste, zweite oder dritte Byte des ersten Befehls einer Routine zu springen und so unterschiedliche Reaktionen zu erzeugen. Das verwirrt im übrigen auch den unbedarften Disassembler. Gutes Beispiel: Das HP-Basic für den 8080.
Zu HP-Basic kann ich nichts sagen mangels Kenntnis. Es geht hier um einen ATtiny45, da besteht das Befehlswort aus 2 Bytes, und da mitten hineinzuspringen wäre genauso, um Ihren Vergleich aufzugreifen, als würde man auf dem 8080 bei einem MVI A,$CD auf das 'E' des 3E für MVI A springen. In beiden Fällen ist das doch gar nicht möglich, oder?
S. Landolt schrieb: > In beiden Fällen ist das doch gar nicht möglich, oder? Byte und Nibble verwechselt?
Man kann auf einem AVR8 nicht auf ein ungerades Byte springen, so wie man auf einem 8080 nicht auf ein Nibble springen kann. Das meinte ich mit 'mitten hinein'.
Basti schrieb: > Gibts nen trick Der Trick ist, nicht davon auszugehen, daß alle AVR gleich sind, sondern einen Blick ins Datenblatt zu riskieren. Der Prescaler des Timer1 geht beim Attiny45 bis 16384. Damit kommst du bei 1MHz bis auf 0,24Hz runter.
Thomas E. schrieb: > Der Prescaler des Timer1 geht > beim Attiny45 bis 16384. Damit kommst du bei 1MHz bis auf 0,24Hz runter. Mit dem recht groben Vorteiler zu arbeiten bedeutet aber auch, Auflösung bei niedrigen Frequenzen zu verschenken. Die genauen Anforderungen kennen wir nicht, aber wenn quarzgenaue Frequenzen von z.B. 10.000 Hz, 50.000 Hz oder 440.00 Hz erzeugt werden sollen, braucht man passende Taktfrequenzen oder auch ein wenig Glück mit den Einstellungen der Vor-/Teiler. Mein Vorschlag von oben liefert gerade bei niedrigen Frequenzen sehr hohe Auflösung. Das jitterfreie Timing erzeugt ein Hardwaretimer, sodaß die anfallenden Interrupts auch mit einiger Verzögerung von < 256 CPU-Takten bedient werden können. Was bislang auch nicht bekannt ist, wie die Frequenz eingestellt werden soll. "Nach Diktat verreist"? ;-)
Basti schrieb: > Hi, > > ich möchte mit einem tiny45 frequenzen von 1-1000hz erzeugen. bisher > verwende ich einen mega8 (16bit timer1,output compare match toggle) > Bei einem tiny45 gibt es keinen 16 bit timer daher sind die erzeugbaren > frequenzen nicht sehr niedrig. > > Gibts nen trick, oder muss ich bei diesem controller die frequenz in > software erzeugen? Mit welchem Takt läuft der Attiny? Werkseinstellung sind 1 MHz, mit einem Prescaler von 1024 kommt man schon auf rund 1kHz runter Timertakt runter, mit dessen Auflösung wären dann schon rund 4 Hz möglich. Und Timer1 hat Prescaler bis 16384 in Petto. Welche Randbedingungen gibts bei dir?
S. Landolt schrieb: > Das gibt's tatsächlich? Also einen Assembler, der zulässt, mitten in ein > Befehlswort hineinzuspringen, würde ich nicht verwenden wollen. S. Landolt schrieb: > Man kann auf einem AVR8 nicht auf ein ungerades Byte springen, so wie > man auf einem 8080 nicht auf ein Nibble springen kann. Das meinte ich > mit 'mitten hinein'. Ich weiß nicht: Was soll es bedeuten? Erst Zweifel, daß es das gibt, dann Feststellung, daß es das nicht gibt. Alles vom gleichen User.
S. Landolt schrieb: > Also einen Assembler, der zulässt, mitten in ein > Befehlswort hineinzuspringen, würde ich nicht verwenden wollen. Das ist aber der Normalfall, wenn man statt einem Label eine Zahl angibt, z.B. JMP $+5. Da muss man natürlich selber schauen wo die 5 Schritte hinführen, Assembler setzt ganz allgemein einen denkenden Programmierer voraus. Georg
Georg schrieb: > Assembler setzt ganz allgemein einen denkenden > Programmierer voraus. IIRC adressiert der PC im AVR wortweise. Von daher ist es unmöglich, "ungerade" zu hüpfen. Die "5" im Beispiel sind 5 Worte Sprungweite, nicht 5 Bytes.
Hi Man springt im Programmspeicher Wortweise - das führt auch dazu, daß Tabellen im Programm-Speicher mit Label * 2 berechnet werden müssen - zumindest beim ATtiny45. Und, keine Angst, der Assembler kann Labels. Nur ist es etwas doof, wenn generierte Delays, Die Labels benutzen, immer die gleichen Labels nehmen - macht dann keinen Spaß mehr. Deshalb habe ich mir dort die Variante abgeschaut, den Pointer 'direkt' zum Ziel zu schicken. (mit dem Delay-Generator, Win: http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html ) Auch ist nicht für jede Prüfung des T-Flag ein unsagendes Label eine Verbesserung der Lesbarkeit. Nur als Ehrenrettung meinerseits ;) Nun aber weiter mit dem PWM - Stichwort Delay, schon Mal hier dran gedacht: https://www.mikrocontroller.net/articles/AVR_Assembler_Makros#Delay Wenn die Wartezeit bis zum nächsten Flankenwechsel bekannt ist und sich mit dem Interrupt nicht anfreunden kann, kann man damit Warteschleifen zusammenbasteln. Durch Erweitern habe ich das Delay-Makro auch auf µs aufgepumpt. MfG
an Jumpin Jack Flash Ich bin kein Freund dieser diversen Grins-Gesichter (heißen sie Emoticons?), überlasse es also dem Leser, Spaß, Witz, Ironie, Sarkasmus oder homerisches Gelächter zu erkennen, zu vermuten oder zu argwöhnen. Wenn das manchmal schiefgeht, nun, auch recht.
S. Landolt schrieb: > an Jumpin Jack Flash > > Ich bin kein Freund dieser diversen Grins-Gesichter (heißen sie > Emoticons?), überlasse es also dem Leser, Spaß, Witz, Ironie, > Sarkasmus oder homerisches Gelächter zu erkennen, zu vermuten oder zu > argwöhnen. Wenn das manchmal schiefgeht, nun, auch recht. Das setzt gewisse Intelligenz vorraus und die Bereitschaft, nicht jeden Andersdenkenden sofort als Depp zu klassifizieren. Schonmal was mit kappa zu tun gehabt? Das ist das Schild wo "Ironie" draufsteht. Für die Leute, die es brauchen.
S. Landolt schrieb: > .......überlasse es also dem Leser, Spaß, Witz, Ironie, > Sarkasmus oder homerisches Gelächter zu erkennen, zu vermuten oder zu > argwöhnen. Wenn das manchmal schiefgeht, nun, auch recht. Super Einstellung: Jemand, der eine Frage stellt, wird zum Narren gehalten, weil er den Beitrag für "echt" hält. Es kann dann aber passieren, daß man KEINE Deiner Antworten mehr für "voll" nimmt.
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.