Schleifengeschwindigkeit Atmega32

Gast #977979
Lesenswert?

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!
#977997
Lesenswert?

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.
Gast #978003
Lesenswert?

=> 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.
Gast #978005
Lesenswert?

=> 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.
Gast #978034
Lesenswert?

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.
#978232
Lesenswert?

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.
#978297
Lesenswert?

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
Gast #978494
Lesenswert?

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
Gast #978592
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren