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???
hab aus Versehen die Datei zwei mal angehängt...
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...
mal durchsimuliert? interner rc richtig kalibriert? (aber da sind eigentlich nich so hohe abweichungen möglich)
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.
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
> 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.
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.
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.
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?
Hallo Huch, das ist falsch! Bei Atmega8 zum Beispiel ist es nur 1 MHz.
Henk schrieb:
> Bei Atmega8 zum Beispiel ist es nur 1 MHz.
Nein. Beim Atmega8 sind es lt. Datenblatt 8 MHz
Ja da bin ich mir sicher. Steht unter anderem im Buch, in der mitgelieferten Software... -> fµ=9,6MHz (ohne Vorteiler)
Was??? Also der Controller im Auslieferungszustand rennt defintiv auf 1Mhz und nicht auf 8Mhz. Wo liest Du denn rum??
Laut Datenblättern kann der interne Oszillator des Mega8 1, 2, 4 und 8MHz, der des Tiny13 4,8 und 9,6MHz.
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.
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!
@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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.