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.
>wie vorgegangen werden müsste,
Das ist schon falsch.
Für sowas nimmt man Timer. Am besten als clear-compare-match Mode laufen
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.
Peter wrote: > => Ein 10 kHz Rechteck erzeugt sehr wohl auch ein 10 kHz Ton > (was sonst?) Richtig, "auch", aber eben nicht nur.
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.
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.