Hallo,
ich programmiere einen ATtiny über Arduino ISP (buuuh).
Dabei möchte ich ganz einfach über
1
digitalWrite(speakerPin, 255);
2
delayMicroseconds(tone);
3
digitalWrite(speakerPin, 0);
4
delayMicroseconds(tone);
einen Ton erzeugen.
Eigentlich funktioniert das auch.
Wenn ich jetzt aber über
1
for (int i=0; i<500; i++) {
2
analogWrite(AUDIO, 255);
3
delayMicroseconds(i);
4
analogWrite(AUDIO, 0);
5
delayMicroseconds(i);
6
}
7
}
die Tonhöhe über eine Schleife verändern möchte, oder anderen Code
hinzufüge, kommt nur noch Tack, Tack, Tack aus dem Lautsprecher.
Den Lautsprecher habe ich an Pin 0 angeschlossen.
Ziel ist, einen kleinen "Synthesizer" zu basteln, un den Ton über 2
Potis und zwwei Schalter zu verändern.
Hat jemand eine Idee, warum ich bei 'komplizierterem' Code den
eigentlichen Ton nicht mehr höre?
Viele Dank.
Weil dein analogWire eben nicht wirklich analog ist, sondern den Umweg
über eine PWM gehen muss (von der keiner weiß, wie hoch die PWM Frequenz
dafür von den Arduino Entwicklern gewählt wurde)
Das funktioniert bei einigermassen langsamen Spannungsänderungen, aber
schnelle Spannungsverläufe kriegst da damit mit Arduino Mitteln nun mal
nicht hin.
Kai Lemcke schrieb:> for (int i=0; i<500; i++) {> analogWrite(AUDIO, 255);> delayMicroseconds(i);> analogWrite(AUDIO, 0);> delayMicroseconds(i);> }> }
Kenn die Arduino Libs nicht... aber
Du schriebst analogWrite(AUDIO, 255);
und wartest dann für i microsekunden.
Dein i ist aber 0 zu dem Zeitunkt.
und schon kommt der nächste wert und wieder nur 0 Mikrosekunden warten.
Wenn die Schleife dann Irgentwann mal durch st wartest du immerhin 255
Mikrosekunden...
was immer noch nicht viel ist um einen ton auch wahrzunehmen und nicht
nur ein schaltknacken zu hören.
Karl Heinz Buchegger schrieb:> Weil dein analogWire eben nicht wirklich analog ist, sondern den Umweg> über eine PWM gehen muss (von der keiner weiß, wie hoch die PWM Frequenz> dafür von den Arduino Entwicklern gewählt wurde)> Das funktioniert bei einigermassen langsamen Spannungsänderungen, aber> schnelle Spannungsverläufe kriegst da damit mit Arduino Mitteln nun mal> nicht hin.
Hallo Karl Heinz, vielen Dank für die Antwort.
Was glaubst Du denn wie hoch die PWM Frequenz sein muss, um
schnelle Spannungsverläufe hinzukriegen. Vielleicht kann ich die ja noch
hochsetzen.
Muss ich wohl doch einen "dickeren" Chip nehmen.
Martin schrieb:> Kai Lemcke schrieb:>> for (int i=0; i<500; i++) {>> analogWrite(AUDIO, 255);>> delayMicroseconds(i);>> analogWrite(AUDIO, 0);>> delayMicroseconds(i);>> }>> }>>> Kenn die Arduino Libs nicht... aber> Du schriebst analogWrite(AUDIO, 255);> und wartest dann für i microsekunden.> Dein i ist aber 0 zu dem Zeitunkt.>> und schon kommt der nächste wert und wieder nur 0 Mikrosekunden warten.> Wenn die Schleife dann Irgentwann mal durch st wartest du immerhin 255> Mikrosekunden...> was immer noch nicht viel ist um einen ton auch wahrzunehmen und nicht> nur ein schaltknacken zu hören.
Hallo Martin, Danke für Deine Antwort.
Das sollte schon funktionieren, und das macht es ja auch mit dem
einfachen code. i bestimmt die Tonhöhe, Die Werte 255 und 0 beim
analogWrite bestimmt die Lautstärke über PWM.
Ich erwarte einen in der Frequenz absteigenden Ton.
Den habe ich auch schon gehört, allerdings nur als ich die Leitungen für
die ISP auch am Chip hatte.
Du wirst aber trotzdem nichts hören.
Der berühmte Kammerton A hat eie Frequenz von 440Hz.
440Hz bedeutet, dass eine Schwingung 1/f gleich 2.2 Millisekunden lang
ist. Dein Delay müsste dann 1.1 MILLI-Sekunden sein. Nicht
Mikrosekunden! Eine Mikrosekunde ist 1/1000 Millisekunde. d.h. 1000 mal
so kurz, oder eben in der Freuqenz 1000 mal so schnell. Anstatt 440Hz
hast du dann 440kHz. Und das hörst du mit Sicherheit nicht mehr. Das
hört nicht mal mehr dein Hund oder eine Fledermaus.
Also erst mal runter mit der Frequenz. Mit etwas Glück ist die PWM
Frequenz hoch genug, dass das noch einigermassen in Spannungen umgesetzt
werden kann.
Hast du bemerkt, dass im ersten Code digitalWrite steht, aber im zweiten
Code analogWrite?
Mit digitalWrite geht das gut, gibt aber immer einen Rechteckton.
Mit analogWrite wird eine PWM erzeugt, deren Frequenz irgendwo in der
Nähe von 1 kHz ist - damit wird dir kein Ton variabler Frequenz
gelingen.
Karl Heinz Buchegger schrieb:> Du wirst aber trotzdem nichts hören.> Der berühmte Kammerton A hat eie Frequenz von 440Hz.> 440Hz bedeutet, dass eine Schwingung 1/f gleich 2.2 Millisekunden lang> ist. Dein Delay müsste dann 1.1 MILLI-Sekunden sein. Nicht> Mikrosekunden! Eine Mikrosekunde ist 1/1000 Millisekunde. d.h. 1000 mal> so kurz, oder eben in der Freuqenz 1000 mal so schnell. Anstatt 440Hz> hast du dann 440kHz. Und das hörst du mit Sicherheit nicht mehr. Das> hört nicht mal mehr dein Hund oder eine Fledermaus.>> Also erst mal runter mit der Frequenz. Mit etwas Glück ist die PWM> Frequenz hoch genug, dass das noch einigermassen in Spannungen umgesetzt> werden kann.
Au man, Karl Heinz, du erklärst das immer so toll und einfach.
Hab das gerade gelesen und wäre so auf Anhieb nicht darauf gekommen.
Auch wenn es mich nicht betrifft, vielen Dank für deine immer wieder
tollen Ausführungen.
Schön, dass es dich hier gibt. Da kann ich immer wieder was für mich
mitnehmen.
Pink Shell schrieb:> Mit analogWrite wird eine PWM erzeugt, deren Frequenz irgendwo in der> Nähe von 1 kHz ist - damit wird dir kein Ton variabler Frequenz> gelingen.
Womit dann auch diese Hoffnung ....
> Mit etwas Glück ist die PWM Frequenz hoch genug, dass das noch> einigermassen in Spannungen umgesetzt werden kann.
... gestorben ist.
Pink Shell schrieb:> Mit analogWrite wird eine PWM erzeugt, deren Frequenz irgendwo in der> Nähe von 1 kHz ist - damit wird dir kein Ton variabler Frequenz> gelingen.
analogWrite(AUDIO, 255) ~ digitalWrite(1)
analogWrite(AUDIO, 0) ~ digitalWrite(0)
Hallo, vielen Danke für Eure Hilfe,
werde mal noch ein bißchen herumprobieren.
Der tone() Befehl funktioniert meines Wissens nach bei dem Attiny45
nicht.
Kai Lemcke schrieb:> Hallo, vielen Danke für Eure Hilfe,> werde mal noch ein bißchen herumprobieren.> Der tone() Befehl funktioniert meines Wissens nach bei dem Attiny45> nicht.
Wieso nicht?
Markus schrieb:> Kai Lemcke schrieb:>> Der tone() Befehl funktioniert meines Wissens nach bei dem Attiny45>> nicht.>> Dies> http://lizastark.com/thesis/2011/12/attiny85-initial-tests-tone-function-support/> respektive http://arduino.cc/forum/index.php/topic,61607.0.html> hilft vermutlich weiter.
Hallo Markus,
vielen Dank für die Links.
wie im ersten link beschrieben programmiere ich meinen tiny45.
Der Inhalt des zweiten links ist von 2011, deshalb habe ich mir
gedacht, dass tone inzwischen doch schon in dem "core" drin ist.
Jetzt hat das Ding tatsächlich nicht gemeckert beim Überprüfen des codes
mit tone(SPEAKER, 440) und tatsächlich auch herumgepiept (komischerweise
kein Dauerton, obwohl ich keine Duration angegeben habe).
Jetzt sagt es aber keinen Mucks mehr....
Ich werde noch wahnsinnig! Tinys scheinen empfindliche Wesen zu sein ...
Kai Lemcke schrieb:> Ich werde noch wahnsinnig! Tinys scheinen empfindliche Wesen zu sein ...
Ich sperre diese heimtückischen Biester auch immer in eine extra starke
Kiste. :-)
Hi
>Ich werde noch wahnsinnig! Tinys scheinen empfindliche Wesen zu sein ...
Nur wenn man sie schief von der Seite ansieht. Ansonsten sind die, Gott
sei Dank, genau so robust wie die anderen AVRs auch.
MfG Spess
Hallo,
ich konnte mein seltsames Problem jetzt lösen.
Es war das ... Netzteil.
Ich habe ein einfaches Tisch-Netzteil von profitec, Modell sds8041
verwendet.
Alternativ habe ich mal zwei 1,5 Volt Batterien versucht. Und siehe da,
ein Ton ist zu hören.
Jetzt habe ich meinem Netzeil noch einen 3300µF Kondensator gegönnt,
einfach auf dem Breadboard zwischen + und -: Auch ein Ton zu hören.
Die tone-Funktion habe ich auch auf dem ATiny45 zum Laufen gebracht.
Grüße,
Kai
Markus schrieb:> Supper.> Und ich finde es toll, dass du hier noch eine Rückmeldung gibst.> (Ist ja leider oft nicht so der Fall)
Ja, das finde ich auch toll.