Forum: Mikrocontroller und Digitale Elektronik Schleifengeschwindigkeit Atmega32


von anfu (Gast)


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!

von Sven P. (Gast)


Lesenswert?

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.

von anfu (Gast)


Lesenswert?

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.

von Rudolph R. (rudolph)


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.

von Matthias L. (Gast)


Lesenswert?

>wie vorgegangen werden müsste,

Das ist schon falsch.
Für sowas nimmt man Timer. Am besten als clear-compare-match Mode laufen 
lassen.

von Peter (Gast)


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.

von Peter (Gast)


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.

von Rudolph R. (rudolph)


Lesenswert?

Peter wrote:
> => Ein 10 kHz Rechteck erzeugt sehr wohl auch ein 10 kHz Ton
>    (was sonst?)

Richtig, "auch", aber eben nicht nur.

von anfu (Gast)


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.

von Matthias L. (matze88)


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.

von Peter D. (peda)


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

von anfu (Gast)


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

von crazy horse (Gast)


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.

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.