ATtiny45, Ton erzeugen mit analogWrite

#3250988
Lesenswert?

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

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

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

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

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

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

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

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

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

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

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