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?
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?
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.