www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schleifengeschwindigkeit Atmega32


Autor: anfu (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: anfu (Gast)
Datum:

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

Autor: Rudolph R. (rudolph)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

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

Autor: Rudolph R. (rudolph)
Datum:

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

Richtig, "auch", aber eben nicht nur.

Autor: anfu (Gast)
Datum:

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

Autor: Matthias Larisch (matze88)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: anfu (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

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.