Forum: Mikrocontroller und Digitale Elektronik Frequenzerzeugung mit tiny45 - niedirge frequenzen in hardware?


von Basti (Gast)


Lesenswert?

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?

von Joe F. (easylife)


Lesenswert?

wenn der prescaler nicht mehr ausreicht: interrupt per timer triggern, 
im interrupt weiter teilen (counter) und pin "von hand" toggeln.

von Georg (Gast)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?


von THOR (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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?

von posti (Gast)


Lesenswert?

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 
:)

von posti (Gast)


Lesenswert?

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)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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?

von Georg G. (df2au)


Lesenswert?

S. Landolt schrieb:
> In beiden Fällen ist das doch gar nicht möglich, oder?

Byte und Nibble verwechselt?

von S. Landolt (Gast)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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"?
;-)

von M. K. (sylaina)


Lesenswert?

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?

von Jumpin Jack Flash (Gast)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Georg G. (df2au)


Lesenswert?

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.

von posti (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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.

von THOR (Gast)


Lesenswert?

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.

von Jumpin Jack Flash (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.