Ich habe vor mit einem Atmega 32 per Software PWM ein Rechtecksignal für
stinknormale Pc-Piepser zu programmieren, um damit verschiedene Töne
abzuspielen (und da per Software PWM, vielleicht auch gleich noch
mehrere Piepser anzuhängen). Jedoch ist mir dabei ein Problem gekommen:
Wenn ich den Piepser gleich am Anfang mit einer zu hohen Frequenz
belaste, könnte ich diesen ja theoretisch zerstören.
Jetzt zu meinen Fragen: Wenn ich den Atmega32 mit WinAVR programmiere
und den Ausgang in einer Schleife nur alle X Durchgänge an bzw
ausschalte, wie groß sollte dann X in etwa sein um eine Fruquenz von
10000 Hz zu erreichen?
Und noch etwas: Wie viele Schleifendurchgänge brauche ich um in etwa
eine Sekunde zu erreichen?
Beispiel:
unsigned char Wechsel = 100;
unsigned char a;
for(i,i<Zeit,i++)
{
if (a == Wechsel)
{
if (ausgang == true) ausgang = false;
else ausgang = true;
}
a++;
}
Ist jetzt nur eine Beispiel wie vorgegangen werden müsste, also keine
richtige Syntax. Wichtig wäre jetzt eben zu erfahren wie groß in etwa
Wechsel und Zeit sein sollten.
Schonmal Danke im Vorraus!
C + Zeitkritisch = Scheiße.
Machs in Assembler und zähl Instruktionen oder nimm nen Timer dafür.
Oder übersetz den C-Quelltext und gugg ins Assemblerlisting.
Danke für die schnelle Antwort, trotzdem muss ich leider in C arbeiten,
da mein Projekt etwas komplexer wird, und ich in Assembler noch nicht
sehr viel Erfahrung habe.
Ohne Angabe der Taktfrequenz des Controllers kann man nichtmal raten...
Wenn Du das halbwegs genau haben möchtest, nimmst Du einen Timer.
Naja, mit 10kHz Rechteck kann man ohnehin keinen 10kHz Ton erzeugen.
Durch die Modulation der Pulsweite wirst Du keine verschiedenen Töne
erzeugen können, nur unterschiedliche Lautstärken.
Edit: kurz drüber nachgedacht bin ich mir da garnicht so sicher was da
passiert. Ein Lautsprecher ist ja keine LED...
Wie man auf eine Sekunde kommt?
Im Timer-IRQ einen Zähler mitlaufen lassen.
=> Der Lautsprecher geht nicht kaputt wegen zu hohen Frequenzen.
=> Ein 10 kHz Rechteck erzeugt sehr wohl auch ein 10 kHz Ton (was
sonst?)
=> Im Simmulator vom AVR-Studio kannst Du sehr gut ermitteln, wie lange
ein Schlaufendurchlauf dauert, Du muss bloss dem Simmulator die
richtige
CPU Frequenz mitteilen.
=> Der Lautsprecher geht nicht kaputt wegen zu hohen Frequenzen.
=> Ein 10 kHz Rechteck erzeugt sehr wohl auch ein 10 kHz Ton
(was sonst?)
=> Im Simmulator vom AVR-Studio kannst Du sehr gut ermitteln,
wie lange ein Schlaufendurchlauf dauert, Du musst bloss dem
Simmulator die richtige CPU Frequenz mitteilen.
Danke für die sehr schnelle Hilfe!
Wenn es dem Lautsprecher nichs ausmacht zu hohe Freuquenzen abzuspielen,
sollte das ja eigentlich kein Problem sein einfach zu probieren, und mit
einem Stimmgerät die Tonhöhe zu ermitteln. Die Sekunde werde ich einfach
mit einer Stoppuhr halbwegs hinbekommen, muss ja nicht genau sein,
sondern nur Töne verschiedener Länge halbwegs abspielen können.
Warum bist du denn gegen einen Timer so beratungsresistent? Wenn dein µC
NUR einen Dauerton generieren soll, kannst du das in der Hauptschleife
machen. Da du aber von einem umfangreichem Projekt sprichst denke ich,
dass er auch noch was anderes zu tun bekommt. Und schwupps hast du ein
Problem, denn z.B. Interrupts wurschteln dir dazwischen und versauen dir
dein ganzes Timing. Außerdem brauchst du beim Timer garnichts ausmessen,
probieren, zählen. Du musst nur ausrechnen, welchen Prescaler und
eventuell Pre-Load bzw. TOP Value du brauchst, um auf deine gewünschte
Frequenz zu kommen. Dann noch den richtigen WGM Mode und du brauchst
nichtmal mehr selbst deinen Pin toggeln.
anfu wrote:
> Wenn es dem Lautsprecher nichs ausmacht zu hohe Freuquenzen abzuspielen,> sollte das ja eigentlich kein Problem sein einfach zu probieren, und mit> einem Stimmgerät die Tonhöhe zu ermitteln.
Trial&Error ist definitiv keine Eigenschaft die einen Programmierer
auszeichnet (im wahrsten Sinne des Wortes).
Höchstens ein blutiger Anfänger darf das (um zu lernen, wie man es
richtig macht).
Mir wäre auch einfach die Zeit zu schade.
Du weißt doch die Quarzfrequenz, mit der Du Deinen AVR betreibst und die
Frequenz, die Du hören willst.
Dann trägst Du die beide in die Formel zur Berechnung des Comparewertes
des Timer ein, compilierst, brennst und schon kommt genau die Frequenz
raus.
Probieren ist da völlig unnötig.
> Die Sekunde werde ich einfach> mit einer Stoppuhr halbwegs hinbekommen,
Wozu denn so umständlich rumprobieren?
Laß es doch auch den Compiler ausrechnen.
Entweder vom gleichen Timer die Interrupts zählen oder nen 2. Timer
nehmen.
Peter
Nochmals Danke für die Antworten!
Ich werde es über die Methode des integrierten Timers probieren, und
sollte das nicht klappen (Aus Gründen meiner Unfähigkeit beim
Programmieren oder sonstigem), werde ich das Ganze wirklich mittels
probieren machen. Mir ist sehr wohl bewusst das die elegantere und
weitaus unanfälligere Methode per Hardware funktioniert und diese auch
bevorzugt werden sollte, jedoch bin ich nicht der beste Programmierer,
und der Sound sollte eigentlich etwas nebensächliches bei meinem Projekt
sein.
Wie gesagt, ich werde es einfach mit dem integrierten Timer probieren,
Google befragen und Tutorials lesen, und sollte es nicht klappen
vielleicht noch einmal hier im Forum nachfragen.
mit freundlichen Grüßen
anfu
lies dich einfach mal ein, das ist einfacher als du denkst.
Noch ein Problem: Compilerwechsel, update dasselben, verändertes
memory-Modell, ja, schon beliebige andere Änderungen im Programm, die
scheinbar mit deinem Ton gar nichts zu haben, können dein Timing
verändern. Wirklich nicht zu empfehlen.