Forum: Mikrocontroller und Digitale Elektronik ATtiny45, Ton erzeugen mit analogWrite


von Kai L. (rostiger_e)


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.

von Karl H. (kbuchegg)


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.

von Martin (Gast)


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.

von Kai L. (rostiger_e)


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.

von Kai L. (rostiger_e)


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.

von Karl H. (kbuchegg)


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.

von Pink S. (pinkshell)


Lesenswert?

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.

von F. F. (foldi)


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.

von Karl H. (kbuchegg)


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.

von Karl (Gast)


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.

analogWrite(AUDIO, 255) ~ digitalWrite(1)

analogWrite(AUDIO, 0)   ~ digitalWrite(0)

von Markus (Gast)


Lesenswert?


von Thomas L. (thomas_hx)


Lesenswert?

Da war jemand schneller. Ein Blick in die Sprachreferenz ist in solchen 
Fällen manchmal ganz hilfreich.

von Kai L. (rostiger_e)


Lesenswert?

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.

von F. F. (foldi)


Lesenswert?

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?

von Markus (Gast)


Lesenswert?

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.

von Kai L. (rostiger_e)


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 ...

von F. F. (foldi)


Lesenswert?

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. :-)

von Spess53 (Gast)


Lesenswert?

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

von Kai L. (rostiger_e)


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

von F. F. (foldi)


Lesenswert?

Hartnäckigkeit wird irgendwann belohnt.
Gut gemacht! :-)

von Markus (Gast)


Lesenswert?

Supper.
Und ich finde es toll, dass du hier noch eine Rückmeldung gibst.
(Ist ja leider oft nicht so der Fall)

von F. F. (foldi)


Lesenswert?

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.

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.