Forum: Mikrocontroller und Digitale Elektronik Zyklenanzahl für Kammerton a mit ATtiny13 berechnen


von P. M. (sinuston)


Angehängte Dateien:

Lesenswert?

Servus,

ich will mit dem ATtiny 13 die Rechtecksfrequenz von 440Hz ausgeben. 
Dazu hatte ich mir die Zyklenanzahl ausgerechnet:

fµ/440Hz = Zyklenanzahl  -> 2727

diese Anzahl halbiere ich, damit ich den Wert für die 1. Wartezeit in 
Assembler herausbekomme  -> 1364 Zyklen also.

So weit die Theorie. Wenn ich jetzt allerdings die Werte aus dem 
Programm (im Anhang) so wähle damit ungefähr 1364 herauskommt erhalte 
ich kein a (=440Hz), wenn meine Rechnung stimmen sollte. Mit 
angeschlossenem Lautsprecher und Stimmgerät bekomme ich mit diesem 
Programm das a exakt heraus, aber es sind ja nur 1070 Zyklen im 
Programm.

Kann mir einer helfen, wo der Fehler liegen könnte??? Ich suche seit 
mehreren Stunden und finde ihn aber nicht. Vielleicht liegt ein/der 
Fehler bei den Befehlen rcall/ret (mit 3 gerechnet). Die Abweichung ist 
aber zu groß (ungefähr 300 Zyklen)

Ich hoffe mir kann jemand schnell helfen... Vielen Dank und was ich mir 
noch überlegt hatte, ob es vll am Lautsprecher mit Vorwiderstand 1kOhm 
liegt, der möglicherweise Schwingungen überlagert???

von P. M. (sinuston)


Lesenswert?

hab aus Versehen die Datei zwei mal angehängt...

von Hannes H. (mui)


Lesenswert?

warum benutzt du keinen Timer dafür? so kannst du auch sicher sein, dass 
die frequenz immer noch stimmt, wenn du etwas am programm änderst - von 
wegen durchlaufzeit und so...

von cn (Gast)


Lesenswert?

mal durchsimuliert?
interner rc richtig kalibriert? (aber da sind eigentlich nich so hohe 
abweichungen möglich)

von P. M. (sinuston)


Lesenswert?

danke für die schnelle Antwort!

Naja, es funktioniert ja schon. Ich hab das ja nicht nur für einen Ton 
gemacht sondern für drei Obertöne (sprich: 880,1760,3520Hz) und ich 
müsste nur noch begründen können wo die 300 Zyklen verloren gehen.

Ich frag mich nur, wo mein Rechenfehler liegen muss! Ist wahrscheinlich 
sehr simpel, aber ich komme gerade nicht drauf.

von P. M. (sinuston)


Lesenswert?

was meinst du mit durchsimulieren?

Der RC-Oszillator müsste passen. Ich verwende die Platine vom Lernpaket 
Mikrocontroller. Da steht, dass der unter 3% Abweichung arbeitet, aber 
3% von 1364 sind ja nur 40,92 -> 41 Zyklen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> fµ/440Hz = Zyklenanzahl  -> 2727
Woher kommt die Taktfrequenz 1,2MHz?

> was meinst du mit durchsimulieren?
Der Simulator zeigt an, wieviele Taktzyklen vergangen sind. Break vor 
dem rcall, Zähler auf 0 setzen, Break nach dem rcall, die Dauer ablesen.

von cn (Gast)


Lesenswert?

arbeitest du mit avrstudio?
da kannste den simulator anschmeißen (grüne play-taste oben mittig), dir 
haltepunkte (breakpoints) setzen und dann mal den instruction counter 
beobachten. einfach mal n bissl rumprobieren.

von P. M. (sinuston)


Lesenswert?

Hi vielen Dank,
das klingt vielversprechend.

Der Mikrocontroller arbeitet mit 9,6MHz, allerdings ist er 
voreingestellt auf einen Vorteiler 1/8 -> also 1,2MHz. Ich hatte schon 
ausprobiert, ob der falsche Vorteiler eingestellt ist, das wars 
allerdings nicht. Die Taktfrequenz müsste also stimmen!

Ja ich arbeite mit AVR Studio. Muss ich auf Toggle Breakpoint klicken? 
Weil bei den anderen Schaltflächen habe ich keine Ahnung was ich 
eingeben soll.

von Huch (Gast)


Lesenswert?

P. M. schrieb:
> arbeitet mit 9,6MHz

Bist Du Dir da sicher? Ich selbst meinte das der interne RC-Oszillator 
bei allen AVR auf 8MHz läuft. Ist das beim Tiny13 nicht so?

von Henk (Gast)


Lesenswert?

Hallo Huch, das ist falsch! Bei Atmega8 zum Beispiel ist es nur 1 MHz.

von Huch (Gast)


Lesenswert?

Henk schrieb:
> Bei Atmega8 zum Beispiel ist es nur 1 MHz.

Nein. Beim Atmega8 sind es lt. Datenblatt 8 MHz

von P. M. (sinuston)


Lesenswert?

Ja da bin ich mir sicher. Steht unter anderem im Buch, in der 
mitgelieferten Software... -> fµ=9,6MHz (ohne Vorteiler)

von Henk (Gast)


Lesenswert?

Was??? Also der Controller im Auslieferungszustand rennt defintiv auf 
1Mhz und nicht auf 8Mhz. Wo liest Du denn rum??

von R. M. (rmax)


Lesenswert?

Laut Datenblättern kann der interne Oszillator des Mega8 1, 2, 4 und 
8MHz, der des Tiny13 4,8 und 9,6MHz.

von Huch (Gast)


Lesenswert?

Henk schrieb:
> Was??? Also der Controller im Auslieferungszustand rennt defintiv auf
> 1Mhz und nicht auf 8Mhz. Wo liest Du denn rum??

Nun, das ist wohl ein Auslegungssache. Ich habe ja nicht geschrieben, 
das der uC auf einer bestimmten Taktfrequenz läuft sondern mit welcher 
Frequenz der RC-Oszillator läuft. Andererseits habe ich damit auch nur 
Recht (wenn Du verstehst was ich meine), denn es kommt natürlich schon 
auf die CKDIV-Fuse an, mit welchem Takt der Prozessor läuft. (Also hast 
Du auch Recht, Henk).
Nur, wenn die Zweifelsfrage 8 MHz oder 9,6MHz ist, dann kann man daraus 
fast sicher schliessen, das CKDIV hier auf Teilung durch 1 gesetzt ist.

Aber naja, R. Max hat die Frage ja schon geklärt.

von P. M. (sinuston)


Lesenswert?

Ich habe jetzt herausgefunden, wie ich die Cycles mit AVR studio zählen 
kann, danke für die Hilfe! Es sind 1357 (soll: 1364) also verzählt sich 
der Mikrocontroller sozusagen um 7 Zyklen. Habe es mit Stimmgerät 
überprüft und jetzt passt es! Also ist tatsächlich nur die Berechnung 
falsch, die ich zwar erklären muss, aber wenigstens kommt der richtige 
Ton heraus!

von R. M. (rmax)


Lesenswert?

@Huch

Nur der Vollständigkeit halber: Beim Mega8 gibt es keinen Prescaler, 
sondern der Oszillator selbst wird (mit CKSEL statt CKDIV) zwischen 1, 
2, 4 und 8MHz umgeschaltet und braucht für jede der Frequenzen einen 
anderen OSCCAL-Wert.

von P. M. (sinuston)


Lesenswert?

Servus,

wenn's einen interessiert: Ich habe den Fehler gefunden (dank debuggen). 
Der Befehl brne braucht jedesmal wenn der zu vergleichende Wert ungleich 
0 ist 2 Zyklen und nur wenn es gleich 0 ist 1 Zyklus. Bei meiner 
Berechnung hatte ich es genau anders herum gerechnet. Jetzt kommt auch 
dort das richtige raus.

von Bert 0. (maschinist)


Lesenswert?

P. M. schrieb:

> wenn's einen interessiert: Ich habe den Fehler gefunden (dank debuggen).
> Der Befehl brne braucht jedesmal wenn der zu vergleichende Wert ungleich
> 0 ist 2 Zyklen und nur wenn es gleich 0 ist 1 Zyklus. Bei meiner
> Berechnung hatte ich es genau anders herum gerechnet. Jetzt kommt auch
> dort das richtige raus.

Siehste, mit einem Timer wär' das nicht passiert...


Ciao...Bert

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.