www.mikrocontroller.net

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


Autor: P. M. (sinuston)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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???

Autor: P. M. (sinuston)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab aus Versehen die Datei zwei mal angehängt...

Autor: Hannes H. (mui)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: cn (Gast)
Datum:

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

Autor: P. M. (sinuston)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. M. (sinuston)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: cn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. M. (sinuston)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Henk (Gast)
Datum:

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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Henk schrieb:
> Bei Atmega8 zum Beispiel ist es nur 1 MHz.

Nein. Beim Atmega8 sind es lt. Datenblatt 8 MHz

Autor: P. M. (sinuston)
Datum:

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

Autor: Henk (Gast)
Datum:

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

Autor: R. Max (rmax)
Datum:

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

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. M. (sinuston)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: R. Max (rmax)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. M. (sinuston)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bert 0. (maschinist)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.