Forum: Analoge Elektronik und Schaltungstechnik Alarmton/Buzzer-Dreiklang erzeugen


von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin auf der Suche nach einer Schaltung, die an einem passiven 
Mini-Piepser(„magnetic buzzer“) eine Art Dreiklang(varierenden Klang) 
erzeugt.
Die Versorgungsspannung liegt bei 2-5V.
Im besten Fall so simpel wie möglich und nur mit (wenigen) 
Standardteilen realisierbar.

Wahrscheinlich werde ich ums Experimentieren nicht herum kommen, aber 
vielleicht hat jemand einen Ansatz. Ich habe bereits schon die üblichen 
Standardschaltungen (zB. die mit zwei Transistoren) aufgebaut und damit 
erhält man nur einen konstanten Ton.


Viele Grüße
Alexander

von Uwe B. (uwe_beis)


Lesenswert?

Alexander H. schrieb:
> so simpel wie möglich und nur mit (wenigen) Standardteilen
... ist natürlich von deinen Kenntnissen und Möglichkeiten abhängig. Die 
µC-Fraktion wird zu einem Arduino o. Ä. greifen, diejenigen, die auch 
Hardware machen können, schaffen das mit einem 8-Pin µC + 
Treiber-Transistor, wer nur Röhren kennt macht's halt mit einem 
19"-Gestell mit Röhren.

Welche Technologien beherrscht du? Rein mit Transistoren würde zunächst 
ein "One-Hot-Zähler" (3 Transistoren, 3 Kondensatoren und 3 Widerstände) 
und dein astabiles Flip-Flop gebraucht, dazu vielleicht ein paar Dioden 
um Kondensatoren oder Widerstände im FF umzuschalten. Ich weiß aber 
nicht, ob es dabei bleibt.

Du meinst mit "Dreiklang(varierenden Klang)" drei Töne hintereinander, 
nicht gleichzeitig? Sozusagen Ding-Dang-Dong?

Nachtrag: Ich habe jetzt erst deinen Beep.mp3 bemerkt. Das scheint mir 
ja ein ziemlich komplexer Ablauf zu sein. Nix Ding-Dang-Dong. Ich kann 
noch nicht einmal erkennen, welche und wie viele Töne in welcher 
Reihenfolge abgespielt werden.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Uwe B. schrieb:
> Alexander H. schrieb:
>> so simpel wie möglich und nur mit (wenigen) Standardteilen
>
> ... ist natürlich von deinen Kenntnissen und Möglichkeiten abhängig. Die
> µC-Fraktion wird zu einem Arduino o. Ä. greifen, diejenigen, die auch
> Hardware machen können, schaffen das mit einem 8-Pin µC +
> Treiber-Transistor, wer nur Röhren kennt macht's halt mit einem
> 19"-Gestell mit Röhren.
> Welche Technologien beherrscht du? Rein mit Transistoren würde zunächst
> ein "One-Hot-Zähler" (3 Transistoren, 3 Kondensatoren und 3 Widerstände)
> und dein astabiles Flip-Flop gebraucht, dazu vielleicht ein paar Dioden
> um Kondensatoren oder Widerstände im FF umzuschalten. Ich weiß aber
> nicht, ob es dabei bleibt.
> Du meinst mit "Dreiklang(varierenden Klang)" drei Töne hintereinander,
> nicht gleichzeitig? Sozusagen Ding-Dang-Dong?

Diese Lösung würde ich bevorzugen. Es gibt einige Oszillatorschaltungen, 
die schon fast etwas ähnliches machen.
Es fehlt nur der Tonwechsel (in dem Fall sind es zwei Töne in sehr 
schneller Abfolge: Ton1>Ton2>Ton1).

Wahrscheinlich ist der Klang sehr abhängig von der Wellenform. Ich hab 
mal mit Audacity reingezoomt und gesehen, dass die Welle immer Kurz auf 
der X-Achse verweilt. Wie würde man das mit Standardteilen analog 
erzeugen?

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Wenn man sich den beep.mp3 deutlich verlangsamt anhoert, kann man 
draufkommen, dass das 6 Toene in 3 verschiedenen Tonhoehen sind, die da 
nacheinander abgespielt werden. Wo kommt das denn her? Sind das 
Lichtsprueche der Frogs, die die Orion aufgefangen hat?

Vor 40 Jahren haett ich da irgendwas mit einem CD4017 und fuer den 
Oszillator einen UJT 2N2646 hergenommen. Vor 45 JAhren vielleicht was 
mit nem SN7492 und SN7442...
Heute wuerd' ichs eher mit nem attiny13a aufbauen/nachprogrammieren.

Gruss
WK

von Cartman E. (cartmaneric)


Angehängte Dateien:

Lesenswert?

Das Ganze ist ein Sechsklang. Wie das Spektrum zeigt. ☺
Man wird wohl ca. ein Dutzend Transistoren brauchen, um es zu erzeugen.
Endstufe nicht mitgerechnet.

: Bearbeitet durch User
von Uwe B. (uwe_beis)


Lesenswert?

Ich habe es mir jetzt auch mit Audacity angesehen. Deine Bilder sagen 
herzlich wenig aus. Im wesentlichen sind es 3 Töne, die in 6 relativ 
gleich langen Abschnitten erscheinen (A-A-B-C-B-A), mit kleinen Pausen 
dazwischen, und wahrscheinlich von Störgeräuschen überlagert sind, und 
wegen eines schlechten Mikros auch noch unterschiedliche Amplituden 
haben.

Die Frage ist jetzt, wie genau soll es sein? Irgendwo zwischen irgendwas 
ähnlichem und einer genauen Kopie?

Wie gesagt (oder geschrieben): Drei Töne hintereinander müssten mit 3 
Transistoren für den Ablauf (oder z. B. 6 für 6 Töne oder 11 für 6 Töne 
und 5 zusätzliche Pausen) und zwei für den Oszillator machbar sein. Dazu 
eine Menge passive Bauteile und wohl auch Dioden.

Nicht analog: Mit einem 8-Pin µC, einem Transistor (und einem 
Stützkondensator), also mit 3 Bauteilen, wäre eine ganze Melodie 
möglich.

Mit Digitaltechnik würden es auch weniger Bauteile.

von Wastl (hartundweichware)


Lesenswert?

Uwe B. schrieb:
> Mit Digitaltechnik würden es auch weniger Bauteile.

Wenn es dann noch so analog klingen soll wie im Beispiel dann
bräuchte man noch ein paar Widerstände und Kondensatoren
zum Wegfiltern der Oberwellen.

von Cartman E. (cartmaneric)


Lesenswert?

Wastl schrieb:
> zum Wegfiltern der Oberwellen.

Ich glaub die Tröte die das verlautbaren wird, filtert schon genug.

von Uwe B. (uwe_beis)


Lesenswert?

Cartman E. schrieb:
> Ich glaub die Tröte die das verlautbaren wird, filtert schon genug.

Das erklärt auch den weitgehend dreiecksförmigen Verlauf des Signals und 
die geringeren Amplituden bei den höheren Frequenzen.

von Cartman E. (cartmaneric)


Lesenswert?

Uwe B. schrieb:
> Cartman E. schrieb:
>> Ich glaub die Tröte die das verlautbaren wird, filtert schon genug.
>
> Das erklärt auch den weitgehend dreiecksförmigen Verlauf des Signals und
> die geringeren Amplituden bei den höheren Frequenzen.

Eher eine Mischung aus Rechteck und ein wenig Sägezahn,
sagt das Epektrum.
Die 3. Oberwelle ist prominent vertreten. Es sind aber auch Anteile
einer 2. und 4. Oberwelle erkennbar. Die fünfte Oberwelle hat es
nur knapp ins Spektrum geschafft. ☺

Möglicherweise ist das Rechteck auch unsymmetrisch.

: Bearbeitet durch User
von Sabi (herr_flitzpiep)


Angehängte Dateien:

Lesenswert?

Ich tippe auf nicht ganz perfekten bzw. gut aufgenommenen Sägezahn.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Uwe B. schrieb:
> Ich habe es mir jetzt auch mit Audacity angesehen. Deine Bilder
> sagen herzlich wenig aus. Im wesentlichen sind es 3 Töne, die in 6
> relativ gleich langen Abschnitten erscheinen (A-A-B-C-B-A), mit kleinen
> Pausen dazwischen, und wahrscheinlich von Störgeräuschen überlagert
> sind, und wegen eines schlechten Mikros auch noch unterschiedliche
> Amplituden haben.
> Die Frage ist jetzt, wie genau soll es sein? Irgendwo zwischen irgendwas
> ähnlichem und einer genauen Kopie?
> Wie gesagt (oder geschrieben): Drei Töne hintereinander müssten mit 3
> Transistoren für den Ablauf (oder z. B. 6 für 6 Töne oder 11 für 6 Töne
> und 5 zusätzliche Pausen) und zwei für den Oszillator machbar sein. Dazu
> eine Menge passive Bauteile und wohl auch Dioden.
> Nicht analog: Mit einem 8-Pin µC, einem Transistor (und einem
> Stützkondensator), also mit 3 Bauteilen, wäre eine ganze Melodie
> möglich.
> Mit Digitaltechnik würden es auch weniger Bauteile.

Ok, dass es sogar sechs Töne sind, hatte ich nicht rausgehört.

Es muss nicht exakt gleich werden, aber ungefähr. Vielleicht kann man 
über Bauteilwerte noch nachjustieren.

Ich hatte mal eine Schaltung mit zwei Transistoren
http://embeddeddreams.com/site/2008/10/06/fun-and-easy-to-build-buzzer-circuit/
aufgebaut, und dann experimentell einen Kondensator hinzugefügt, damit 
war ein Zweiklang mit Pause dazwischen möglich.

Vielleicht gibt es ja eine trickreiche Oszillatorschaltung, die in etwa 
das macht?
Wäre der NE555 ein Möglichkeit?

Sabi schrieb:
> Ich tippe auf nicht ganz perfekten bzw. gut aufgenommenen
> Sägezahn.

Hatte ich mir auch schon überlegt, da viele Buzzer so ähnlich klingen.
Das würde die Tonerzeugung vielleicht ein bisschen einfacher machen, 
oder?

: Bearbeitet durch User
von Cartman E. (cartmaneric)


Lesenswert?

Alexander H. schrieb:
> Ok, dass es sogar sechs Töne sind, hatte ich nicht rausgehört.
Tja, siehste mal.

> Ich hatte mal experimentell eine Schaltung mit zwei Transistoren
> http://embeddeddreams.com/site/2008/10/06/fun-and-easy-to-build-buzzer-circuit/
> aufgebaut, und dann experimentell einen Kondensator hinzugefügt, damit
> war ein Zweiklang mit Pause dazwischen möglich.
Ein paar mehr Transistoren braucht es schon. Aber der Anfang ist
so schon nicht ganz falsch.

> Vielleicht gibt es ja eine trickreiche Oszillatorschaltung, die in etwa
> das macht?
Bestimmt.

> Wäre der NE555 ein Möglichkeit?
Der kann zwar Alles, aber nichts davon Richtig gut.
Besser nicht.

> Sabi schrieb:
>> Ich tippe auf nicht ganz perfekten bzw. gut aufgenommenen
>> Sägezahn.
Ein Sägezahn hat keine so starke 3. Oberwelle.

> Hatte ich mir auch schon überlegt, da viele Buzzer so ähnlich klingen.
> Das würde die Tonerzeugung vielleicht ein bisschen einfacher machen,
> oder?
Nicht wirklich.

von Uwe B. (uwe_beis)


Angehängte Dateien:

Lesenswert?

Die aufgenommene Signalform ergibt sich nur zufällig aus den 
Schallwandlern. dahinter steckt zweifellos immer ein Rechteck. Und es 
geht auch sicherlich nicht darum, den perfekten Sound nachzuahmen, also 
wenig Grund, über Oberwellen zu diskutieren.

Ich habe mal meine Idee aufgezeichnet. Drei verschiedene Töne 
hintereinander, gestartet durch eine Taste. Oder gestrichelt: 
Wiederholend. Alle Transistoren in der selben Grundschaltung. 
Tonhöhenunterschiede durch unterschiedliche Widerstände. Ein Treiber für 
den Wandler habe ich nicht gezeichnet. Für mehr Töne werden einfach 
zusätzliche Stufen eingefügt.

Ich bin nicht sich sicher, ob das auf Anhieb genau so klappt, aber viel 
dürfte nicht falsch sein.

Ich bin jetzt erst mal ein paar Stunden weg.

: Bearbeitet durch User
von Cartman E. (cartmaneric)


Lesenswert?

Uwe B. schrieb:
> Ich bin nicht sich sicher, ob das auf Anhieb genau so klappt, aber viel
> dürfte nicht falsch sein.
+1

Aber der Pausengenerator fehlt da noch. Oder umgekehrt, der
Generator für ein die Tonlänge bestimmendes Gate.
Das würde ebenso eine solche Zeitstufe wie für die Töne sein,
würde aber von jeder dieser Ton-Zeitstufen ausgelöst.
Womit wir beim geschätzten Dutzend wären.

> Ich bin jetzt erst mal ein paar Stunden weg.
Ich auch. ☺

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

Meiner Meinung nach sind die Töne wie folgt:

50ms Ton an, 20ms Pause
Tonfrequenz A: 2000Hz
Tonfrequenz B: 3200Hz

Die Sequenz ist: A,A,B,still,B,A
Das ganze dauert 6*70ms = 420ms

von Uwe B. (uwe_beis)


Lesenswert?

Cartman E. schrieb:
> Aber der Pausengenerator fehlt da noch.
Ich vermute sehr stark, dass es dem TO (Alexander) gar nicht um solche 
Details wie Pausen geht, vielleicht nicht einmal um genau diese 
Tonfolge, sondern nur um das Prinzip.

Den Aufwand für 6 Töne mit 5 Pausen nach dem von mir vorgeschlagenen, 
rein analogen Prinzip, hatte ich schon vorher beschrieben:
Uwe B. schrieb:
> Drei Töne hintereinander müssten mit 3
> Transistoren für den Ablauf (oder z. B. 6 für 6 Töne oder 11 für 6 Töne
> und 5 zusätzliche Pausen) und zwei für den Oszillator machbar sein. Dazu
> eine Menge passive Bauteile und wohl auch Dioden.
Blöd, dass ich das nicht gleich im Simulator gezeichnet habe. Dann hätte 
ich ruck-zuck gewusst, ob es so klappt, oder ob noch was geändert werden 
muss.

Christoph M. schrieb:
> Die Sequenz ist: A,A,B,still,B,A
Ich vernehme statt "still" einen sehr schwachen, dafür stark gestörten 
Ton mit etwas niedriger Frequenz als Ton B. Aber ob das Absicht oder nur 
eine Störung ist, und ob das überhaupt in irgendeiner Weise relevant 
ist, weiß ich nicht. Deswegen noch einmal @ Alexander:
Uwe B. schrieb:
> Die Frage ist jetzt, wie genau soll es sein? Irgendwo zwischen irgendwas
> ähnlichem und einer genauen Kopie?

von Alexander H. (alexander_h732)


Lesenswert?

Etwas Ähnliches reicht absolut aus.😉
Danke für Eure Expertisen bisher!

Unter „two tone oscillator“ findet man auch jede Menge Schaltungen, aber 
es ist schwierig, da was Passendes zu finden.

von Thomas B. (thombde)


Lesenswert?

Wenn man den IC noch beschaffen kann wäre das eine Lösung.
https://media.elv.com/file/2004_04_02_gs3.pdf

von Cartman E. (cartmaneric)


Lesenswert?

Alexander H. schrieb:
> Etwas Ähnliches reicht absolut aus.😉

Vermutlich wirst du schwer enttäuscht sein, wenn es nur ähnlich ist.
Das wäre etwa so, als wenn sich Bob Marley an "Smoke on the Water"
versuchen würde. ☺

Schönes Wochenende!

von Uwe B. (uwe_beis)


Lesenswert?

Alexander H. schrieb:
> Etwas Ähnliches reicht absolut aus.
Ich finde es schade, dass du zwar mit etwas Ähnlichem zufrieden bist, 
aber mit keiner Silbe kommentierst, ob dir an meinem Schaltungsvorschlag 
etwas nicht gefällt oder passt, oder ob es zu aufwändig ist, sich falsch 
verhält, oder ob der Vorschlag aus irgend einem weiteren Grund doch 
nicht als "etwas Ähnliches" zählt.

Wenn es daran liegt, dass du die Schaltung und die Verhaltensweise 
(noch) nicht verstehst, kann ich beides erklären, und auch die 
Möglichkeiten, die man mit Modifikationen hat. Allerdings nicht 
schriftlich - das würde mir dann doch zu aufwändig.

von Alexander H. (alexander_h732)


Lesenswert?

Uwe B. schrieb:
> Alexander H. schrieb:
>> Etwas Ähnliches reicht absolut aus.
>
> Ich finde es schade, dass du zwar mit etwas Ähnlichem zufrieden bist,
> aber mit keiner Silbe kommentierst, ob dir an meinem Schaltungsvorschlag
> etwas nicht gefällt oder passt, oder ob es zu aufwändig ist, sich falsch
> verhält, oder ob der Vorschlag aus irgend einem weiteren Grund doch
> nicht als "etwas Ähnliches" zählt.
> Wenn es daran liegt, dass du die Schaltung und die Verhaltensweise
> (noch) nicht verstehst, kann ich beides erklären, und auch die
> Möglichkeiten, die man mit Modifikationen hat. Allerdings nicht
> schriftlich - das würde mir dann doch zu aufwändig.


Danke für den super Vorschlag!
Ich befürchte, da ich nur ganz wenig Platz für den Aufbau habe, würde 
das Ganze auch in SMD platzmässig knapp.
Wenn ich alle Teile (insbesondere Widerstände) zusammenbekomme, werde 
ich es interessehalber zumindest mal aufbauen. Analoge Tonerzeugung ist 
ziemlich cool und vielleicht nutze ich deine Schaltung im nächsten 
Projekt (wo Platz keine Rolle spielt).

Also nochmal zu den Anforderungen:
ein dem „Beep“ ähnliche Tonfolge mit dem gleichen Frequenzbereich 
reicht.
Die Pausen müssen auch nicht exakt stimmen.
Es sollte ähnlich klingen, also kein reiner Sinus (wohl eher Sägezahn).

Ich hab den Abend damit verbracht und die Schaltung aus obigem Link 
etwas abgeändert (hauptsächlich Cs eingefügt). Es geht schon ein 
bisschen  in die richtige Richtung und man hört eine Tonfolge statt 
einem gleichförmigen Ton. Die Trennung zwischen den Tönen müsste nur 
noch schärfer werden. Werde die Schaltung morgen nachreichen.

von Uwe B. (uwe_beis)


Lesenswert?

Du hast es aufgebaut und es funktioniert prinzipiell? Das würde mich 
freuen. In der Schaltung sind keine Pausen zwischen den Tönen 
vorgesehen. Die lassen sich einfach mit weiteren Stufen in der 
"Steuerkette" erzeugen, bei denen die Reihenschaltung der Widerstände 
und Dioden entfällt. Dann bleibt der Oszillator stehen. Allerdings ist 
ist zu erwarten, dass der Anlauf des folgenden Tons nicht ganz sauber 
ist. Aber vielleicht "ausreichend ähnlich".

Hättest du vorher geschrieben, dass nicht nur "Analogtechnik", sondern 
auch Platzbedarf bzw. Anzahl der Bauelemente ein wichtiges Kriterium 
ist, hätte ich den Vorschlag nicht gemacht. Zumal die Frage nach Pausen 
und ggf. mehr Tönen noch einmal zu einem erheblich größeren Aufwand 
führt.

Digital wäre das mit wenigen CMOS-ICs erschlagen. Ich vermute, für bis 
zu 5 Töne incl. 4 Pausen ungefähr 2 x '4046 (Takt und VCO) und 1 x '4017 
(Statuszähler) + ~10 Widerstände (+ Dioden?) und 2 Kondensatoren.

Noch weniger Platzbedarf: 1 µC mit 8 Pins: Nahezu beliebig viele Töne 
und Pausen. Fertig.

In allen Schaltungen kommt noch der Treiber und die Stromversorgung 
hinzu.

von Christoph M. (mchris)


Angehängte Dateien:

Lesenswert?

Da wir ja im MC-Netz sind, könnte man es glatt mit einem Microcontroller 
machen.
Im Anhang mal die Version mit pipico2.
Wer es ausprobieren will: Taste auf pipico drücken und u2f-File auf das 
Laufwerk schieben.
Der Ton kommt an Pin 19.
Er ist mit einem RC-Tiefpassfilter direkt mit der Soundkarte gesampelt.

Was ich beim Experimentieren festgestellt habe: im Lautsprecher mit 
Verstärker hört sich der Ton relativ gut an, aber mit dem Piezo, mit dem 
ich es ausprobiert habe, hat ziemlich starke Resonanzen, deshalb ist die 
Lautstärke der beiden Tonfrequenzen extrem unterschiedlich.

von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Uwe B. schrieb:
> Die aufgenommene Signalform ergibt sich nur zufällig aus den
> Schallwandlern. dahinter steckt zweifellos immer ein Rechteck. Und es
> geht auch sicherlich nicht darum, den perfekten Sound nachzuahmen, also
> wenig Grund, über Oberwellen zu diskutieren.
> Ich habe mal meine Idee aufgezeichnet. Drei verschiedene Töne
> hintereinander, gestartet durch eine Taste. Oder gestrichelt:
> Wiederholend. Alle Transistoren in der selben Grundschaltung.
> Tonhöhenunterschiede durch unterschiedliche Widerstände. Ein Treiber für
> den Wandler habe ich nicht gezeichnet. Für mehr Töne werden einfach
> zusätzliche Stufen eingefügt.
> Ich bin nicht sich sicher, ob das auf Anhieb genau so klappt, aber viel
> dürfte nicht falsch sein.
> Ich bin jetzt erst mal ein paar Stunden weg.

So, hab das Ganze mal versucht aufzubauen.
Die Schaltung läuft noch nicht so recht, wahrscheinlich hab ich einen 
Fehler drin. Beim Anklemmen sehe ich ein 40Khz Rechteck, beim Drücken 
der Taste ein 50khz Rechteck.

Ich war mir aber auch nicht sicher, was für Potis und Kondensatoren ich 
verwende sollte.
Wie zu erwarten gab die Bastelkiste auch keine 100k und 10k her, hab 
daher 180k und 6,8k genommen.😂😊

Die wichtigste Frage: wo muss der Buzzer eigentlich korrekt 
abgeschlossen werden, oder geht ein direkter Betrieb garnicht?

Potis 3x 1,2k
Kondensatoren 5x 100nF

Viele Grüße
Alexander

: Bearbeitet durch User
von Uwe B. (uwe_beis)


Lesenswert?

Hallo Alexander,
da fehlt dir die Kenntnis darüber, wie die Schaltung funktioniert, was 
da passiert. Gravierender Fehler: Die 3 "Steuerstufen" sollen 
Zeitkonstanten im Bereich von einigen 100 ms haben, der Oszillator im 
Bereich von einigen 100 µs. Die ersten 3 Kondensatoren müssen sich also 
größenordnungsmäßig die 1000-fache Kapazität wie die anderen beiden 
haben.

Wenn du willst, kann ich dir erklären, was in der Schaltung passiert. 
Nur nicht hier, nicht schriftlich. Wenn du schon 1,2k-Potis (das glaube 
ich nicht, wo gibt's die denn???) für die Tonhöhen-Einstellung hast, 
kann man die Schaltung auch eleganter machen: Sie können die 
1k-Kollektor-Widerstände ersetzen und die Widerstände in Reihe mit den 
Dioden würden entfallen. Ferner hatte ich geschrieben, dass ich selber 
nicht sicher bin, dass nicht doch die eine oder andere Kleinigkeit 
anders sein muss. Insbesondere hatte ich den Verdacht, dass eine 
Kapazität an der Tonsteuer-Leitung erforderlich sein könnte, allerdings 
würde die wiederum bei der eben beschriebenen Schaltungsänderung mit den 
Potis entfallen.

Da bei dir Frequenzen von ~50 kHz entstehen, sind die von dir 
angegebenen C-Werte sicherlich falsch. Wahrscheinlich hast du, zumindest 
im Oszillator, 100 pF statt 100 nF eingesetzt.

Alles das würde ich selber simulieren, um die Funktionsfähigkeit der 
Schaltung zu untersuchen und vernünftige Werte für die Widerstände und 
Kondensatoren zu ermitteln, bevor ich sie aufbaue.

Dass eine weitere Treiberstufe für den Buzzer erforderlich sein wird, 
hatte ich auch schon geschrieben.

Viel Erfolg!

von Otto K. (opto_pussy)


Angehängte Dateien:

Lesenswert?

Christoph M. schrieb:
> Meiner Meinung nach sind die Töne wie folgt:
> 50ms Ton an, 20ms Pause

Das erinnert mich an die Tonfolge von der Telekom Werbung, die hört sich 
nämlich so an:

di-di-di-DA-di


https://youtu.be/DDqdk_h2Pvo?si=UqAiQA16n7_uyIDK


Um die Wirksamkeit und den Kontrast zwischen den einzelnen Tönen 
hervorzuheben, wurde immer ein Abstand von 134 Millisekunden dazwischen 
gebaut. Das kann man sehr gut mit einem CD4017 nachbauen. Wie man einen 
CD4017 startet und resettet, kann man in einem Schaltplan sehen, den 
Herr Hinz und Falk Brunner vor einiger Zeit in einem anderen Thread 
dargestellt haben. Den finde ich jetzt aber leider nicht mehr.

Die ungeraden Ausgänge Q1, Q3, Q5 und Q7 vom CD4017 werden nicht 
beschaltet, dadurch entstehen die nötigen Pausen zwischen den Tönen. An 
Q9 wird eine Diode zum Reseteingang gelegt. Als Taktgeber für den 
Clockeingang könnte man hier tatsächlich den NE555 mit einer Frequenz 
von 7,5 Hz verwenden.

: Bearbeitet durch User
von Jonny O. (-geo-)


Lesenswert?

Hi,

ich denke das Ganze schreit gradezu förmlich nach einem kleinen ATtiny 
Microcontroller und einem Transistor (wenn überhaupt nötig). Also ein 
8-pinniges SMD-Gehäuse (µC) + SMD-Cap (Stützcap) + Widerstand + 
Transistor.

Ich würde das ehrlich gesagt niemals diskret aus Logik-ICs 
zusammenbauen. Mir wäre das viel zu viel Aufwand :-)

Was genau möchtest Du denn damit machen? Geht es dir eher um Löten 
lernen, Logic-ICs kennenlernen, oder interessiert dich auch das 
Programmieren?

lg

von Alexander H. (alexander_h732)


Lesenswert?

Hallo,

also die Idee mit CD4017 ist genial!
Ich werde das auch mal aufbauen.
Die Ähnlichkeit zum Telekom Signaturklang ist da, das ist ja 
interessant.😉👍

Leider hab ich wirklich extrem wenig Platz (10x6mm).
Und das Ganze sollte mit 10mA/3V auskommen.

Da wird leider fast alles zu groß.
Hab mittlerweile mit viel Probierei eine Analog-Oszillator Variante 
aufgebaut, die an ein Telefonklingeln erinnert.
Immer noch nicht so richtig das, was ich suche, aber momentan das Beste 
bisher.
Zwischenzeitlich hatte ich sogar eine „Warbling Siren“ mit PUT 
aufgebaut.
https://www.eleccircuit.com/warbling-alarm-circuit-with-tone-generator/
Den PUT habe ich mittels NPN+PNP gebastelt. Das hörte sich gut an, aber
eben auch eher langweilig.
Teilweise kommt dann noch eine Temperaturempfindlichkeit dazu…😂


Den Ton für den Attiny würde man dann (wie oben von Christoph 
vorgeschlagen) per Software umwandeln und dann programmieren?
Ich schalte meinen Ton mit 1Hz über einen anderen uC ein. Wäre denn der 
Attiny überhaupt so schnell?

Gibt es evtl. irgendwelche Spezial-ICs für den Zweck?

von Cartman E. (cartmaneric)


Lesenswert?

Alexander H. schrieb:

> Leider hab ich wirklich extrem wenig Platz (10x6mm).
> Und das Ganze sollte mit 10mA/3V auskommen.

Doch so wenig Platz. Wenn es so eng ist, dann greif zu einem
Controller in einem BGA16 Gehäuse. Da bleibt dann sogar noch
reichlich Luft.

> Den Ton für den Attiny würde man dann (wie oben von Christoph
> vorgeschlagen) per Software umwandeln und dann programmieren?
> Ich schalte meinen Ton mit 1Hz über einen anderen uC ein. Wäre denn der
> Attiny überhaupt so schnell?

Den Attiny gibt es m.W. nicht in BGA16.
Aber schnell genug sind eigentlich alle.

> Gibt es evtl. irgendwelche Spezial-ICs für den Zweck?

Von Holtek und Princeton Technology ganz bestimmt.

von Joachim B. (jar)


Lesenswert?

https://forum.arduino.cc/t/pwm-with-attiny85/182466
https://www.arrow.com/en/research-and-events/articles/programming-attiny85-with-arduino

Alexander H. schrieb:
> Leider hab ich wirklich extrem wenig Platz (10x6mm).
> Und das Ganze sollte mit 10mA/3V auskommen.

ich lese
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2586-AVR-8-bit-Microcontroller-ATtiny25-ATtiny45-ATtiny85_Datasheet-Summary.pdf

Seite 18/30
Unit of Measure = mm
E 4.00 BSC

mit Pinabstand 0.5mm kommt 4mm x 4mm hin sollte doch auf 10x6mm passen

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Alexander H. schrieb:
> Leider hab ich wirklich extrem wenig Platz (10x6mm).
Dann biste mit deinen Einzeltransistorschaltungen oder gar 4017 sowieso 
voellig drueber. Also 5-8 fuessiger µContoller mit selbstgeschriebener 
Software ist da schon das Mittel der Wahl.

> Und das Ganze sollte mit 10mA/3V auskommen.
Da wirds auch langsam unrealistisch. Also bisschen hoehergeskillte Amper 
;-) sollte schon gehen. Alleine die "Audioendstufe" wird das schon 
locker brauchen, wenn du da einen "magnetic buzzer" anschliessen willst. 
Hoeren wirst du das ganze ja wahrscheinlich auch noch wollen. Vermutlich 
nicht nur in einem reflexionsarmen Raum, sondern in "normaler" Umwelt 
mit Hintergrundgeraeuschen...

Gruss
WK

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Alexander H. schrieb:
> Hallo,
>
> ich bin auf der Suche nach einer Schaltung, die an einem passiven
> Mini-Piepser(„magnetic buzzer“) eine Art Dreiklang(varierenden Klang)
> erzeugt.
...
> Viele Grüße
> Alexander

Das kann nicht funktionieren, systembedingt.

Ein Dreiklang ist so etwas wie ein Akkord. Also benutze mehrere Piepser.
Aber es wird trotzdem piepsig klingen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Leider hab ich wirklich extrem wenig Platz (10x6mm).
Wenn da in der nicht genannten Höhe nicht mindestens 50mm und 
beidseitige Bestückung mit kleinen 0402 Bauteilen möglich sind, dann 
bleibt realistisch betrachtet nur ein 6-Pin µC im SOT-Gehäuse über:
- 
https://www.mouser.de/c/semiconductors/embedded-processors-controllers/microcontrollers-mcu/8-bit-microcontrollers-mcu/?package%20%2F%20case=SOT-23-6

Das wäre auch von Anfang an mein Lösungsweg gewesen. Das nötige Programm 
passt locker und luftig auf 1 Bildschirmseite und besteht im Großen und 
Ganzen aus Delays.

Alexander H. schrieb:
> Leider hab ich wirklich extrem wenig Platz (10x6mm).
> Und das Ganze sollte mit 10mA/3V auskommen.
Scheiß Salamitaktik. Die Info zu dieser extremen Einschränkung hättest 
du gleich im allerersten Post geben müssen und nicht erst 4 Tage später.

: Bearbeitet durch Moderator
von Joachim B. (jar)


Lesenswert?

Lothar M. schrieb:
> Alexander H. schrieb:
>> Leider hab ich wirklich extrem wenig Platz (10x6mm).
>> Und das Ganze sollte mit 10mA/3V auskommen.
> Scheiß Salamitaktik. Die Info zu dieser extremen Einschränkung hättest
> du gleich im allerersten Post geben müssen und nicht erst 4 Tage später.

die Höhe ist doch nach seinen eigenen Angaben nicht begrenzt, also eine 
Adapterplatine vertikal einlöten ;-) oder ist das die nächste 
Salamischeibe?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Lothar M. schrieb:
> Das wäre auch von Anfang an mein Lösungsweg gewesen.
Heute in der Mittagspause kurz gemacht. Programm kommt morgen.

: Bearbeitet durch Moderator
von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Lothar M. schrieb:
> Lothar M. schrieb:
>> Das wäre auch von Anfang an mein Lösungsweg gewesen.
> Heute in der Mittagspause kurz gemacht. Programm kommt morgen.

Grässlich, das muss man nicht zeigen....

von J. T. (chaoskind)


Lesenswert?

Esmu P. schrieb:
> Lothar M. schrieb:
>> Lothar M. schrieb:
>>> Das wäre auch von Anfang an mein Lösungsweg gewesen.
>>
>> Heute in der Mittagspause kurz gemacht. Programm kommt morgen.
>
> Grässlich, das muss man nicht zeigen....

Also das klingt deutlich dichter am Original als alles was du so gezeigt 
hast.

Esmu P. schrieb:
> Das kann nicht funktionieren, systembedingt.
> Ein Dreiklang ist so etwas wie ein Akkord. Also benutze mehrere Piepser.
> Aber es wird trotzdem piepsig klingen.

Klar, ein Lautsprecher (nichts anderes ist so ein Minipiepser, wenn auch 
ein sehr schlechter, mit ausgeprägter Resonanz) kann ausschließlich 
reine Sinustöne abspielen. Wer kennt sie nicht, die Hifi-Zimmer die für 
jeden Oberton einen Lautsprecher haben.

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

J. T. schrieb:...
> Klar, ein Lautsprecher (nichts anderes ist so ein Minipiepser, wenn auch
> ein sehr schlechter, mit ausgeprägter Resonanz) kann ausschließlich
> reine Sinustöne abspielen. Wer kennt sie nicht, die Hifi-Zimmer die für
> jeden Oberton einen Lautsprecher haben.

Ist die Volks-Verblödung mittlerweile auch hier im Forum angekommen?

von J. T. (chaoskind)


Lesenswert?

Esmu P. schrieb:
> Ist die Volks-Verblödung mittlerweile auch hier im Forum angekommen?

Scheinbar schon, immerhin meinst du ja, es braucht mehrere Piepser für 
nen Mehrklang. Falls es dir entgangen sein sollte, der TO schrieb von 
passiven Piepsern, also solche die sich nicht mit Gleichspannung 
zufrieden geben um die Wechselspannung zum Piepsen intern zu erzeugen.

Und wer blödt ist neigt auch zum Meckern, da Blödheit Unverständnis 
erzeugt, und Unverständis wieder aggro macht.

Und mein lieber Scholli, bist du am Meckern. Merkst das eigentlich noch 
selbst oder denkst du, du gibst hiöfreiche und zielführende Tips?

von H. H. (hhinz)


Lesenswert?

Esmu P. schrieb:
> Ist die Volks-Verblödung mittlerweile auch hier im Forum angekommen?

Das war am 29.08.2016 10:05.

von Christoph M. (mchris)


Lesenswert?

Lothar M.
>Heute in der Mittagspause kurz gemacht. Programm kommt morgen.

Vielleicht ist es ja auch ganz einfach :-)

Es kompiliert, aber ob und wie es klingt habe ich nicht getestet.
1
// https://github.com/storbukas/ATtiny85
2
3
#define SPEADERPIN 0
4
5
void play(uint16_t f)
6
{
7
  tone(SPEADERPIN, f, 50);
8
  delay(20);
9
  noTone(SPEADERPIN);
10
}
11
12
void setup()
13
{
14
}
15
16
/*
17
  50ms Ton an, 20ms Pause
18
  Tonfrequenz A: 2000Hz
19
  Tonfrequenz B: 3200Hz
20
21
  Die Sequenz ist: A,A,B,still,B,A
22
  Das ganze dauert 6*70ms = 420ms
23
*/
24
uint16_t A = 2000;
25
uint16_t B = 3200;
26
27
void loop()
28
{
29
  play(A);
30
  play(A);
31
  play(B);
32
  delay(70);
33
  play(B);
34
  play(A);
35
  delay(1000);
36
}

: Bearbeitet durch User
von J. T. (chaoskind)


Lesenswert?

Christoph M. schrieb:
> #define SPEADERPIN 0

No offense, aber ist das nur ein konsequenter Vertipper oder sollte das 
ein Speakerpin werden?

Falls es kein Speakerpin sein sollte, was ist ein Speaderpin, bzw wofür 
steht es?

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

>No offense, aber ist das nur ein konsequenter Vertipper oder sollte das
>ein Speakerpin werden?

In diesem Bild würde ich den Pin PB5 als Index 0 interpretieren:
https://github.com/storbukas/ATtiny85/blob/main/resources/ATtiny85-Pin-Diagram-Simple.png

Ansonsten:
Dieser MC könnte klein genug sein:

https://www.heise.de/news/Kleinster-Mikrocontroller-hat-acht-Anschluesse-auf-1-38-Quadratmillimetern-10312469.html

: Bearbeitet durch User
von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

H. H. schrieb:
> Esmu P. schrieb:
>> Ist die Volks-Verblödung mittlerweile auch hier im Forum angekommen?
>
> Das war am 29.08.2016 10:05.

Benutzername           max707
Angemeldet seit   29.08.2016 10:05
Beiträge           1662

von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Lothar M. schrieb:
> Lothar M. schrieb:
>> Das wäre auch von Anfang an mein Lösungsweg gewesen.
>
> Heute in der Mittagspause kurz gemacht. Programm kommt morgen.

Das klingt richtig gut!
Der Attiny85 ist in TSSOP sehr klein, das passt dann locker. Außerdem 
funktioniert das Ganze dann sicher(ohne Temperaturabhängigkeit).

Ich hatte ursprünglich vor, zwei Töne (mit Jumper) umschaltbar zu 
machen.  Der eine Alarm/Sirenen-Ton war ja analog noch machbar, aber die 
komplexere Tonfolge ist wirklich ein Fall für einen Attiny. 👍😊

Wie geht man beim Erstellen der Töne vor? Vielleicht kriege ich den 
zweiten Ton noch selber hin.
Die Umschaltung mittels Steckbrücke müsste dann wohl auch noch im Attiny 
hinterlegt werden. Wie würde so etwas softwaremässig gemacht?

Was bräuchte ich noch an Beschaltung (Abblock-C, evtl. 
Treibertransistor?)

Es gibt ja die Varianten Attiny25/45/85, wieviel Speicher(Flash/Eprom) 
benötige ich mindestens?
Auf die Schnelle hab ich keinen Attiny85 in TSSOP finden können, aber 
einen ATtiny45.


Vielen Dank für die ganzen Ideen! 👍

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

Alexander H.
>Wie geht man beim Erstellen der Töne vor? Vielleicht kriege ich den
>zweiten Ton noch selber hin.

Du installierst dir die Arduino IDE und den Attiny85 Support von hier:

https://github.com/storbukas/ATtiny85

Dort findet sich auch ein Verdrahtungsplan zur Programmierung des 
Attiny85 mit einem Arduino Uno.

Im Beispielprogramm lassen sich die Töne leicht anpassen:
Beitrag "Re: Alarmton/Buzzer-Dreiklang erzeugen"

Vielleicht wird ist der Code so verständlicher:
1
void loop()
2
3
{
4
  play(2000); // spiele 2000Hz
5
  play(2000); // spiele 2000Hz
6
  play(3200); // spiele 3200Hz
7
  delay(70);  // 70 Millisekunden Ruhe
8
  play(3200); // usw.
9
  play(2000);
10
  delay(1000); // eine Sekunde Ruhe
11
}

Natürlich wäre das alles viel zu einfach. Um State-Of-The-Art zu sein, 
solltest du einen RISC-V Mikrocontroller verwenden und um es wirklich zu 
verstehen in RISC-V Assembler programmieren. Dazu solltest du dich etwas 
in die verschiedenen Risc-V Architekturen einarbeiten und die 
Compiler-Toolchain etwas genauer betrachten. Danach einfach das passende 
Make-File erstellen und den Treiber für den Programmieradapter geschickt 
installieren.  Debuggen lässt sich das ganze mit dem GDB, den sollte man 
in etwas weniger als einer Woche erlernen können.
Ich habe hier mal ein Beispiel für ein Blink-Programm mit System-Timer 
als Zeitbasis gemacht:
Beitrag "Re: RISCV (CH32V003): GNU Assembler übersetzt "CALL" nicht korrekt (oder bin ich nur zu doof?)"

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Wie geht man beim Erstellen der Töne vor?
Wie gesagt: im einfachsten Fall mit _delay().

Und dann sieht das Programm so aus:
1
#include <avr/io.h>
2
#define F_CPU 16000000L
3
#include <util/delay.h>
4
5
void A (void) {
6
  for(int i=0; i<100; i++) { // A: 2kHz, 50ms
7
    PORTB = 0x01;
8
    _delay_us(250);
9
    PORTB = 0x00;
10
    _delay_us(250);
11
  }
12
}
13
14
void B (void) {
15
  for(int i=0; i<160; i++) { // B: 3k2Hz, 50ms
16
    PORTB = 0x01;
17
    _delay_us(155);
18
    PORTB = 0x00;
19
    _delay_us(156);
20
  }
21
}
22
23
int main(void)
24
{
25
  DDRB = 0x01; // B0 = LED
26
  while(1)
27
  {
28
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
29
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
30
    A();
31
    _delay_ms(20);          // kurze Pause
32
    A();
33
    _delay_ms(20);          // kurze Pause
34
    B();
35
    _delay_ms(20);          // kurze Pause
36
    _delay_ms(50);          // still
37
    _delay_ms(20);          // kurze Pause
38
    B();
39
    _delay_ms(20);          // kurze Pause
40
    A();
41
        
42
    _delay_ms(3000); // wart mal ab...
43
  }                      
44
}
Man könnte sich sogar die Funktionen "sparen", dann wird das Ganze ein 
wenig länger. Wenn man eine Tonausgabe-Bibliothek nimmt, dann wird die 
Eigenleistung wie oben gezeigt noch deutlich geringer.

: Bearbeitet durch Moderator
von Axel R. (axlr)


Lesenswert?

Ich krieg immer Mecker, wenn ich Statusausgaben mitm Relais 
signalisiere. "Tütelüt", wenn gut und "NÖPNÖPNÖPNÖÖP" wenn schlecht.
Oder wenn man nen Stecker verkehrt ansteckt, gibts dann auch "Alarm". 
Man munkelt, die Relais machen das nicht lange mit.
Ich weiss mal garnicht, wo ich das eigentlich herhabe. Ausgedacht hab 
ich mir das nicht selbst. Also die Melodie dann schon, aber nicht das 
Framework. Hätte man ja die Credits mit angeben können.
Zum uC: ich nehm immer die kleinen ATTiny2313 im MLF Gehäuse für 
"sowas", wenn kein Platz ist. Wegen der UART und Bootloader. Man muss ja 
die Software irgendwie in den Drahtigel hineinbekommen.

-------------------------------------

Ha - kurz gesucht und gleich gefunden:
https://docs.arduino.cc/built-in-examples/digital/toneMelody/
1
#include "pitches.h"
2
3
// notes in the melody:
4
int melody[] = {
5
6
  NOTE_G3, NOTE_B3, NOTE_D4, NOTE_G3, NOTE_B3, NOTE_D4, NOTE_C4, NOTE_G3, NOTE_B3, NOTE_C4, NOTE_B3, NOTE_G3
7
};
8
9
// note durations: 4 = quarter note, 8 = eighth note, etc.:
10
int noteDurations[] = {
11
12
  4, 4, 2, 4, 4, 8, 2, 4, 4, 2, 4, 1
13
  //8, 8, 4, 8, 8, 16, 4, 8, 8, 4, 8, 2
14
};
15
16
void Play_MUSIC() {
17
  // iterate over the notes of the melody:
18
19
  for (int thisNote = 0; thisNote < 12; thisNote++) {
20
21
    // to calculate the note duration, take one second divided by the note type.
22
23
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
24
25
    int noteDuration = 800 / noteDurations[thisNote];
26
27
    tone(Relais_2, melody[thisNote] / 2, noteDuration);
28
    // to distinguish the notes, set a minimum time between them.
29
30
    // the note's duration + 30% seems to work well:
31
32
    int pauseBetweenNotes = noteDuration * 1.3;
33
34
    delay(pauseBetweenNotes);
35
36
    // stop the tone playing:
37
38
39
    noTone(Relais_2);
40
  }
41
}

in "pitches.h" stehen dann die Defines für die Notenwerte in gerundete 
Hertz
1
#define NOTE_B0  31
2
.
3
.
4
.
5
6
#define NOTE_AS7 3729
7
#define NOTE_B7  3951
8
#define NOTE_C8  4186
9
#define NOTE_CS8 4435
10
#define NOTE_D8  4699
11
#define NOTE_DS8 4978

: Bearbeitet durch Moderator
von Alexander H. (alexander_h732)


Lesenswert?

Wieviel Platz benötigt denn das Programm mit zwei Piepstönen ungefähr?
Dann könnte man abschätzen ob Attiny25/45 oder Attiny85 besser geeignet 
ist.
Der ATtiny85 hat doch alle Pins für ISP. Die Anschlüsse würde ich 
herausführen und dann per TL866 programmieren.

Da ich eine Batterieanwendung plane (2,8V), könnte ich entweder die 
Versionen ab >2,7V(20MHz) oder auch die Versionen <2,7V(10MHz) nutzen.
Ich müsste mich vorher festlegen, wegen der korrekten Wiedergabe des 
Tones, oder?

Der uC ist dann immer AN, bzw. müsste standardmäßig immer eingeschaltet 
sein? Wäre er normalerweise im sleep, könnte ich mir vorstellen, dass es 
Probleme geben könnte, denn der Ton soll ja mittels 1Hz Puls(lowside 
geschaltet) eingeschaltet werden.

Was wäre denn der ungefähre Stromverbrauch, bei immer eingeschaltetem 
uC(und würde sleep Vorteile im Stromverbrauch bringen?)?
Ich habe was von 300uA gelesen. Sollte der sleep-Modus mehr Nachteile 
bringen, verzichte ich lieber darauf.

von Cartman E. (cartmaneric)


Lesenswert?

Alexander H. schrieb:
> Wieviel Platz benötigt denn das Programm mit zwei Piepstönen ungefähr?
> Dann könnte man abschätzen ob Attiny25/45 oder Attiny85 besser geeignet
> ist.
Wenig.

> Was wäre denn der ungefähre Stromverbrauch, bei immer eingeschaltetem
> uC(und würde sleep Vorteile im Stromverbrauch bringen?)?
> Ich habe was von 300uA gelesen. Sollte der sleep-Modus mehr Nachteile
> bringen, verzichte ich lieber darauf.
Man kann den Controller ja aufwecken. ☺
Wirklich sparsame brauchen aber auch wenn das Programm läuft,
weniger als einige uA. Piepsen ist ja auch keine anspruchsvolle
Beschäftigung.

von Otto K. (opto_pussy)


Lesenswert?

Alexander H. schrieb:
> denn der Ton soll ja mittels 1Hz Puls(lowside geschaltet) eingeschaltet
> werden.

Du willst also die Versorgungsspannung für den ATtiny für eine Sekunde 
einschalten und innerhalb dieser Sekunde soll der ATtiny von selbst 
starten und seinen Sound einmal abspulen?

Dadurch sparst du natürlich einen Eingangs-Pin, der sonst zum Starten 
benötigt würde. Wichtig ist, dass du zwei Ausgänge hast, um den Piezo 
als Brücke schalten zu können, um damit die Lautstärke zu erhöhen, denn 
du hast ja nur 2,8 Volt.

von Alexander H. (alexander_h732)


Lesenswert?

Otto K. schrieb:
> Alexander H. schrieb:
>> denn der Ton soll ja mittels 1Hz Puls(lowside geschaltet) eingeschaltet
>> werden.
>
> Du willst also die Versorgungsspannung für den ATtiny für eine Sekunde
> einschalten und innerhalb dieser Sekunde soll der ATtiny von selbst
> starten und seinen Sound einmal abspulen?
> Dadurch sparst du natürlich einen Eingangs-Pin, der sonst zum Starten
> benötigt würde. Wichtig ist, dass du zwei Ausgänge hast, um den Piezo
> als Brücke schalten zu können, um damit die Lautstärke zu erhöhen, denn
> du hast ja nur 2,8 Volt.

Genau, ich schalte im 1Hz Takt lowside ein.
Ich müsste halt testen, dass nicht  ein Teil des Tons beim Einschalten 
verschluckt wird, aber wahrscheinlich geht das.
Alternativ könnte man auch den Attiny immer eingeschaltet lassen und per 
LOW-Signal einschalten?

Ok, die Brückenschaltung (besser als Treibertransistor?) spart dann 
sogar noch ein Bauteil. Es soll nicht sehr laut werden, aber gut hörbar.
Werde den ATtiny45(2,7-5,5V/TSSOP8) nutzen.

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

So ein Programm braucht kein Platz. Früher hatte ich für so was immer 
den Attiny13 verwendet (geht dann nur noch Bare-Bone wie von Lothar und 
nicht mehr mit dem Arduino Framework).
Die MCU läuft innerhalb von Millisekunden nach anlegen der 
Stromversorgung los.

von Otto K. (opto_pussy)


Lesenswert?

Alexander H. schrieb:
> Ok, die Brückenschaltung (besser als Treibertransistor?

Für einen Piezo-Lautsprecher ist die Brückenschaltung mit zwei Ausgängen 
besser. Und für einen 4 Ohm Lautsprecher ist die Transistor Treiberstufe 
besser.

von Alexander H. (alexander_h732)


Lesenswert?

Ich nutze keinen Piezo sondern einen kleinen „magnetic buzzer“(ca. 50 
Ohm Impedanz). Piezos haben wohl ca. >1M Ohm.
Also würde ich annehmen, in dem Fall ist vielleicht auch der Transistor 
besser?

von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Dann könnte man abschätzen ob Attiny25/45 oder Attiny85 besser geeignet
> ist.

Schau dir deren Einzelpreise an. Es gibt eigentlich keinen guten Grund, 
nicht den ATtiny85 zu nehmen.

Wenn du das dann noch 20x bauen musst, kannst du immer noch schauen, ob 
der kleinere reicht. Die Arduino IDE zeigt das ja an.

> Ich müsste mich vorher  (auf 10 oder 20 MHz) festlegen, wegen der korrekten 
Wiedergabe des Tones, oder?

8 MHz gehen mit jeder Spannung.

> Der uC ist dann immer AN (?)

Er kann schlafen, bis er Startsignal (pin cgange interript) kommt.

> Was wäre denn der ungefähre Stromverbrauch, bei immer eingeschaltetem uC

Das hängt fast linear an der gewählten Taktfrequenz, die man übrigens 
per Software wecgseln kann (clock prescaler). Schau ins Datenblatt! Im 
Sleep sind es jedenfalls unter 1 uA, soweit ich mich erinnere.

Du kannst zusätzlich zur Brückenschaltung jeweils zwei Ausgänge parallel 
schalten, um Verluste im IC zu reduzieren.

: Bearbeitet durch User
von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

https://www.eurohorns.de/PKW-12V-Hupen/Tourhupe-klassisch

Aber im Original klangen die doch noch ganz anders, oder?

Ist das nicht wieder ein digital Gedöns?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Otto K. schrieb:
> den Piezo
Es ist ein magnetischer Piepser wie im 1 Post

Alexander H. bereits schrieb:
> Mini-Piepser(„magnetic buzzer“)
Die sind üblicherweise auch unipolar angesteuert schon laut genug.

Alexander H. schrieb:
> Wieviel Platz benötigt denn das Programm mit zwei Piepstönen ungefähr?
Irgendwas unter 5%. Aber ich habe eben eine 400er Restrolle mit 
vorprogrammierten ATTiny85 hier rumliegen... ;-)

Wenn du sparen musst, koste es, was es wolle, dann würde ich aber den 
ATtiny9 empfehlen:
- 
https://www.mouser.de/ProductDetail/Microchip-Technology/ATTINY9-TSHR?qs=rBGENRD8NwJTK%2Fst6H6pMg%3D%3D

von Alexander H. (alexander_h732)


Lesenswert?

So, hab nun den Attiny45 da und bin gerade dabei, den uC mit Lackdraht 
zu verkabeln.

Bräuchte man dann zwingend die Arduino IDE bzw. das wäre wohl die 
Programmiersoftware der Wahl, oder?
Als Programmiergerät nutze ich den Tl866 (6-Pin ISP).

Hardwaremässig würde ich einen 100nF Entkoppel-Kondensator zwischen Vcc 
und GND(evtl. noch 10uF), einen(oder zwei?) Vorwiderstand in einer 
Leitung zum Lautsprecher, für die Lautstärke, sowie eine Freilaufdiode 
vorsehen.
Der Lautsprecher soll bipolar betrieben werden. Evtl. wird unipolarer 
Betrieb bzw. mit Treibertransistor getestet, je nach Stromverbrauch.

Wie genau definiere ich die Pins (Ausgang zum Lautsprecher, Umschaltung 
zwischen Ton 1/2)?
Das mit dem Aufwecken aus Sleep würde ich einfach weglassen, da ich ja 
auch nur simpel Einschalten kann.

Versuche mich gerade da einzulesen.😊😅

von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Bräuchte man dann zwingend die Arduino IDE bzw. das wäre wohl die
> Programmiersoftware der Wahl, oder?

Der Hersteller empfiehlt seine eigene IDE, das wäre das Microchip Studio 
und dazu die XC8 Toolchain, von der ich wenig halte.

Die Arduino IDE bietet einen erheblich leichteren Einstieg und 
untersützt mehr Programmieradapter. Deinen Tl866 aber vermutlich nicht. 
Für den brauchst du wohl zusätzliche Software.

Siehe http://stefanfrings.de/avr_ide/index.html

von Alexander H. (alexander_h732)


Lesenswert?

Ok, dachte eher ich kann mit der Arduino IDE eine .hex-file generieren 
und diese dann per TL866 über ISP aufspielen.
https://forum.arduino.cc/t/how-to-get-hex-file-from-arduino-files/128790/2

von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Ok, dachte eher ich kann mit der Arduino IDE eine .hex-file generieren
> und diese dann per TL866 über ISP aufspielen.

Ja, das meinte ich mit "zusätzliche Software".

Praktischer wäre natürlich, einen kompatiblen Programmieradapter zu 
verwenden, denn dann kann man direkt in der IDE per Mausklick hochladen.

von Nemopuk (nemopuk)


Lesenswert?


von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Alexander H. schrieb:

> Bräuchte man dann zwingend die Arduino IDE

Nein, natürlich nicht. Die würde bezüglich des Aufwands zum Flashen nur 
was bringen, wenn du Controller hast, auf denen der Arduino-Bootloader 
schon drauf ist. Ansonsten musst du ihn sleber erstmal draufbringen und 
das geht auch wieder nur über ISP.

> Der Lautsprecher soll bipolar betrieben werden. Evtl. wird unipolarer
> Betrieb bzw. mit Treibertransistor getestet, je nach Stromverbrauch.
>
> Wie genau definiere ich die Pins (Ausgang zum Lautsprecher, Umschaltung
> zwischen Ton 1/2)?
> Das mit dem Aufwecken aus Sleep würde ich einfach weglassen, da ich ja
> auch nur simpel Einschalten kann.
>
> Versuche mich gerade da einzulesen.😊😅

Dann lies vielleicht mal das hier:

Beitrag "Westminster Soundgenerator mit ATtiny85"

Da ist das alles schonmal gelöst. Da wird nur ein sehr viel komplexerer 
Klang abgespielt. Für dein bissel düdeldü könnte man das Programm ganz 
sicher ohne jedes Problem so weit abrüsten, dass es auch in einen Tiny45 
passt.

von Nemopuk (nemopuk)


Lesenswert?

Ob S. schrieb:
> Nein, natürlich nicht. Die würde bezüglich des Aufwands zum Flashen nur
> was bringen, wenn du Controller hast, auf denen der Arduino-Bootloader
> schon drauf ist. Ansonsten musst du ihn sleber erstmal draufbringen und
> das geht auch wieder nur über ISP.

Das liest sich so, als könnte die Arduino IDE nur mit Bootloader 
verwendet werden. Dem ist aber nicht so. Sie unterstützt wie gesagt auch 
einige ISP Programmieradapter.

Und man kann (wie Alexander vor hat) *.hex Dateien erzeugen, die mit 
beliebigen anderen ISP Programmieradaptern außerhalb der IDE in den Chip 
gebracht werden.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Nemopuk schrieb:
> Siehe http://stefanfrings.de/avr_ide/index.html

ist das wieder ein neuer Nick von dir Stefan?
Wen willst du mit deinen Kenntnissen eigentlich helfen?

von Nemopuk (nemopuk)


Lesenswert?

Wenn man nichts zum Thema beitragen kann: einfach mal die klappe halten. 
Stattdessen könntest du dich über den Dativ informieren.

von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Hallo,

bin gerade dabei den Attiny45 zu flashen bzw. überhaupt erst mal eine 
LED blinken zu lassen.😊
Scheinbar ist es für mich als Anfänger mit AVRisp mkII + AVRdude doch 
nicht ganz so simpel.

Gibt es eine Möglichkeit, per AVRdude den Inhalt des Flash auszulesen 
und sich das Ganze anzeigen zu lassen?
Beim Klicken auf „Read“ bzw. „Verify“ > „Program“ scheint alles zu 
passen.
Vielleicht müssen noch fuses eingestellt werden?

Ich wollte das hier testen:
https://www.arduinoslovakia.eu/blog/2017/12/attiny85---blik?lang=en

Grüne LED mit Vorwiderstand an PB0/GND angeschlossen, aber es passiert 
nichts. Das Programm sollte doch mit Anlegen von Spannung sofort 
loslaufen, oder?

von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Gibt es eine Möglichkeit, per AVRdude den Inhalt des Flash auszulesen
> und sich das Ganze anzeigen zu lassen?

Auslesen ja, anzeigen nein. Dabei käme nur ein Haufen Zahlen heraus, 
kein lesbarer Quelltext.

> Das Programm sollte doch mit Anlegen
> von Spannung sofort loslaufen, oder?

Ja. Wie hast du denn das "Board" in der IDE konfiguriert? Zeige mal alle 
Parameter.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Ich habe den Code exakt so übernommen/herauskopiert.
Hätte ich irgendetwas anpassen müssen?

von Nemopuk (nemopuk)


Lesenswert?

Es geht nicht um den Quelltext, sondern um die Board-Einstellungen in 
der IDE. Die müssen mit der Ziel-Hardware übereinstimmen.

von Alexander H. (alexander_h732)


Lesenswert?

Ok, daran wird es liegen. Wo und was müsste ich denn einstellen?
Die Arduino IDE fragt zB. nach einem Board. Richtet sich das Ergebnis 
der compilierten .hex dann danach?
Ich nutze ja kein Arduino board sondern den AVRisp.

von Manfred P. (pruckelfred)


Lesenswert?

Alexander H. schrieb:
> Die Arduino IDE fragt zB. nach einem Board. Richtet sich das Ergebnis
> der compilierten .hex dann danach?

Natürlich, es muß passend zum CPU-Typ compiliert werden.

Du müstest in den Board-Einstellungen genau Deinen AVR wählen. Ist der 
nicht da, muß er per Download nachgerüstet werden - ich hoffe, dass 
arduinoslovakia auch das beschrieben hat.

von Alexander H. (alexander_h732)


Lesenswert?

Es blinkt!👍
Hab es nach folgender Anleitung hinbekommen.😉
https://www.instructables.com/Program-an-ATtiny44458485-with-Arduino/

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Hab es nach folgender Anleitung hinbekommen.

Meinst du das?:
> Make sure you have the correct Board, Clock, and Processor selected under the 
Tools Menu for what you are using. Then hit upload.

: Bearbeitet durch User
von Manfred P. (pruckelfred)


Lesenswert?

Nemopuk schrieb:
> Meinst du das?:
>> Make sure you have the correct Board, Clock, and Processor selected under the
> Tools Menu for what you are using. Then hit upload.

Ich glaube eher, drei Schritte vorher "Step 3: Add Support for ATtiny"

von Alexander H. (alexander_h732)


Lesenswert?

Ja genau. Man muss in der Arduino IDE dann den Link 
(https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json) 
eingeben und dann hat man den Attiny45 mit drin.

Der Beep von Lothar hört sich sehr gut an! Wie erhofft legt der Attiny 
sofort bei Anlegen der Betriebsspannung los. Stromverbrauch nur 8,5mA.

Beim zweiten Beep bin ich mir unsicher. Ich sehe hauptsächlich drei 
Frequenzen, die parallel erklingen(95Hz, 200Hz und 750Hz). Anfangs sind 
die 95Hz lauter, am Ende dominieren die 750Hz.
Sollte ich das überhaupt richtig interpretiert haben🤔
Könnte man so eine Mischung von Frequenzen überhaupt in Software 
nachahmen?

: Bearbeitet durch User
von Otto K. (opto_pussy)


Angehängte Dateien:

Lesenswert?

Wenn man den BigTrak (ab 1980) fertig programmiert hatte, dann gab es 
immer diesen individuellen 7-tönigen Bestätigungssound:

du-ti-du-ti-du-ti-du

Diesen Sound könnte man nachmachen und mit doppelter Geschwindigkeit 
abspielen, dann hört er sich noch besser an. In dem Video hört man ihn 2 
mal, in Sekunde 27 und in Sekunde 49:

https://youtu.be/7zOCc145g88?si=XOUee7_0XHOqU_Ds

von Axel R. (axlr)


Lesenswert?

Alexander H. schrieb:
> Der Beep von Lothar hört sich sehr gut an!
Welche Firmware hast Du denn nun draufkopiert? den "Beep von Lothar"?
Kannst Du bitte nochmal drauf verlinken?

EDIT;
war nun doch besser, das mitm uC zu machen, als mit 12 Transistoren, 
oder?

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Moin,

Alexander H. schrieb:
> Beim zweiten Beep bin ich mir unsicher. Ich sehe hauptsächlich drei
> Frequenzen, die parallel erklingen(95Hz, 200Hz und 750Hz). Anfangs sind
> die 95Hz lauter, am Ende dominieren die 750Hz.
> Sollte ich das überhaupt richtig interpretiert haben🤔

der Beep2.mp3 hoert sich fuer mich an, wie ein Sweep. Faengt also mit 
einer tiefen Frequenz an und die erhoeht sich dann mit der Zeit. Klingt 
auch obertonreich, also koennte es wohl ein Saegezahn oder kurze Pulse 
sein.

> Könnte man so eine Mischung von Frequenzen überhaupt in Software
> nachahmen?
Warum sollte man das nicht koennen? Man kann so gut wie alles in 
Software nachahmen.

Gruss
WK

von Axel R. (axlr)


Lesenswert?

Beitrag "Re: Alarmton/Buzzer-Dreiklang erzeugen"
Wenn man jetzt hier noch den zweiten Pin als Ausgang definiert und 
"entgegenegesetzt" schaltet (am Ende der Tonausgabe beide auf "L" 
oder"H" oder als Eingang!), kann man den Piepser zwischen zwei Ausgänge 
"hängen". Oder man verwendet einen Auskoppel-Kondensator, damit nicht 
ständig Strom durch die Spule fließt. Auch würde ich zwei 
Doppel-Schottky an die Ausgangspins gegen GND und VCC schalten und einen 
kleinen Elko (100uF/6V3)parallel zur Betriebsspannung nicht einsparen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Axel R. schrieb:
> Auch würde ich zwei Doppel-Schottky an die Ausgangspins gegen GND und
> VCC schalten und einen kleinen Elko (100uF/6V3)parallel zur
> Betriebsspannung nicht einsparen.
Wenn von den Augangstransistoren der Gegentaktendstufe des µC immer 1 
leitet, sind irgendwelche Freilaufdioden unötig, weil der 
Induktionsstrom ja immer einen Weg freigeschaltet bekommt.

Axel R. schrieb:
> Wenn man jetzt hier noch den zweiten Pin als Ausgang definiert und
> "entgegenegesetzt" schaltet (am Ende der Tonausgabe beide auf "L"
> oder"H" oder als Eingang!), kann man den Piepser zwischen zwei Ausgänge
> "hängen".
Man kann mehrere digitale Ausgangssignale auch einfach mit der 
XOR-Funktion mischen. Dabei kommt es natürlich zu "Übersteuerungen", 
denn eigentlich ergibt ja 1+1 = 2. Diese 2 ist binär aber nicht 
darstellbar und resultiert als 0 in Verzerrungen. Dem Ohr ist das 
kurioserweise ziemlich egal. Siehe dazu auch den 
Beitrag "Re: VHDL Grundlagen Tonerzeugung" und den 
Beitrag "Re: Warum ist hier weniger los als.".

von Alexander H. (alexander_h732)


Lesenswert?

Axel R. schrieb:
> Beitrag "Re: Alarmton/Buzzer-Dreiklang erzeugen"
> Wenn man jetzt hier noch den zweiten Pin als Ausgang definiert und
> "entgegenegesetzt" schaltet (am Ende der Tonausgabe beide auf "L"
> oder"H" oder als Eingang!), kann man den Piepser zwischen zwei Ausgänge
> "hängen". Oder man verwendet einen Auskoppel-Kondensator, damit nicht
> ständig Strom durch die Spule fließt. Auch würde ich zwei
> Doppel-Schottky an die Ausgangspins gegen GND und VCC schalten und einen
> kleinen Elko (100uF/6V3)parallel zur Betriebsspannung nicht einsparen.

Das wollte ich auch noch fragen.
Die Lautstärke ist zwar ganz ok, aber an 2,7V würde ein bisschen Reserve 
nicht schaden.
Man sieht oft eine Diode zwischen den Lautsprecherpins(Rück-Induktion?), 
erfüllt das den gleichen Zweck wie zwei Schottkydioden?
Also wie genau kann ich das Programm auf „Brückenschaltung“ (push-pull?) 
abändern? Ich hab auch gelesen, dass push-pull Betrieb durch 
„bitbanging“ gelöst werden kann?
Leider finde ich so gut wie keine (Code-)beispiele für 
Lautsprecherbetrieb an zwei Ausgängen.

Ich nutze diese Firmware von Lothar:
1
include <avr/io.h>
2
#define F_CPU 16000000L
3
#include <util/delay.h>
4
void A (void) {
5
  for(int i=0; i<100; i++) { // A: 2kHz, 50ms
6
    PORTB = 0x01;
7
    _delay_us(250);
8
    PORTB = 0x00;
9
    _delay_us(250);
10
  }
11
}
12
void B (void) {
13
  for(int i=0; i<160; i++) { // B: 3k2Hz, 50ms
14
    PORTB = 0x01;
15
    _delay_us(155);
16
    PORTB = 0x00;
17
    _delay_us(156);
18
  }
19
}
20
int main(void)
21
{
22
  DDRB = 0x01; // B0 = LED
23
  while(1)
24
  {
25
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
26
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
27
    A();
28
    _delay_ms(20);          // kurze Pause
29
    A();
30
    _delay_ms(20);          // kurze Pause
31
    B();
32
    _delay_ms(20);          // kurze Pause
33
    _delay_ms(50);          // still
34
    _delay_ms(20);          // kurze Pause
35
    B();
36
    _delay_ms(20);          // kurze Pause
37
    A();
38
        
39
    _delay_ms(3000); // wart mal ab...
40
  }                      
41
}

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Leider finde ich so gut wie keine (Code-)beispiele für
> Lautsprecherbetrieb an zwei Ausgängen.
Selber aktiv werden?

> Ich hab auch gelesen, dass push-pull Betrieb durch „bitbanging“ gelöst
> werden kann?
Seis drum. Schließe den Pipser zwischn PB0 und PB1 an und ändere das 
Programm in diesen Zeilen ab:
1
:
2
    PORTB = 0x01;
3
    _delay_us(...);
4
    PORTB = 0x02;
5
    _delay_us(...);
6
:
7
   DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
8
:

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Wenn ich total crazy drauf bin, bau ich sogar noch 2x ein
1
PORTB = 0x00;
ein. Und zwar jeweils hier:
1
    _delay_us(IRGENDEINE_ZAHL);
2
  }
3
  PORTB = 0x00;
4
}

Dann fliesst kein Gleichstrom durch den Buzzer, wenn nix dudelt.

Gruss
WK

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dergute W. schrieb:
> PORTB = 0x00;
Erscheint sinnvoll... ;-)

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Alexander H. schrieb:

> Der Beep von Lothar hört sich sehr gut an!

Ist aber nicht wirklich dem Original entsprechend. Ich habe mal mein 
altes Analyseprogramm rausgekramt, mit dem ich damals den 
Westminster-Schlag analysiert habe. Es hat sich folgendes ergeben:

Sechs "Noten", drei Frequenzen

Jede Note (mit Ausnahme der vierten) enthält ca. 50ms Ton, dann 20ms
Stille, die vierte Note ist komplett still, sollte sie wohl jedenfalls
mal sein, bevor irgendein Idiot Störgeräusche und Rauschen zu der 
Aufnahme hinzugefügt hat...

Die Zuordnung der Frequenzen zu den Noten sieht so aus:
1
n/f  2k  3k  4k
2
---------------
3
1    x   x     
4
2    x   x     
5
3        x   x 
6
4              
7
5        x   x 
8
6    x   x

> Beim zweiten Beep bin ich mir unsicher. Ich sehe hauptsächlich drei
> Frequenzen, die parallel erklingen(95Hz, 200Hz und 750Hz).

Nö, ist viel simpler. Offensichtlich wurde hier näherungsweise mit einem 
Dirac-Puls gearbeitet. Sprich: nur ganz kurz Saft auf den Buzzer, der 
Rest des Tones wird durch das mechanische System des Buzzers selber 
erzeugt. Dessen Resonanzfrequenz liegt offensichtlich bei ca. 2,7kHz.
Die Anregung durch den Puls wird dann gut 80 mal wiederholt, wobei die 
Abstände der Pulse immer kürzer werden. Das erzeugt den wahrgenommenen 
Frequenz-Sweep. In Wirklichkeit gibt es aber keine Änderung der 
tatsächlichen Frequenz des Geräuschs, die ist vom ersten bis zum letzten 
immer so bei 2,7kHz.

: Bearbeitet durch Moderator
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ob S. schrieb:

> der
> Rest des Tones wird durch das mechanische System des Buzzers selber
> erzeugt. Dessen Resonanzfrequenz liegt offensichtlich bei ca. 2,7kHz.

Hmmm... Bei nochmaligem Nachdenken könnte sich bezüglich Beep1 noch eine 
Änderung ergeben. Wenn man nämlich mal annimmt, dass die Aufnahme mit 
demselben Buzzer entstanden ist wie die von Beep2 und die grottige 
Qualität der Quelle meiner Analyse berücksichtigt, dann könnten meine 
analysierten 3kHz gut und gerne ein Artefakt sein, das aus der 
Resonanzfrequenz des Beepers resultiert und in Wirklichkeit eben auch 
2.7kHz hat und in der Anregung niemals enthalten war.

Entsprechend bereinigt würde das dann so aussehen:
1
n/f  2k  4k
2
-----------
3
1    x        
4
2    x        
5
3        x 
6
4              
7
5        x 
8
6    x

[Mod: die [code]-Tags sind case-sensitiv]

: Bearbeitet durch Moderator
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ob S. schrieb:

> [Mod: die [code]-Tags sind case-sensitiv]

Ooops. Danke für die Korrektur.

von Alexander H. (alexander_h732)


Lesenswert?

Danke für die Erklärung (Buzzer im Gegentakt anschliessen). Das werde 
ich versuchen ins Programm eunzubauen, wenn der Rest wie geplant läuft.

Ich bin noch auf ein Problem gestoßen:
der Ton wird leider am Ende knapp abgeschnitten, wenn ich den uC im 1Hz 
Takt lowside einschalte.
Ein Stützelko hat auch nicht geholfen.
Also komme ich doch nicht um einen Steuereingang (active low?)herum.
Ich hab einige unterschiedliche Varianten gefunden. Wie implementiert 
man das ins Programm am einfachsten?
Man müsste wahrscheinlich einen (Taster-) Eingang definieren?
Ich bräuchte einen Pull-Up R und könnte einen der Inputs nutzen. Welchen 
nimmt man am besten, dass später das ISP(im eingebauten Zustand) noch 
funktioniert? Hatte zB. beobachtet, dass mit Buzzer+Freilaufdiode am 
Ausgang dann das ISP nicht mehr läuft.

Interessant, 2,7KHz alleine hören sich ja erstmal überhaupt nicht so an, 
wie der Sweep.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Edit: es sind scheinbar doch 1,5-2Hz und damit leider schneller als 
gedacht.

von Alexander H. (alexander_h732)


Lesenswert?

Hmm, ich hab nun einige verschiedene Codebeispiele mit 
Inputkonfiguration dem Code (mit Lothars Tonfolge) vorangestellt. Weil 
ich es noch nicht besser weiß.😉
Wie zu erwarten war, funktioniert das so nicht. Was muss ich denn 
beachten, damit ein activ LOW am Eingang die Tonfolge auslöst?
Es wurde zwar teilweise kompiliert, aber ich mache irgendetwas 
grundsätzlich falsch. Wahrscheinlich braucht man erstmal ein Minimum an 
Erfahrung.

Da die Dauer der Tonfolge unter 500ms(2Hz) liegt, müsste es mit 
dauerhaft eingeschaltetem uC und Einschaltung per Input ja eigentlich 
auch klappen.

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Was muss ich denn beachten, damit ein activ LOW am Eingang die Tonfolge
> auslöst?

Du musst beachten, dass der Eingang Aktiv LOW ist. Konkrete Hilfe 
erfordert konkreten Input (dein Quelltext).

von Alexander H. (alexander_h732)


Lesenswert?

Ich hatte zB. das hier gefunden:
1
const int buzzerPin = 5;
2
const int switchPin = 6;
3
int buzzerState = 1; // 1 for off, 0 for on
4
5
void setup() {
6
  pinMode(buzzerPin, OUTPUT);
7
  pinMode(switchPin, INPUT_PULLUP); // Enable internal pull-up resistor
8
  Serial.begin(9600);
9
}
10
11
void loop() {
12
  int switchState = digitalRead(switchPin);
13
14
  if (switchState == LOW) { // Switch is pressed (active-low)
15
    buzzerState = 1; // Turn on the buzzer
16
  } else { // Switch is not pressed
17
    buzzerState = 0; // Turn off the buzzer
18
  }
19
20
  digitalWrite(buzzerPin, buzzerState); // Control the buzzer based on buzzerState
21
22
  delay(10); // Debounce the switch
23
}
Falls das ungefähr in die richtige Richtung geht, wie vereine ich das 
mit der Tonfolge?
Ja, also normalerweise ist der Eingang "intern" im uC immer auf LOW, 
richtig?

[Mod: die [c]-Tags das nächste Mal bitte selber einsetzen. Nazulesen 
über jeder Texteingabebox bei "Wichtige Regeln - **erst lesen**, dann 
posten!"]

: Bearbeitet durch Moderator
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Alexander H. schrieb:

> Ja, also normalerweise ist der Eingang "intern" im uC immer auf LOW,
> richtig?

Nein, wie kommst du darauf? Es gibt keinen default state. Was default 
ist, wird durch einen Widerstand bestimmt, der entweder auf Vcc (pullup) 
oder Gnd (pulldown) geht. Intern gibt es beim TinyX5 nur Pullups, die 
man einschalten könnte, um einen default state zu erreichen. Der wäre 
dann aber HIGH.

von Alexander H. (alexander_h732)


Lesenswert?

Ob S. schrieb:
> Alexander H. schrieb:
>> Ja, also normalerweise ist der Eingang "intern" im uC immer auf LOW,
>> richtig?
>
> Nein, wie kommst du darauf? Es gibt keinen default state. Was default
> ist, wird durch einen Widerstand bestimmt, der entweder auf Vcc (pullup)
> oder Gnd (pulldown) geht. Intern gibt es beim TinyX5 nur Pullups, die
> man einschalten könnte, um einen default state zu erreichen. Der wäre
> dann aber HIGH.

Default state HIGH gilt für den Eingang? Den internen Pullup zu nutzen 
hatte ich vor, denn ich will ja per active LOW den Ausgang einschalten.

Kann sich jemand den Code von Lothar und meine Ergänzung nochmal 
anschauen?
Ich komme da nicht weiter.

von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:> Falls das ungefähr in die 
richtige Richtung geht,

tut es

> wie vereine ich das mit der Tonfolge?

Dafür hast du doch schon Beispiele bekommen. Wenn du keine Lust auf 
Lesen und Lernen hast (ja das ist mühsam), kannst du ja versuchen, einen 
KI Chatbot zu überreden, das für dich zu erledigen. Und nein, das ist 
keine Verarschung, das können die Dinger wirklich.

von Alexander H. (alexander_h732)


Lesenswert?

Nemopuk schrieb:
> Alexander H. schrieb:> Falls das ungefähr in
> die richtige Richtung geht,
> tut es
>> wie vereine ich das mit der Tonfolge?
>
> Dafür hast du doch schon Beispiele bekommen. Wenn du keine Lust auf
> Lesen und Lernen hast (ja das ist mühsam), kannst du ja versuchen, einen
> KI Chatbot zu überreden, das für dich zu erledigen. Und nein, das ist
> keine Verarschung, das können die Dinger wirklich.

Welche Beispiele?

Würd ich gerne mal sehen, ob „KI“ das kann. Bitte verlinken, falls 
jemand hier KI erfolgreich nutzt😉👍

: Bearbeitet durch User
von Manfred P. (pruckelfred)


Lesenswert?

Alexander H. schrieb:
>> Dafür hast du doch schon Beispiele bekommen. Wenn du keine Lust auf
>> Lesen und Lernen hast (ja das ist mühsam), kannst du ja versuchen, einen
>> KI Chatbot zu überreden, das für dich zu erledigen.
> Welche Beispiele?
>
> Würd ich gerne mal sehen, ob „KI“ das kann. Bitte verlinken, falls
> jemand hier KI erfolgreich nutzt

Wenn Du keine Lust hast, selbst aktiv zu werden, verschwinde. Du kannst 
Deine Versuche und Ergebnisse zeigen, aber niemand hat Spaß daran, auch 
hier diesen KI-Dreck zu diskutieren.

von Alexander H. (alexander_h732)


Lesenswert?

Voilá! Here is your code...
This code will Define input PB1. Define output PB0.
Use intern pullup on input.
Activate buzzer on output, if input is LOW.

// Define input PB1
#define PB1 1

// Define output PB0
#define PB0 0

// Set PB1 as input with internal pullup
pinMode(PB1, INPUT_PULLUP);

// Set PB0 as output
pinMode(PB0, OUTPUT);

// Check if input is LOW
if(digitalRead(PB1) == LOW) {
  // Activate buzzer on output
  tone(PB0, 2000, 50); // Tone A 2khz, 50ms
  delay(50);
  tone(PB0, 3200, 50); // Tone B 3.2khz, 50ms
}

// Tone frequency sequence
// Tone A 2khz, 50ms
tone(PB0, 2000, 50);
delay(50);

// Tone B 3.2khz, 50ms
tone(PB0, 3200, 50);
delay(50);

// Reference: Arduino Tone Library - 
https://www.arduino.cc/reference/en/language/functions/advanced-io/tone/

Wird kompiliert, aber bei Input LOW passiert nichts.

von Joachim B. (jar)


Lesenswert?

Alexander H. schrieb:
> aber bei Input LOW passiert nichts

was hast du erwartet?
KI kann nichts werden wenn die natürliche Inteligenz stetig abnimmt.

von Alexander H. (alexander_h732)


Lesenswert?

Genau das hatte ich von „KI“ auch erwartet, daher überrascht mich das 
nicht.😊

von Otto K. (opto_pussy)


Lesenswert?

Joachim B. schrieb:
> KI kann nichts werden wenn die natürliche Inteligenz stetig abnimmt.

Eine künstliche KI muss ständig von intelligenten Menschen mit 
intelligenten Sachverhalten, Infos und mit gesicherten Wahrheiten 
gefüttert werden und nicht mit Fake News, denn sonst kommen aus der KI 
auch nur Fake News heraus.

Man kann nicht erwarten, dass eine KI so schlau ist und sich von selbst 
in die richtige Richtung entwickelt. Da steckt immer ein kluger 
menschlicher Kopf dahinter, der das Steuerrad fest in der Hand hält und 
ggf. kräftig gegenlenkt, damit alles wieder in geordneten Bahnen 
weiterläuft.

von Alexander H. (alexander_h732)


Lesenswert?

Ok, das hört sich ja vernünftig an. Also liegt es am Anwender.
Aber wo ist denn mein Fehler in der Eingabe?
Wenn ich hier schon so gute Tipps (KI)bekomme, will ich wenigstens 
sehen, was ich falsch mache. Das sind doch eigentlich einfache Sachen, 
die sollte die viel gelobte KI doch locker hinbekommen.
Liegt es vielleicht daran, dass die KI nicht spezifisch für den Attiny45 
funktioniert?

Nächstes Beispiel:
This code will Define input PB1. Define output PB0.
Use intern pullup on input.
Activate led on output, if input is LOW.

// Define input PB1
const int PB1 = 1;

// Define output PB0
const int PB0 = 0;

// Set PB1 as input with internal pullup
pinMode(PB1, INPUT_PULLUP);

// Set PB0 as output
pinMode(PB0, OUTPUT);

// Check if input is LOW
if(digitalRead(PB1) == LOW){
  // Activate LED on output
  digitalWrite(PB0, HIGH);
}

// Reference: 
https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/


Das wird nicht mal kompiliert (Compilation error: expected 
unqualified-id before numeric constant).

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Mach bitte wie schon beschrieben die [c]-Tags um den Code.

: Bearbeitet durch Moderator
von Nemopuk (nemopuk)


Lesenswert?

Alexander,
lerne doch einfach mal die Grundlagen von Arduino, bevor du es zu 
benutzen versuchst. setup() und loop() spielen eine elementare Rolle, 
beides fehlt in deinen zuletzt geposteten Code-Fragmenten.

Fange damit an:

https://docs.arduino.cc/built-in-examples/basics/BareMinimum/
https://docs.arduino.cc/built-in-examples/basics/Blink/
https://docs.arduino.cc/built-in-examples/basics/DigitalReadSerial/
https://docs.arduino.cc/built-in-examples/digital/InputPullupSerial/
https://docs.arduino.cc/built-in-examples/digital/toneMelody/

Oder damit:

https://funduino.de/vorwort

Noch einfacher und bequemer also mit Arduino geht es nicht. Wer gar 
nicht lernen will es selbst zu machen, der muss andere dafür bezahlen.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

1
 const int led = 0;
2
const int button = 1;
3
4
void setup() {
5
  pinMode(button, INPUT_PULLUP);
6
  pinMode(led, OUTPUT);
7
}
8
9
void loop() {
10
  if (digitalRead(button)== HIGH)digitalWrite(led, LOW); // Turn LED on if button is not pressed
11
  else {
12
    digitalWrite(led, HIGH); // Turn LED off if button is pressed
13
   
14
    delay(500); 
15
  }
16
}


Ein kleines bisschen weiter bin ich gekommen. Habe mittlerweile 
verstanden, dass Groß-/Kleinschreibung wichtig ist, und dass die I/Os 
nicht als 5/6 sondern 1/0 bezeichnet werden.
Mit dem Code oben schalte ich eine LED lowside für 500ms ein, das klappt 
schonmal. :)


Nur, wie genau baut man die Tonfolge von Lothar in diese Logik ein 
(Klammern setzen?)? Ein paar Hinweise wären klasse :)

: Bearbeitet durch Moderator
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Nur, wie genau baut man die Tonfolge von Lothar in diese Logik ein

Indem man programmiert. Und wenn man das noch nicht kann, dann muss man 
es lernen. Wie jeder andere Mensch auch. Meister fallen nicht vom 
Himmel.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Nemopuk schrieb:
> Alexander H. schrieb:
>> Nur, wie genau baut man die Tonfolge von Lothar in diese Logik ein
>
> Indem man programmiert. Und wenn man das noch nicht kann, dann muss man
> es lernen. Wie jeder andere Mensch auch. Meister fallen nicht vom
> Himmel.

Ja, das sagt sich leicht :)

Ich hab nun etwas anderes probiert, das überschreitet aber den Speicher 
des Attiny45. Kann das sein?
1
const int buzzer = 0;
2
const int button = 1;
3
4
void setup() {
5
  pinMode(button, INPUT_PULLUP);
6
  pinMode(buzzer, OUTPUT);
7
}
8
9
// Define tone frequencies
10
#define TONE_A 2000 // 2kHz
11
#define TONE_B 3200 // 3.2kHz
12
13
// Define tone duration
14
#define TONE_DURATION 50 // 50ms
15
16
// Function to generate tone
17
void generateTone(int frequency, int duration) {
18
  tone(buzzer, frequency, duration); // Generate tone with specified frequency and duration
19
  delay(duration); // Wait for tone to finish playing
20
}
21
22
// Main code
23
void loop() {
24
  if (digitalRead(button) == HIGH) { // Check if button is pressed
25
    digitalWrite(buzzer, LOW); // Turn off buzzer
26
  } else {
27
    generateTone(TONE_A, TONE_DURATION); // Generate tone A
28
    generateTone(TONE_B, TONE_DURATION); // Generate tone B
29
  }
30
}

Sketch uses 2146 bytes (104%) of program storage space. Maximum is 2048 
bytes.
Global variables use 26 bytes (20%) of dynamic memory, leaving 102 bytes 
for local variables. Maximum is 128 bytes.


Wie kommt es, dass Lothars Ton eigentlich gleich viele Zeilen hat und 
dennoch viel weniger Platz benötigt?

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lothar M. schrieb:
> Mach bitte wie schon beschrieben die [c]-Tags um den Code.
Und zwar genau auf die Art, wie es bechrieben wurde und über jeder 
Eingabebox steht. Auch mit dem Slash vor dem 'c'.

Wenn du beim Programmieren die Anweisungen genauso sorgfältig beachtest, 
dann hast du einen steinigen Weg vor dir. Der Compiler stört sich 
nämlich an fehlenden Schrägstrichen.

Alexander H. schrieb:
> dass die I/Os nicht als 5/6 sondern 1/0 bezeichnet werden.
PB0 und PB1 sind beim DIL8 Gehäuse am Pin5 und 6. Das steht im 
Datenblatt. In einem anderen Gehäuse können die an ganz anderen Pins 
sein, es bleiben aber PB0 und PB1.

: Bearbeitet durch Moderator
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Sketch uses 2146 bytes (104%) of program storage space. Maximum is 2048
> bytes.

Eigentlich hat der ATtiny45 4096 Bytes Flash. Hast du eventuell den 
falschen Mikrocontroller in der IDE eingestellt  oder die Hälfte davon 
mit einem veralteten Bootloader vergeudet?

Mit was für einem USB Adapter programmierst du ihn?

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Ich kompiliere mit der Arduino IDE (board: Attiny25/45/85 IDE v.2.3.6) 
und schreibe dann die .hex per AVRDude auf den Attiny.

von Alexander H. (alexander_h732)


Lesenswert?

Nemopuk schrieb:
> Hast du eventuell den
> falschen Mikrocontroller in der IDE eingestellt

Das wars! Danke. :)
Aber dieser Code macht leider garnichts. :(

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Aber dieser Code macht leider garnichts.

Der ATtiny Core von Damelli ist unvollständig. tone() ist dort nicht 
implementiert, kannst du nicht verwenden.

Vielleicht geht es mit dem anderen Core, den ich dir vor einer Woche 
empfahl:

Nemopuk schrieb:
> Wenn du die Arduino IDE verwendest, wirst du das brauchen...

Und lies dessen Dokumentation. Da steht nämlich, dass dessen tone() 
Implementierung nur auf Pin 1 und 4 (offenbar sind PB1 und PB4 gemeint) 
geht.

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Nemopuk schrieb:

> Der ATtiny Core von Damelli ist unvollständig. tone() ist dort nicht
> implementiert, kannst du nicht verwenden.
>
> Vielleicht geht es mit dem anderen Core, den ich dir vor einer Woche
> empfahl

Oder am allerbesten: Gleich ganz ohne Arduino-Gedöhns. Bei der konkreten 
Aufgabe hilft das nämlich eigentlich kein bissel.

Eher im Gegenteil. Spätestens bei der vorlagengerechten Umsetzung von 
Beep2 wird es nämlich u.U. sogar etwas störend werden.

Naja und dazu kommt natürlich noch: Ohne Arduino passt der Kram auch 
noch ganz locker in einen Tiny25. Na gut, das ist für den TO im Moment 
irrelevant, er hat ja einen Tiny45 zur Verfügung.

von Alexander H. (alexander_h732)


Lesenswert?

OK, also gibt es hier einige Möglichkeiten fürs Scheitern. ;)
Mir fehlt halt noch das logische Verständnis (oder das 
Hintergrundwissen) dafür, wie Programme aussehen (zB. konkret ob und wie 
ich Codeteile aneinanderreihen kann).
Lothars Ton ist ja klasse, den will ich auch gerne beibehalten.
Hab den anderen Core dann noch nach deiner Empfehlung getetest, Code 
umgeschrieben und neu verdrahtet - kein Erfolg. Ich lasse jetzt erstmal 
alles hardwaremässig wie gehabt und versuche, das nötige Wissen 
nachzuholen.

Ob S. schrieb:
> Gleich ganz ohne Arduino-Gedöhns. Bei der konkreten
> Aufgabe hilft das nämlich eigentlich kein bissel.

Was wäre denn eine gute Alternative?

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Wie kommt es, dass Lothars Ton eigentlich gleich viele Zeilen hat und
> dennoch viel weniger Platz benötigt?
Ich verwende keine ausufernden Bibliotheken, die auch sonst noch alles 
Mögliche können könnten. Sondern ich bearbeite die Portpins direkt über 
bitweise Zugriffe. Diese Zeilen kann der Compiler super optimieren. Lies 
mal den Post dort im 
Beitrag "Re: Meinung zu dieser Produktidee?" ab der Mitte.

Alexander H. schrieb:
> Was wäre denn eine gute Alternative?
Keine Arduino-Bibliotheken, sondern nur rudimentäre C-Funktionen 
verwenden. Mein Programm benötigt nur knapp 5% des Speicherplatzes eines 
ATTiny85. Aber es hat eben auch nicht solche Dinge wie einen Bootloader 
mit an Bord.

von Nemopuk (nemopuk)


Angehängte Dateien:

Lesenswert?

Alexander H. schrieb:
> Mir fehlt halt noch das logische Verständnis (oder das
> Hintergrundwissen) dafür, wie Programme aussehen (zB. konkret ob und wie
> ich Codeteile aneinanderreihen kann).

Das hättest du in der Zwischenzeit längst lernen können, indem du ein 
Lehrbuch liest, oder ein Tutorial durcharbeitest. Ich hatte dir vor 
einer Woche eine Webseite empfohlen, die neben Empfehlungen für IDEs und 
Programmieradapter auch ein Tutorial enthält. 
http://stefanfrings.de/mikrocontroller_buch/
Aber wie gesagt: Bücher aus Papier sind auch eine gute Erfindung.

Ob S. schrieb:
> Oder am allerbesten: Gleich ganz ohne Arduino-Gedöhns

Dazu möchte ich ergänzen, dass du auch bei der Methode trotzdem die 
Arduino IDE benutzen kannst. Wenn dein Hauptprogramm anstelle von 
setup() und loop() eine main() Funktion enthält und auf 
Arduino-spezifische Bibliotheken verzichtet, dann kommt dabei ein 
"reines" C/C++ Programm heraus. Siehe angehängter Screenshot. Dort habe 
ich einfach einen kleinen C-Quelltext aus einem Tutorial in die Arduino 
IDE kopiert. Läuft.

Ich schreibe das, weil die Arduino IDE für Anfänger erheblich angenehmer 
ist, als die IDE von Microchip mit ihren überwältigend vielen 
Menüpunkten und Konfigurations-Dialogen.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Nach einigen Anläufen und Fehlschlägen funktioniert es nun wie es soll.
Ich hab aber ein Delay von 1000ms beibehalten, weil es mit Pausen besser 
klingt.

Nochmal eine Frage an Lothar zur Tonsequenz-Erzeugung:
könnte ich einen Sweep (beep2) mit deiner Methode erzeugen?
Wie genau berechnet man die erzeugte Frequenz (zB. "for (int i = 0; i < 
100; i++) { // A: 2kHz, 50ms")?


Vielleicht hat jemand so etwas schon mal gemacht und kann einen Tipp 
geben?

von Alexander H. (alexander_h732)


Lesenswert?

Hab jetzt was ausprobiert, das geht ungefähr in die Richtung.
1
#include <avr/io.h >
2
#define F_CPU 16000000L
3
#include <util/delay.h>
4
5
const int button_pin = 1;
6
7
void A (void) {
8
  for (int i = 0; i < 20; i++) { // A: 2kHz, 50ms
9
    PORTB |= _BV(0);
10
    _delay_us(5000);
11
    PORTB &= ~_BV(0);
12
    _delay_us(50);
13
  }
14
}
15
16
void B (void) {
17
  for (int i = 0; i < 15; i++) { // B: 3k2Hz, 50ms
18
19
    PORTB |= _BV(0);
20
    _delay_us(4000);
21
    PORTB &= ~_BV(0);
22
    _delay_us(40);
23
  }[/c]
24
}
25
void C (void) {
26
  for (int i = 0; i < 10; i++) { // B: 3k2Hz, 50ms
27
28
    PORTB |= _BV(0);
29
    _delay_us(2500);
30
    PORTB &= ~_BV(0);
31
    _delay_us(30);
32
  }
33
}
34
void D (void) {
35
  for (int i = 0; i < 4; i++) { // B: 3k2Hz, 50ms
36
37
    PORTB |= _BV(0);
38
    _delay_us(2200);
39
    PORTB &= ~_BV(0);
40
    _delay_us(20);
41
  }
42
}
43
void E (void) {
44
  for (int i = 0; i < 2; i++) { // B: 3k2Hz, 50ms
45
46
    PORTB |= _BV(0);
47
    _delay_us(2000);
48
    PORTB &= ~_BV(0);
49
    _delay_us(50);
50
  }
51
}
52
void setup()
53
{
54
  // DDRB |=_BV(0); // Set as output
55
  pinMode (0, OUTPUT);
56
  pinMode(button_pin, INPUT_PULLUP);
57
}
58
59
void loop()
60
{
61
  int button = digitalRead(button_pin);
62
  if (button == LOW)
63
  {
64
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
65
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
66
    A();
67
    _delay_ms(0);          // kurze Pause
68
    B();
69
    _delay_ms(0);          // kurze Pause
70
    C();
71
    _delay_ms(0);          // kurze Pause
72
    D();
73
    _delay_ms(0);          // kurze Pause
74
    E();
75
    _delay_ms(0);          // kurze Pause
76
    
77
   
78
    _delay_ms(3000); // wart mal ab...
79
  }
80
  _delay_ms(100);
81
}


Aber es ist viel zu leise. Liegt das am Frequenzgang des Buzzers?
Ich hoffe, dass man, indem man den Piepser an zwei Ausgänge schaltet 
noch etwas rausholen kann.

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Alexander H. schrieb:

> #define F_CPU 16000000L

Wo kommen die 16MHz her?

> Aber es ist viel zu leise. Liegt das am Frequenzgang des Buzzers?

Nö. Das liegt daran, dass das Programm ziemlicher Schwachsinn ist. Ganz 
offensichtlich ohne jedes Verständnis der Funktion zusammenkopiert.

Deine Funktionen von A bis E erzeugen allesamt nicht wirklich den 
gewünschten Ton. Und schon garnicht mit der gewünschten Dauer (wenn man 
die Kommentare mal als Referenz dafür betrachtet, was jeweils gewünscht 
ist).

Und das ist jedem mit auch nur andeutungsweisem Verständnis sofort klar, 
wenn man z.B. B() und C() vergleicht. Gleicher Wunsch, gleiche 
Programmstruktur, aber unterschiedliche Implementierung. Kann also 
unmöglich passen. Wenn überhaupt, könnte nur eine Implementierung 
passen, tatsächlich passt aber keine von beiden.

Dazu kommt aber noch: du brauchst keine sechs Funktionen zur 
Tonerzeugung, sondern nur allerhöchstens drei, von denen eine nicht mal 
einen Ton erzeugt, sondern nur eine Notendauer lang nichts tut. 
Sinnvoller wäre aber, nur eine Funktion zur Tonerzeugung zu haben, der 
man mittels Parametern die gewünschte Frequenz, die Tondauer und die 
Pausendauer übergibt. Der Prototyp für diese Funktion könnte z.B. so 
aussehen:

void Note(int Frequency_Hz, int ToneDuration_ms, int PauseDuration_ms);

Diese Funktion muss dann vier Sachen tun:
1) Die halbe Periodenzeit für die gewünschte Frequenz ausrechnen
2) Ausrechnen, wieviel Perioden der Frequenz abzuspielen sind, um auf
   die Dauer der ToneDuration zu kommen.
3) Mit den beiden berechneten Werten die eigentliche Tonerzeugung
   durchführen.
4) Die gewünschte Pause erzeugen.

Bei den Punkten 1) und 2) ist relativ viel zu rechnen 
(Integer-Divisionen). Da kommt es auf die Güte des Compilers an, ob er 
von allein erkennt, dass man das schon zur Compilezeit ausrechnen kann. 
Wenn nicht, muss man ihm ggf. Hilfestellung geben.

Das Hauptprogramm würde dann sechs mal die Note()-Funktion aufrufen, 
etwa so:

Note(2000, 50, 20);
Note(2000, 50, 20);
Note(3200, 50, 20);
Note(0, 0, 70);         //kein Ton, statt dessen: lange Pause
Note(3200, 50, 20);
Note(2000, 50, 20);

Wobei natürlich noch zu berücksichtigen ist, dass da statt 3200 
eigentlich 4000 stehen müsste. Aber das ist erstmal egal. Das ist dann 
schnell geändert, wenn das Programm erst mal korrekt funktioniert.

Eine naive Implementierung von Note() könnte etwa so aussehen:

void Note(int Frequency_Hz, int ToneDuration_ms, int PauseDuration_ms) {
  if (Frequency_Hz > 0 && ToneDuration > 0) {
    int period_us = 1000000L / Frequency_Hz;
    int periods = (1000 * ToneDuration) / period_us;
    int halfperiod_us = period_us / 2;
    for (int i = 0; i < periods; i++) {
      PORTB |= _BV(0);
      _delay_us(halfperiod_us);
      PORTB &= ~_BV(0);
      _delay_us(halfperiod_us);
    }
  }
  _delay_ms(PauseDuration);
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Aber es ist viel zu leise. Liegt das am...
Du hast da mit den unterschiedlichen delay-Zeiten ein ganz schlechtes 
Tastverhältnis ins Spiel gebracht. Probierst mal mit 50:50 statt mit 
100:1

Der Buzzer kann bei den kurzen 20..50us gar nicht viel Hub machen. Und 
der Hub ist letztlich die Lautstärke.

Ich hatte ja schon gepostet, wie es richtig geht. Auch das mit den 
[c]-Tags...

: Bearbeitet durch Moderator
von J. T. (chaoskind)


Lesenswert?

Lothar M. schrieb:
> Und
> der Hub ist letztlich die Lautstärke.

Das ist letztlich ein Trugschluß, denn für die Lautstärke ist die 
Membranschnelle verantwortlich. Natürlich bedingt eine schnellere 
Membran einen größeren Hub, da die Membran für einen Hubzyklus bei 
Frequenz x, Zeit 1/x braucht, und wenn sie sich die Zeit schneller 
bewegt, natürlich mehr Strecke zurücklegt.

Aber am Ende ist es die Membranschnelle, die die Lautstärke bestimmt, 
darum brauchen Tieftöner auch mehr Hub als Hochtoner um auf die gleiche 
Lautstärke zu kommen. Aber eigentlich ist der größere Hub eine Folge der 
höheren Lautstärke und keine Ursache.

Das ändert aber natüelich nichts an dem, was du zur Pulsweite gesagt 
hast.

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Aber es ist viel zu leise. Liegt das am Frequenzgang des Buzzers?

Um welchen genau geht es? In dessen Datenblatt sollte ein Diagramm den 
Wirkungsgrad je nach Frequenz zeigen.

> Ich hoffe, dass man, indem man den Piepser an zwei Ausgänge schaltet
> noch etwas rausholen kann.

Doppelte Spannung -> vierfache Leistung. Das Ohr reagiert logarithmisch 
auf Lautstärke.

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Nemopuk schrieb:

[Brückenbetrieb]

> Doppelte Spannung -> vierfache Leistung. Das Ohr reagiert logarithmisch
> auf Lautstärke.

Ja. Effektiv kann man also durch diese Massnahme nur etwa mit dem 
Eindruck doppelter Lautstärke rechnen.

von Kurt (sommerwin)


Lesenswert?

SAB0600 ist speziell für 3 Klang Gong, das müsste auch mit 5V 
funktionieren, habs aber selber noch net probiert...

von Manfred P. (pruckelfred)


Lesenswert?

Kurt schrieb:
> SAB0600 ist speziell für 3 Klang Gong,

.. und wird von Siemens noch aktiv gefertigt?

von Kurt (sommerwin)


Lesenswert?

Manfred P. schrieb:
> und wird von Siemens noch aktiv gefertigt?

Vielleicht nimmer gefertigt, aber gibts immer noch zu kaufen. Hab erst 
vor ein paar Wochen 2 Stück bestellt und auch bekommen...

von Joachim B. (jar)


Lesenswert?

Nemopuk schrieb:
> Doppelte Spannung -> vierfache Leistung. Das Ohr reagiert logarithmisch
> auf Lautstärke.

nur in der grauen Theorie, bei Autoradios wurde effektiv nur die 3-fache 
Leistung erreicht.

von Alexander H. (alexander_h732)


Lesenswert?

Ich hab jetzt den Buzzer-Ausgang auf PB0 und PB1 ans Laufen bekommen.
Es ist definitiv ein bisschen lauter.
An PB0/PB1 waren jeweils 39 Ohm erforderlich, sonst geht der Attiny 
scheinbar in die Strombegrenzung.
Aber leider wird der Ton (ich gebs zu, nicht ansatzweise wie beep2) 
immer im Loop abgespielt, auch wenn kein LOW mehr am Eingang anliegt.
Was mache ich falsch?
1
#include <avr/io.h >
2
#define F_CPU 16000000L
3
#include <util/delay.h>
4
5
const int button_pin = 2;
6
7
void A (void) {
8
  for (int i = 0; i < 20; i++) { // A: 2kHz, 50ms
9
    PORTB = 0x01;
10
    _delay_us(3000);
11
    PORTB = 0x02;
12
    _delay_us(3000);
13
14
   DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
15
  }
16
}
17
18
void B (void) {
19
  for (int i = 0; i < 20; i++) { // B: 3k2Hz, 50ms
20
21
    PORTB = 0x01;
22
    _delay_us(2900);
23
    PORTB = 0x02;
24
    _delay_us(2900);
25
26
   DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
27
  }
28
}
29
void C (void) {
30
  for (int i = 0; i < 10; i++) { // B: 3k2Hz, 50ms
31
32
    PORTB = 0x01;
33
    _delay_us(2800);
34
    PORTB = 0x02;
35
    _delay_us(2800);
36
37
   DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
38
}
39
40
}
41
void setup()
42
{
43
  // DDRB |= 0x03; // Set as output
44
  
45
  pinMode(button_pin, INPUT_PULLUP);
46
}
47
48
void loop()
49
{
50
  int button = digitalRead(button_pin);
51
  if (button == LOW)
52
  {
53
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
54
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
55
    A();
56
    _delay_ms(0);          // kurze Pause
57
    B();
58
    _delay_ms(0);          // kurze Pause
59
    C();
60
    _delay_ms(0);          // kurze Pause
61
   
62
   
63
    _delay_ms(3000); // wart mal ab...
64
  }
65
  _delay_ms(100);
66
}

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> sonst geht der Attiny
> scheinbar in die Strombegrenzung.

Du kannst dessen Ausgänge kurzschließen, ohne dass die Funktion des 
Mikrocontrollers beeinträchtigt wird (nur nicht zu viele gleichzeitig).

Wenn es bei dir nur mit einem Widerstand vor dem Schallwandler 
funktioniert, dann taugt deine Stromversorgung nicht. Zeige mal Fotos 
vom Aufbau.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> An PB0/PB1 waren jeweils 39 Ohm erforderlich, sonst geht der Attiny
> scheinbar in die Strombegrenzung.
Garantiert geht der nicht in irgendeine "Strombegrenzung", denn sowas 
hat dessen Pintreiber gar nicht eingabaut. Der Ausgang ist nach meinen 
Erfahrungen für gefühlt endlose Zeit kurzschlussfest (Pin gegen Masse 
und Pin gegen Vcc und auch 2 Pins gegeneinenader) weil die Mostfet dort 
drin "hinreichend" hochohmig sind. Du hast da andere Effekte.

Ich fände es unheimlich hilfreich, wenn wir nach 3 Wochen so langsam mal 
wüssten, was du da überhaupt für einen "Buzzer" vor dir hast. Ein Foto 
(mit Lineal) und eine Widerstandsmessung wären da sicher hilfreich.

Und natürlich wäre es auch nicht schlecht, wenn du gleich den ganzen 
Aufbau samt Stromversorgungn mitfotografieren würdest, wenn du schon mal 
dabei bist.

von Alexander H. (alexander_h732)


Lesenswert?

Nemopuk schrieb:
> Alexander H. schrieb:
>> sonst geht der Attiny
>> scheinbar in die Strombegrenzung.
>
> Du kannst dessen Ausgänge kurzschließen, ohne dass die Funktion des
> Mikrocontrollers beeinträchtigt wird (nur nicht zu viele gleichzeitig).
> Wenn es bei dir nur mit einem Widerstand vor dem Schallwandler
> funktioniert, dann taugt deine Stromversorgung nicht. Zeige mal Fotos
> vom Aufbau.

Ja, das wird es sein. Ich hab einen AVRisp mkII mit einem Schalter 
umgebaut (5V USB Spannung des Programmers auf Vcc am ISP Stecker).

Mein Buzzer:
https://cdn-reichelt.de/documents/datenblatt/A900/CEM-1203.pdf

von Joachim B. (jar)


Lesenswert?

Alexander H. schrieb:
> Ich hab

das Gelesene nicht verstanden und immer noch keine Bilder geliefert!

von Manfred P. (pruckelfred)


Lesenswert?

Alexander H. schrieb:
> Mein Buzzer:
> https://cdn-reichelt.de/documents/datenblatt/A900/CEM-1203.pdf

Da sieht man unterhalb 2kHz einen erheblichen Abfall des Schallpegels, 
dieser Signalgeber hat da einen Resonanzbereich. Und die Daten sagen 
auch, ihn nicht oberhalb 5 Volt zu betreiben. Er scheint mir für Deine 
Anwendung nur begrenzt geeignet.

Schaue nach Lautsprecherchen aus Schnurlostelefonen, Pollin sollte sowas 
haben. Die sind breibandiger, aber auch deutlich größer.

von Axel R. (axlr)


Lesenswert?

Alexander H. schrieb:
> void C (void) {
>   for (int i = 0; i < 10; i++) { // B: 3k2Hz, 50ms
>     PORTB = 0x01;
>     _delay_us(2800);
>     PORTB = 0x02;
>     _delay_us(2800);
>    DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
> }
>
> }
Ich meld' mich auch mal zu Wort (wollte mich eigentlich raushalten).

Alexander, erklär mir mal bitte schritt für Schritt, was diese (von mir 
zitierte) Funktion Zeile für Zeile macht.
Danach erkläre auch ich Dir, was die einzelnen Programmzeilen bewirken 
und Du kannst überlegen, was Du dort ändern kannst, damit sich nun 
endlich die gewünschte Funktion einstellt.
Solltest Du hier noch Fragen haben, erklär' ich Dir gern, was GENAU zu 
tun ist und auch warum.
Du kannst nicht einfach - auf gut Glück - irgendwas zusammenkopieren, 
ohne zu wissen, was Du da tust. Also: klar, kannst Du, machst Du ja 
auch; wird dann halt nur nie fertig. Und beim nächsten Mal fragste 
wieder.

von BirnKichler S. (Firma: privat) (max707)


Angehängte Dateien:

Lesenswert?

Manfred P. schrieb:
> Alexander H. schrieb:
>> Mein Buzzer:
>> https://cdn-reichelt.de/documents/datenblatt/A900/CEM-1203.pdf
>
> Da sieht man unterhalb 2kHz einen erheblichen Abfall des Schallpegels,
> dieser Signalgeber hat da einen Resonanzbereich. Und die Daten sagen
> auch, ihn nicht oberhalb 5 Volt zu betreiben. Er scheint mir für Deine
> Anwendung nur begrenzt geeignet.
>
> Schaue nach Lautsprecherchen aus Schnurlostelefonen, Pollin sollte sowas
> haben. Die sind breibandiger, aber auch deutlich größer.

Im Bereich von 2500–3500 Hz liegen keine Grundfrequenzen typischer 
Tonleitern (z. B. C-Dur). Der Bereich von 2500–3500 Hz enthält keine 
Grundtöne und ist daher auch nicht sinnvoll zu verwenden.

wie ich schon mehrmals anmerkte, ein Piepser bleibt ein Piepser.

von Teo D. (teoderix)


Lesenswert?

Alexander H. schrieb:
> Ich hab jetzt den Buzzer-Ausgang auf PB0 und PB1 ans Laufen bekommen.
> Es ist definitiv ein bisschen lauter.
> An PB0/PB1 waren jeweils 39 Ohm erforderlich, sonst geht der Attiny
> scheinbar in die Strombegrenzung.

Die Membranen (Metllplätchen) sind mechanisch vorgespannt (Dauermagnet). 
Die Ansteuerung mit Wechselstrom bringt da ähnlich "viel", wie eine 
Z-Diode in Serie zur Freilaufdiode zu verbauen.
Ich würde auch nichts an der Frequenz modulieren, nur das 
Tastverhältnis. Damit lässt sich sogar Sprache "verständlich" ausgeben. 
Hat Rolf-Dieter Klein, schon ende der 70er gezeigt. :)

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Teo D. schrieb:
...
> Die Membranen (Metllplätchen) sind mechanisch vorgespannt (Dauermagnet).
> Die Ansteuerung mit Wechselstrom bringt da ähnlich "viel", wie eine
> Z-Diode in Serie zur Freilaufdiode zu verbauen.
> Ich würde auch nichts an der Frequenz modulieren, nur das
> Tastverhältnis. Damit lässt sich sogar Sprache "verständlich" ausgeben.
> Hat Rolf-Dieter Klein, schon ende der 70er gezeigt. :)

Das konnte man auch mit 2 kiloohm Kopfhörern aus dem 1. WK schon, siehe 
hier: https://de.wikipedia.org/wiki/Datei:Detektor-Kopfhoerer.png.

von Axel R. (axlr)


Lesenswert?

1
 void C (void) {
2
   DDRB |= (1<<DDB1)|(1<<DDB0); //1x PortB0 und B1 als Ausgang, andere Portpins unberührt
3
     for (int i = 0; i < 10; i++) { // (B: 3k2Hz, 50ms) 3.2kHz, 50ms?
4
     PORTB = 0x01;  //2800µsek POTB0 auf High, PORTB1 auf LOW
5
     _delay_us(2800);
6
     PORTB = 0x02; //2800µsek POTB1 auf High, PORTB0 auf LOW
7
     _delay_us(2800);
8
     } //das ganze zehn mal
9
  DDRB ~= (1<<DDB1)|(1<<DDB0); // 1x am Ende nach der Schleife Portpins 0,1 vom PORTB wieder auf Eingang
10
 }
Was Du mit den anderen Portpins machst, weiss ich gerade nicht; besser 
ist es, diese nicht anzufassen. Hier sicher nicht weiter tragisch; man 
kann durchaus mit 0x01, 0x02 und 0x00 hantieren. Aber es kann auch 
anders kommen.
Zu Deiner Ausgabefrequenz:
1
(2800µs EIN + 2800µs AUS) = 5600µs Periodendauer
Frequenz wäre demnach:
1
1 / 5600E-6 = 178.5 Hertz
weit weg von 3200 Hz

Dauer des Tones:
1
(2800µs EIN + 2800µs AUS) * 10 = 0.056 = 56ms

Zu bemerken sei vielleicht noch, dass der Buzzer am liebsten bei 2Khz 
herum spielen mag. Muss mit der Geometrie des Aufbaus zusammenhängen. 
Jedenfalls sagt das das Datenblatt, welches Du freundlicherweise 
verlinkt hast.

Jetzt wäre noch zu klären, ob dein Eingangspin dauerhaft auf LOW liget 
und er solange dudeln soll, oder ob du einen Triggerimpuls hast, der die 
Tonausgabe starten soll und diese Folge dann einmal abspielt.

(Ich hoffe, ich hab mich nicht verrechnet und blamiere mich hier ;), 
vieles wurde ja auch schon richtig angedeutet und bemerkt)

EDIT: ODER eingefügt

: Bearbeitet durch User
von BirnKichler S. (Firma: privat) (max707)


Angehängte Dateien:

Lesenswert?

Beep.mp3 (33,8 KB) audacity vorgeworfen und die zeitskala angepasst

: Bearbeitet durch User
von Dergute W. (derguteweka)


Lesenswert?

Esmu P. schrieb:
> Beep.mp3 (33,8 KB) audacity vorgeworfen und die zeitskala
> angepasst

Und das Forum mit einem weiteren Megabyte voelliger Redundanz geflutet.

von BirnKichler S. (Firma: privat) (max707)


Angehängte Dateien:

Lesenswert?

Dergute W. schrieb:
> Esmu P. schrieb:
>> Beep.mp3 (33,8 KB) audacity vorgeworfen und die zeitskala
>> angepasst
>
> Und das Forum mit einem weiteren Megabyte voelliger Redundanz geflutet.

Damit kann jeder hören was der TS hören wollte...

: Bearbeitet durch User
von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Teo D. schrieb:

> Die Membranen (Metllplätchen) sind mechanisch vorgespannt (Dauermagnet).

Ja. Und?

> Die Ansteuerung mit Wechselstrom bringt da ähnlich "viel", wie eine
> Z-Diode in Serie zur Freilaufdiode zu verbauen.

Unsinn. Wenn (mal angenommen) das Ziel wäre, AC möglichst gut 
wiederzugeben, dann ist der Trick einfach, die Membrane während der 
Wiedergabe halt vom Anschlag fernzuhalten. Das macht man ganz einfach 
durch das passende Tastverhältnis der Ansteuerung.

Aber: Das Ziel war hier eben NICHT, AC möglichst gut wiederzugeben, 
sondern den Höreindruck einer existierenden Vorlage möglichst gut 
nachzuempfinden. Und auch das Ziel dieser Vorlage war es offensichtlich 
schon NICHT, AC möglichst gut wiederzugeben. Die hörbaren Artefakte 
sprechen eindeutig dagegen.

D.h.: Dein Beitrag geht zu 100% am Thema vorbei. Sechs, setzen.

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Ob S. schrieb:
...
>
> D.h.: Dein Beitrag geht zu 100% am Thema vorbei. Sechs, setzen.

gilt nur für dich

von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Mein Buzzer:
> https://cdn-reichelt.de/documents/datenblatt/A900/CEM-1203.pdf

Na endlich, jetzt kann ich eine deiner vorherigen Fragen beantworten:

Alexander H. schrieb:
> Aber es ist viel zu leise. Liegt das am Frequenzgang des Buzzers?

Nach deiner Doku arbeitest du mit 2000 und 3200 Hz. 2000 Hz entspricht 
der Nennfrequenz des Schallwandler, und 3200 Hz kann er Laut Diagramm 
sogar noch besser wiedergeben.

Wurde alles schon gesagt, nur noch nicht von jedem :-)

: Bearbeitet durch User
von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Nemopuk schrieb:
...
> Nach deiner Doku arbeitest du mit 2000 und 3200 Hz. ...

Nein, er wünscht sich das nur...

von Nemopuk (nemopuk)


Lesenswert?

Esmu P. schrieb:
> Nein, er wünscht sich das nur...

Ich wollte es freundlich ausdrücken.

von BirnKichler S. (Firma: privat) (max707)


Angehängte Dateien:

Lesenswert?

Esmu P. schrieb:
> Beep.mp3 (33,8 KB) audacity vorgeworfen und die zeitskala
> angepasst

von Jens M. (jens_m287)


Lesenswert?

Was für ein Aufwand für 6 Töne. Puhh ich glaub da hätte ich mir einfach 
ein fertiges mp3 Modul aus China bestellt und dann die Datei aus dem 
ersten Post aufgespielt.

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Jens M. schrieb:
> Was für ein Aufwand für 6 Töne. Puhh ich glaub da hätte ich mir
> einfach
> ein fertiges mp3 Modul aus China bestellt und dann die Datei aus dem
> ersten Post aufgespielt.

Ja, und die war eben Murks...

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Es ist so ruhig hier. Gibt es schon eine Lösung für den TO?

von Alexander H. (alexander_h732)


Lesenswert?

Leider bisher noch nicht.
Mir fehlt einfach die Programmiererfahrung, um das Ganze hinzubekommen.
Ein MP3 Modul wäre natürlich super simpel, aber platzmässig passt der 
Attiny perfekt.
Der Frequenzgang ist nicht das Problem, die getesteten Töne hören sich 
ganz gut an. Außerdem kann ich auch auf keine größeren Lautsprecher 
ausweichen, wegen Platzmangel.

Der Ton soll bei LOW (erstmal) einmal abgespielt werden, aber momentan 
spielt er nach einmal LOW im Loop und hört erst auf, wenn man die 
Betriebsspannung kappt. Da ich mit knapp 2Hz einschalte, muss ich später 
noch testen, was am besten funktioniert (evtl. delay einfügen).

Ich hatte was über boolean variable gefunden, evtl. wäre das hier 
möglich?

Nochmal eine Zusammenfassung, was das Programm machen soll:
-Der Beep1/2 soll per LOW eingeschaltet werden (Entprellung?)
-Auswahl zwischen den beiden Tönen per Jumper auf zB. GND.

-Input (LOW) =PB2, Jumper =PB3, Outputs =PB0/PB1.

Weiter oben kam der Vorschlag, dass kein Strom fliesst, wenn der Buzzer 
nicht angesteuert wird (Codebeispiel). Das würde ich gern mit ins 
Programm einbauen.

Wie dimensioniert man eigentlich die Koppelkondensatoren an den 
Ausgängen des Attiny? Ist eine Diode (Freilaufdiode?) zwischen den Pins 
des Piepsers sinnvoll?

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Deine Fragen machen nur in Kombination mit einem aktuellen Schaltplan 
und dem Quelltext Sinn. Ich habe keine Lust, 150 Beiträge zu zu lesen, 
um den aktuellen Stand zu ermitteln.

Du kannst die Durchläufe der Wiederholschleife zählen und nach einer 
gewissen Anzahl beenden. Siehe "for Schleife" in der 
Programmieranleitung deines Vertrauens.

von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

1
 #include <avr/io.h >
2
#define F_CPU 16000000L
3
#include <util/delay.h>
4
const int button_pin = 2;
5
void A (void) {
6
  for (int i = 0; i < 20; i++) { // A: 2kHz, 50ms
7
    PORTB = 0x01;
8
    _delay_us(3000);
9
    PORTB = 0x02;
10
    _delay_us(3000);
11
   DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
12
  }
13
}
14
void B (void) {
15
  for (int i = 0; i < 20; i++) { // B: 3k2Hz, 50ms
16
    PORTB = 0x01;
17
    _delay_us(2900);
18
    PORTB = 0x02;
19
    _delay_us(2900);
20
   DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
21
  }
22
}
23
void C (void) {
24
  for (int i = 0; i < 10; i++) { // B: 3k2Hz, 50ms
25
    PORTB = 0x01;
26
    _delay_us(2800);
27
    PORTB = 0x02;
28
    _delay_us(2800);
29
   DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert
30
}
31
}
32
void setup()
33
{
34
  // DDRB |= 0x03; // Set as output
35
  
36
  pinMode(button_pin, INPUT_PULLUP);
37
}
38
void loop()
39
{
40
  int button = digitalRead(button_pin);
41
  if (button == LOW)
42
  {
43
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
44
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
45
    A();
46
    _delay_ms(0);          // kurze Pause
47
    B();
48
    _delay_ms(0);          // kurze Pause
49
    C();
50
    _delay_ms(0);          // kurze Pause
51
   
52
   
53
    _delay_ms(3000); // wart mal ab...
54
  }
55
  _delay_ms(100);
56
}

Der aktuelle Stand (im Testaufbau ohne Koppelkondensatoren).
Buzzer= PH32
Input= TP1
(Jumper für Umschaltung des Tons= PH28)

von Nemopuk (nemopuk)


Lesenswert?

Fehler 1)
Ich bezweifle, das die Diode an der Stelle Sinn ergibt.

Du benutzt die Ausgänge offenbar als H-Brücke, um Wechselspannung zu 
erzeugen. Mit der Diode schließt du aber jede zweite Halbwelle kurz.

Fehler 2)
Deine Kommentare zur Tonsequenz und "kurze Pause" stimmen nicht. 0 ms 
ist effektiv keine Pause.

Fehler 3)
Diese Zeile gehört bei den drei Tonausgaben gelöscht:
1
DDRB = 0x03; // B1 und B0 werden im Gegentakt aktiviert

Du gibst dort zuerst zwei Impulse aus, und schaltest erst danach die 
Ausgänge ein. Das ist sinnlos. Stattdessen würde ich die Ausgänge vor 
der Tonausgabe aktivieren, und danach wieder deaktivieren. Ich habe 
das in meinem Code-Beispiel (Punkt 6) einfließen lassen. Siehe unten.

Fehler 4)
Deine direkten Zugriffe auf PORTB deaktiveren als Seiteneffekt den 
Pull-Up Widerstand des Eingangs:
1
    PORTB = 0x01;
2
    ...
3
    PORTB = 0x02;

- Bei Ausgängen bestimmen die Bits von PORTB, ob die Ausgang HIGH oder 
LOW sein sollen.
- Bei Eingängen bestimmen die Bits von PORTB, ob der interne Pull-Up 
Widerstand aktiviert werden wird.

Da in dieser Befehlssequenz das Bit 2 immer 0 ist, schaltest du den 
Pull-Up vom Eingang PB2 ungewollt wieder aus! Die zweite Tastenabfrage, 
die gleich in Punkt 6 eingeführt wird, würde so nicht funktionieren. Der 
Pull-Up muss eingeschaltet bleiben.

Außerdem schlage ich die Nutzung von Binärzahlen vor, dann muss man 
nicht von Hexadezimal im Kopf umrechnen muss (ist Geschmackssache).

Korrektur:
1
    PORTB = 0b00000101;
2
    _delay_us(2800);
3
    PORTB = 0b00000110;
4
    _delay_us(2800);

Jetzt ist das Bit für PB2 (Pull-Up) immer 1 und nur die Bits für PB1 und 
BP1 wechseln zwischen HIGH und LOW.

Fehler 5)
Dein Timing für die Tonerzeugung kann ich nicht nachvollziehen. Nehmen 
wir als Beispiel den Ton C (A und B sind ebenso betroffen):
1
void C (void) {
2
  for (int i = 0; i < 10; i++) { // B: 3k2Hz, 50ms
3
    PORTB = 0b00000101;
4
    _delay_us(2800);
5
    PORTB = 0b00000110;
6
    _delay_us(2800);
7
  }
8
}

2·2800 µs = 5600 µs
1/5600 µs = 179 Hz

Wie kommst du auf 3k2Hz?

Punkt 6)
Damit sich deine Tonsequenz bei gedrückt gehaltenem Taster nicht endlos 
wiederholt, kannst zu zum Schluss darauf warten, dass der Button wieder 
los gelassen wird.
1
void loop()
2
{
3
  // wenn Button gedrückt, dann
4
  if (digitalRead(button_pin) == LOW)
5
  {
6
    
7
    // Ausgänge aktivieren
8
    DDRB = 0b00000011; 
9
10
    // Tonsequenz abspielen
11
    A();
12
    B();
13
    C();
14
15
    // Ausgänge deaktivieren
16
    DDRB = 0b00000000; 
17
    
18
    // solange Button immer noch gedrückt ist
19
    while (digitalRead(button_pin) == LOW) {
20
       // tue nichts
21
    }
22
23
    // Button entprellen
24
    _delay_ms(50);
25
  }  
26
}

Das kleine Delay am Ende ist notwendig, weil der Kontakt des Taster beim 
Loslassen schwingt. Siehe dazu den einleitenden Text von 
https://www.xplore-dna.net/mod/page/view.php?id=1458

Ohne Delay würde die Tonsequenz manchmal beim Loslassen des Buttons 
erneut starten. Durch das Delay wird die nächste if-Abfrage nach dem 
Loslassen lange genug verzögert, so das die Schwingung zwischenzeitlich 
abklingen kann.

Punkt 7:
Da du Arduino nutzt, könntest du die Ausgänge ebenfalls mit PinMode 
konfigurieren, anstatt direkt auf Register DDRB zuzugreifen:
1
    // Ausgänge aktivieren
2
    pinMode(0, OUTPUT);
3
    pinMode(1, OUTPUT);

und
1
    // Ausgänge deaktivieren
2
    pinMode(0, INPUT);
3
    pinMode(1, INPUT);

Ich fände das eleganter, auch wenn es funktional keinen Unterschied 
macht.

: Bearbeitet durch User
von Nemopuk (nemopuk)


Lesenswert?

Nemopuk schrieb:
> Jetzt ist das Bit für PB2 (Pull-Up) immer 1 und nur die Bits für PB1 und
> BP1 wechseln zwischen HIGH und LOW.

Korrektur eines Tippfehlers:

> Jetzt ist das Bit für PB2 (Pull-Up) immer 1 und nur die Bits für PB1 und
> PB0 wechseln zwischen HIGH und LOW.

Noch was:
Wenn du die Ausgänge wie oben vorgeschlagen nach der Tonsequenz wieder 
deaktivierst, brauchst du keine Kondensatoren mehr am Schallwandler.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich habe da mal was zusammengehackt. Morgen gibts den Schaltplan und den 
Code... ;-)

Nemopuk schrieb:
> Da du Arduino nutzt, könntest du die Ausgänge ebenfalls mit PinMode
> konfigurieren, anstatt direkt auf Register DDRB zuzugreifen:
Dann reicht wegen der umfangreichen Arduino-Libs aber wieder der 
Speicherplatz nicht aus.

Beitrag #7933183 wurde vom Autor gelöscht.
von Nemopuk (nemopuk)


Lesenswert?

>> Da du Arduino nutzt, könntest du die Ausgänge ebenfalls mit PinMode
>> konfigurieren, anstatt direkt auf Register DDRB zuzugreifen:


Lothar M. schrieb:
> Dann reicht wegen der umfangreichen Arduino-Libs aber wieder der
> Speicherplatz nicht aus.

Wirklich? pinMode() nutzt er ja bereits in setup().

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

Lothar M. schrieb:
> Ich habe da mal was zusammengehackt. Morgen gibts den Schaltplan
> und den
> Code... ;-)
>
Ich vermisse immer noch den Klang vom Dreiklang. (siehe Betreff 
Zeile...)

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Esmu P. schrieb:
> Ich vermisse immer noch den Klang vom Dreiklang.
Man könnte zwar auch noch einen Dreiklang reinprogrammieren, aber dem TO 
gehts eigentlich nur um Beep.mp3 und Beep2.mp3...

Im Anhang der Code (samt Schaltplan), der 362 Bytes braucht und einen 
Tiny 85 zu 4,4 % füllt.

Das Programm ist so aufgebaut, dass gleich nach Powerup der mit PB2 
ausgewählte Ton gespielt wird, und danach wieder bei jedem Tastendruck 
an PB3.

In der Entwicklungsphase habe ich zur Lautstärkereduzierung dem 
Lautsprecher einen 220 Ohm Widerstand in Reihe geschaltet (damit klappt 
das Flashen tadellos). Nach Beendigung der Entwicklung muss der für 
maximale Lautstärke natürlich überbrückt werden.

: Bearbeitet durch Moderator
von Jonny O. (-geo-)


Lesenswert?

@Lothar,

Danke, dass du dem TO so gut geholfen hast. Das finde ich gut. Ich habe 
nur eine sehr kleine Anmerkung von meiner Seite zum Code. Da ich selber 
versuche meinen Code möglichst sauber zu formulieren (und mir zwei 
Sachen aufgefallen sind). Vielleicht kannst du meine Kommentare selbst 
noch kommentieren (ev. ist es ja auch Murks was ich schreibe ^^)


1: Direkte Zuweisung an einen ganzen Port:
------------------------------------------

Beispiel: PORTB = 0b1101;

Das finde ich generell nicht so gut. Ich würde grundsätzlich das 
Konstrukt wählen bei dem gezielt nur der gewünschte Pin gesetzt wird.

also so:
PORTB |= (1<< PB0);
PORTB &= ~(1 << PB1);

Der Vorteil ist, dass man, wenn man später noch andere Pins von PORTB 
nutzen will diese nicht versehentlich überschreibt. Ich habe mir das 
grundsätzlich so angewöhnt.

2: Magic Numbers vermeiden
--------------------------

Ich würde Pins immer als Defines oben im Code definieren:

#define BUZZER_PIN_A PB0
#define BUZZER_PIN_B PB1

Das war nur mein Senf zum Code, den ich nicht als Kritik verstanden 
wissen will ^^

Grüße,

von BirnKichler S. (Firma: privat) (max707)


Lesenswert?

+1

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Jonny O. schrieb:
> 1: Direkte Zuweisung an einen ganzen Port
Das ist hier kein Problem, weil der µC nur genau für diese Anwendung 
verwendet werden wird.

> 2: Magic Numbers vermeiden
> Ich würde Pins immer als Defines oben im Code definieren
Würde ich auch, nur passt dann der Code nicht mehr auf 1 
Bildschirmseite. Und nach meiner Erfahrung fangen die Probleme an, wenn 
das nicht mehr der Fall ist... ;-)

Oder andersrum: natürlich kann man am Codingstyle noch was drehen, das 
Programm wird dadurch aber nicht schneller oder signifikant 
übersichtlicher.

> also so: PORTB |= (1<< PB0); PORTB &= ~(1 << PB1);
Wenn schon, dann würde ich hier 3 Defines machen und die dann zusammen 
mit der PinToggle-Funktion über das PIN-Register verwenden... ;-)
1
#define Spk_hilo 0b11111110
2
#define Spk_tgl  0b00000011
3
#define Spk_off  0b11111100
4
5
: 
6
  PORTB |= Spk_hilo;
7
  for(int i=83; i>0; i--) {
8
    PINB = Spk_tgl;     // toggle Speaker Pins
9
    _delay_us(5000);
10
    for (int j=0; j<i; j++) _delay_us(72);
11
    PINB = Spk_tgl;     // toggle Speaker Pins
12
    _delay_us(1000);
13
  }
14
  PORTB &= Spk_off;
15
:

EDIT: SW für 3 Beeps angehängt

: Bearbeitet durch Moderator
von Alexander H. (alexander_h732)


Lesenswert?

Danke Lothar, ich hab das Ganze eben getestet und es läuft einwandfrei. 
👍
Bitte gib mir nochmal deine PayPal Mail für die Kaffekasse.
Nach dem Beep1 muss ich mal schauen, ob nicht ein kurzes Delay besser 
klingt. Da ich im 2Hz Takt einschalte, klingt die Tonfolge mit Pause 
wohl besser.
Beep2 ist (trotz Frequenzgang des buzzers) ebenfalls klasse geworden!

Zwei Fragen hätte ich noch:
wird da der interne Pullup verwendet (falls ja, woran erkennt man das im 
Code?)?
Da ich evtl. auf die Koppel-Cs verzichten kann: ist es ein größerer 
Aufwand, wenn man das mit der Abschaltung der Ausgänge noch einfügt?

von Axel R. (axlr)


Lesenswert?

Schön für'n Alexander, dass er nun was funktionierendes zur Hand, 
großartig.

Leider versteht er immer noch nix, von dem, was er eigentlich vor 
hat(te).
Ich wollte das mit dem PIN Toggle via PINB auch vorschlagen, habe es 
absichtlich bleiben gelassen, weil es halt verdammt kompliziert für nen 
Anfänger (nicht böse gemeint) aussieht.

Wenn Du nach jeder Tonausgabe am Ende PORTB=0 einträgst, liegen beide 
Pins auf Masse und es kann kein Strom durch den Lautsprecher fließen.
Jetzt wird als nächstes die Frage gestellt, WANN die Tonausgabe zu Ende 
ist, also an welcher Stelle im Programm.

edit: zur Hand hat

: Bearbeitet durch User
von Peter F. (toto)


Lesenswert?

Alexander H. schrieb:
> ich bin auf der Suche nach einer Schaltung, die an einem passiven
> Mini-Piepser(„magnetic buzzer“) eine Art Dreiklang(varierenden Klang)

Du meinst eine Piezo-Piepser? Mich erschrecken die vielen Antworten. Ist 
das irgendwie ein Rätsel der Elektrotechnik, diesen lächerlichen "Beep" 
zu erzeugen?

von Nemopuk (nemopuk)


Lesenswert?

Peter F. schrieb:
> Du meinst eine Piezo-Piepser? Mich erschrecken die vielen Antworten.

Hättest du sie mal gelesen. Mit der Rückfrage bist du viel zu spät dran. 
Es geht auch nicht um irgend einen "lächerlichen beep" sondern einen 
ganz bestimmten nebst Ablaufsteuerung. Dazu kommt, dass das jemand bauen 
will, der wenig Ahnung von Elektronik hat und sich zum ersten mal ans 
Programmieren heran wagt. Also ein bisschen mehr Respekt bitte!

von Peter F. (toto)


Lesenswert?

Nemopuk schrieb:
> Also ein bisschen mehr Respekt bitte!

Entschuldigung.

von M. G. (t1nk3r)


Angehängte Dateien:

Lesenswert?

Esmu P. schrieb:
> Ich vermisse immer noch den Klang vom Dreiklang.

Kein Dreiklang, aber 3-Tonruf (wie SAA1094-2/U4076B, КР1008ВЖ4) 
angehängt.

von Alexander H. (alexander_h732)


Lesenswert?

Hallo,

hat hier jemand schon bemerkt, dass die Eingänge der Attinys sehr 
empfindlich sind? Bei mir hat teilweise ein Lichtschalter gereicht, um 
einen Ton auszulösen. Angeschlossen war nur 3-5cm Kabel.
Der interne Pullup scheint sehr schwach (wohl 30K?).
Mit 5K Ohm externem Pullup scheint es jetzt zu funktionieren. Auch ein 
10K Serienwiderstand hatte ein bisschen Verbesserung gebracht.
Wie genau schalte ich den internen PullUp für PB2 im Code korrekt wieder 
ab?
https://www.mikrocontroller.net/attachment/highlight/679005
Ich hab es damit probiert, bin mir aber nicht sicher:
1
int main(void)
2
{
3
    PORTB = 0b11000; // PB2..4 Eingang mit Pullup, PB1,0 = Lautsprecher Gegentakt
Beim Nachmessen hab ich alles Mögliche an Spannungen zwischen PB2 und 
GND messen können, aber vielleicht ist das normal, da der Eingang dann 
floated?

Ich wollte den drei Tönen noch je 1000ms delay anfügen. Aber dabei gibt 
es das Problem, dass dann verzögert abgeschaltet wird (führt zu 
Knacken).

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Ich wollte den drei Tönen noch je 1000ms delay anfügen. Aber dabei gibt
> es das Problem, dass dann verzögert abgeschaltet wird (führt zu
> Knacken).
Zeig den fraglichen Code.

> Beim Nachmessen hab ich alles Mögliche an Spannungen zwischen PB2 und
> GND messen können, aber vielleicht ist das normal, da der Eingang dann
> floated?
Ja, das ist wie wenn du die Tastkopfspitze irgendwo dranhältst.

> Wie genau schalte ich den internen PullUp für PB2 im Code korrekt wieder
> ab?
Indem du ihn gleich zu Anfang nicht einschaltest. Aber wenn du extern 
sowieso einen Pullup dranhängst, dann kannst du doch den internen 
einfach parallel aktiv geschaltet lassen. Der frisst ja kein Heu.

> Wie genau schalte ich den internen PullUp für PB2 im Code korrekt wieder
> ab?
Indem du auf das Portregister dieses Eingangs eine 0 schreibst (oder 
eben keine 1).

Alexander H. schrieb:
> Ich hab es damit probiert, bin mir aber nicht sicher
Ich schreibe mal dazu, ewas da passiert:
1
    DDRB  = 0b00011; // PB4,3,2 = Eingang / PB1,0 = Ausgang 
2
    PORTB = 0b11000; // PB4,3 = Eing mit Pullup / PB2 = Eing Hi-Z / PB1,0 = Ausg auf "low" gesetzt
Ein Tipp: nummeriere die Bits immer von links her abfallend. Also nicht 
PB2..4, sondern PB4..2, denn das ist die Reihenfolge der 
Bitpositionen/Wertigkeiten in einem Byte: 76543210

: Bearbeitet durch Moderator
von J. T. (chaoskind)


Lesenswert?

Lothar M. schrieb:
> Indem du auf das Portregister dieses Eingangs eine 0 schreibst (oder
> eben keine 1).

genaugenommen gilt das "oder eben keine 1" nur für das entsprechende Bit 
des Portregisters. Fürs gesamte Register wäre ja auch ne 7 keine 1 und 
trotzdem wär der Pullup für PB2 gesetzt :D ;-).

P.S.
zumindest wimre und Bit2 auch PB2 angesprochen hat, schon länger nichts 
mehr mit "Atmels" gemacht.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ja, klar. Da war ich zu sehr in der FPGA-Welt, da haben "Register" eine 
beliebige Breite. Auch ein einzelnes Flipflop mit 1 Bit ist ein 
"Register".

Aber natürlich muss man beim µC das richtige Registerbit im richtigen 
Registerwort setzen. Dafür sind dann die entsprechenden Bitpositionen im 
Byte zuständig.

Danke für die Klarifizierung.

von Alexander H. (alexander_h732)


Lesenswert?

Nach beep1 ist ein 1000ms delay eingefügt. Das führt zum Knacken.
1
#include <avr/io.h>
2
#define F_CPU 8000000L 
3
#include <util/delay.h>
4
void Beep2 (void) { // Sweep mit 83 Pulsen von 80Hz/12ms nach 166Hz/6ms --> 6ms/83 = 72µs
5
  for(int i=83; i>0; i--) {
6
      PORTB = 0b11101;
7
      _delay_us(5000);
8
      for (int j=0; j<i; j++) _delay_us(72);
9
      PORTB = 0b11110;
10
      _delay_us(1000);
11
  }
12
}
13
void A (void) {
14
    for(int i=0; i<100; i++) { // A: 2kHz, 50ms
15
        PORTB = 0b11101;
16
        _delay_us(250);
17
        PORTB = 0b11110;
18
        _delay_us(250);
19
    }
20
}
21
void B (void) {
22
    for(int i=0; i<160; i++) { // B: 3k2Hz, 50ms
23
        PORTB = 0b11101;
24
        _delay_us(155);
25
        PORTB = 0b11110;
26
        _delay_us(156);
27
    }
28
}
29
void Beep1(void) {
30
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
31
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
32
    A();
33
    _delay_ms(20);          // kurze Pause
34
    A();
35
    _delay_ms(20);          // kurze Pause
36
    B();
37
    _delay_ms(20);          // kurze Pause
38
    _delay_ms(50);          // still
39
    _delay_ms(20);          // kurze Pause
40
    B();
41
    _delay_ms(20);          // kurze Pause
42
    A();
43
    _delay_ms(1000);          // kurze Pause
44
}
45
void C (void) {
46
    for(int i=0; i<227; i++) { // A: 2k2Hz, 100ms
47
        PORTB = 0b11101;
48
        _delay_us(220);
49
        PORTB = 0b11110;
50
        _delay_us(220);
51
    }
52
}
53
void Beep3(void) {
54
    // Ton: Frequenz 2k2Hz Dauer 100ms, 
55
    // Sequenz:  C,25ms,C,25ms,C,40ms,C
56
    C();
57
    _delay_ms(25);          // kurze Pause
58
    C();
59
    _delay_ms(25);          // kurze Pause
60
    C();
61
    _delay_ms(40);          // längere Pause
62
    C();
63
}
64
int main(void)
65
{
66
    PORTB = 0b11100; // PB2..4 Eingang mit Pullup, PB1,0 = Lautsprecher Gegentakt
67
    DDRB  = 0b00011;  
68
    while(1)
69
    {
70
        _delay_ms(100);                        // zur "Entprellung" kurz warten
71
        while ((PINB&0b00100)==0b00100) {}     // warten, solange Start = hi
72
                                               //   PB4   PB3
73
        if ((PINB&0b11000)==0b00000) Beep3();  //    0     0  Beep3            
74
        if ((PINB&0b11000)==0b10000) Beep2();  //    1     0  Beep2            
75
        if ((PINB&0b11000)==0b01000) Beep3();  //    0     1  Beep3      
76
        if ((PINB&0b11000)==0b11000) Beep1();  //    1     1  Beep1      
77
        PORTB = 0b11100;                       // Gegentaktausgänge abschalten
78
        while ((PINB&0b00100)!=0b00100) {}     // Warten, solange Start = lo
79
    }                      
80
}

Ok, was bedeutet denn PB2 = Eing Hi-Z? Ich dachte dass man damit 
vielleicht den internen Pullup abschalten könnte (deswegen mein 
Vorschlag, die dritte Stelle von rechts =PB2 > von 1 auf 0). Falls das 
korrekt ist: wars das dann, oder fehlt noch etwas zur Abschaltung?

Beim Basteln ist mir noch eingefallen, dass es praktisch wäre, die 
Mutefunktion (Resetpin auf GND) per LED zu signalisieren (LED an=Attiny 
Ein). Am Resetpin liegt ja normalerweise Vcc an (hier 2,8V). Leider ist 
die Spannung nicht belastbar und die LED glimmt nur minimal. Kann man 
das auf einfache Weise per Software lösen, oder wäre eine Lösung mit 
Transistor hier besser?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dann muss eben **vor** dieses eingefügte delay() die Zeile zum 
Abschalten der Ausgänge rein. Also so:
1
void Beep1(void) {
2
:
3
:
4
    A();
5
    PORTB = 0b11100;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
6
    _delay_ms(1000);   // kurze Pause
7
}

Da könntest du mit ein wenig Nachdenken aber auch selber drauf kommen. 
Ich habe die Kommentare nicht für mich da reingeschrieben...

BTW: 1s ist eigentlich keine "kurze Pause" mehr. Besser keinen Kommentar 
als einen Falschen.

Alexander H. schrieb:
> die Mutefunktion (Resetpin auf GND) per LED zu signalisieren
An üblichen Mischpulten leuchtet die Mute-LED, wenn der Kanal gemutet 
ist. Dann müsste man die LED einfach nur gegen Vcc anschließen und 
fertig ist die Laube:
1
   5V ------o--------
2
            | LED
3
            V =>
4
            -
5
            |
6
            1k
7
            |
8
            o---- RST
9
            |
10
           \
11
            |
12
  GND ------o--------

> (LED an = Attiny Ein)
Wenn die "Mute"-LED aber irreführenderweise leuchten soll, so lange Töne 
kommen können, dann musst du nur ein wenig tiefer in die 
Widerstands-Trickkiste greifen:
1
   5V ------o--------
2
            |
3
           220
4
            |
5
            o-----o-- RST
6
            |     | 
7
            |    1k 
8
            |     |
9
           \      V =>
10
            |     -  LED
11
            |     |
12
  GND ------o-----o--

: Bearbeitet durch Moderator
von Alexander H. (alexander_h732)


Lesenswert?

Ok klasse, die Variante mit Mute EIN=LED AN gefällt mir sogar noch 
besser, das macht Sinn.
Ich hab noch ein kurioses Problem entdeckt, denn wenn ich das so richtig 
umgesetzt habe, kommt es beim Beep3 zu einem Aufhänger, d.h. der Buzzer 
tickt nur noch im 1Hz Takt. Das passiert aber nur bei Beep3. 
Wahrscheinlich hab ich irgendwie eine Zeile falsch eingerückt, anders 
kann ich mir das nicht erkären. Auf der Arduino IDE sieht das eigentlich 
korrekt aus.
Der interne Pullup an PB2 ist nun ausgeschaltet?
1
#include <avr/io.h>
2
#define F_CPU 8000000L 
3
#include <util/delay.h>
4
5
void Beep2 (void) { // Sweep mit 83 Pulsen von 80Hz/12ms nach 166Hz/6ms --> 6ms/83 = 72µs
6
  for(int i=83; i>0; i--) {
7
      PORTB = 0b11101;
8
      _delay_us(5000);
9
      for (int j=0; j<i; j++) _delay_us(72);
10
      PORTB = 0b11110;
11
      _delay_us(1000);
12
      PORTB = 0b11100;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
13
      _delay_ms(1000);    // Pause
14
  }
15
}
16
17
18
void A (void) {
19
    for(int i=0; i<100; i++) { // A: 2kHz, 50ms
20
        PORTB = 0b11101;
21
        _delay_us(250);
22
        PORTB = 0b11110;
23
        _delay_us(250);
24
    }
25
}
26
27
void B (void) {
28
    for(int i=0; i<160; i++) { // B: 3k2Hz, 50ms
29
        PORTB = 0b11101;
30
        _delay_us(155);
31
        PORTB = 0b11110;
32
        _delay_us(156);
33
    }
34
}
35
36
void Beep1(void) {
37
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
38
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
39
    A();
40
    _delay_ms(20);          // kurze Pause
41
    A();
42
    _delay_ms(20);          // kurze Pause
43
    B();
44
    _delay_ms(20);          // kurze Pause
45
    _delay_ms(50);          // still
46
    _delay_ms(20);          // kurze Pause
47
    B();
48
    _delay_ms(20);          // kurze Pause
49
    A();
50
    PORTB = 0b11100;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
51
    _delay_ms(1000);   // Pause
52
}
53
54
void C (void) {
55
    for(int i=0; i<227; i++) { // A: 2k2Hz, 100ms
56
        PORTB = 0b11101;
57
        _delay_us(220);
58
        PORTB = 0b11110;
59
        _delay_us(220);
60
    }
61
}
62
63
void Beep3(void) {
64
    // Ton: Frequenz 2k2Hz Dauer 100ms, 
65
    // Sequenz:  C,25ms,C,25ms,C,40ms,C
66
    C();
67
    _delay_ms(25);          // kurze Pause
68
    C();
69
    _delay_ms(25);          // kurze Pause
70
    C();
71
    _delay_ms(40);          // längere Pause
72
    C();
73
    PORTB = 0b11100;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
74
    _delay_ms(1000);    // Pause
75
}
76
77
int main(void)
78
{
79
    PORTB = 0b11000; // PB2 Eingang Hi-Z, PB1,0 = Lautsprecher Gegentakt
80
    DDRB  = 0b00011;  
81
    while(1)
82
    {
83
        _delay_ms(100);                        // zur "Entprellung" kurz warten
84
        while ((PINB&0b00100)==0b00100) {}     // warten, solange Start = hi
85
                                               //   PB4   PB3
86
        if ((PINB&0b11000)==0b00000) Beep3();  //    0     0  Beep3            
87
        if ((PINB&0b11000)==0b10000) Beep2();  //    1     0  Beep2            
88
        if ((PINB&0b11000)==0b01000) Beep3();  //    0     1  Beep3      
89
        if ((PINB&0b11000)==0b11000) Beep1();  //    1     1  Beep1      
90
        PORTB = 0b11100;                       // Gegentaktausgänge abschalten
91
        while ((PINB&0b00100)!=0b00100) {}     // Warten, solange Start = lo
92
    }                      
93
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Der interne Pullup an PB2 ist nun ausgeschaltet?
Nur kurz, denn du schaltest ihn ja bald wieder ein.
Überall wo auf den PORTB geschrieben wird, muss das Bit 2 auf 0 gesetzt 
sein:
1
PORTB = 0b11100;  ==>  PORTB = 0b11000;
2
3
PORTB = 0b11101;  ==>  PORTB = 0b11001;
4
5
PORTB = 0b11110;  ==>  PORTB = 0b11010;

Alexander H. schrieb:
> Wahrscheinlich hab ich irgendwie eine Zeile falsch eingerückt
Einrückungen sind dem Compiler egal, wir sind ja nicht bei Python. Du 
kannst das Programm auch komplett in 1 lange Zeile schreiben:
1
void C (void) { for(int i=0; i<227; i++) { PORTB = 0b11101; _delay_us(220); PORTB = 0b11110; _delay_us(220); } }
Nur bei Doppelstrichkommentaren klapperts dann... ;-)

> Wahrscheinlich hab ich irgendwie eine Zeile falsch eingerückt, anders
> kann ich mir das nicht erkären.
Wohl dem, der das Programm vor der letzten Änderung gespeichert hat und 
einen Filecompare machen kann.

: Bearbeitet durch Moderator
von Alexander H. (alexander_h732)


Lesenswert?

Ich habs jetzt eingrenzen können. Es war natürlich Beep2 gemeint, sorry.
Sobald die zwei Zeilen dazukommen, spielt der Ton nicht mehr.

Das Original läuft:
1
void Beep2 (void) { // Sweep mit 83 Pulsen von 80Hz/12ms nach 166Hz/6ms --> 6ms/83 = 72µs
2
  for(int i=83; i>0; i--) {
3
      PORTB = 0b11101;
4
      _delay_us(5000);
5
      for (int j=0; j<i; j++) _delay_us(72);
6
      PORTB = 0b11110;
7
      _delay_us(1000);
8
  }
9
}

Und so gehts nicht mehr:
1
void Beep2 (void) { // Sweep mit 83 Pulsen von 80Hz/12ms nach 166Hz/6ms --> 6ms/83 = 72µs
2
  for(int i=83; i>0; i--) {
3
      PORTB = 0b11101;
4
      _delay_us(5000);
5
      for (int j=0; j<i; j++) _delay_us(72);
6
      PORTB = 0b11110;
7
      _delay_us(1000);
8
      PORTB = 0b11000;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
9
     _delay_ms(1000);    // Pause
10
  }
11
}

Lothar M. schrieb:
> Überall wo auf den PORTB geschrieben wird, muss das Bit 2 auf 0 gesetzt
> sein:

Ja, das hab ich mir vorhin auch schon gedacht. :)


Edit:
Ich glaub ich habs raus. So scheint es zu funktionieren.
Kann man das so machen?
1
void Beep2 (void) { // Sweep mit 83 Pulsen von 80Hz/12ms nach 166Hz/6ms --> 6ms/83 = 72µs
2
  for(int i=83; i>0; i--) {
3
      PORTB = 0b11101;
4
      _delay_us(5000);
5
      for (int j=0; j<i; j++) _delay_us(72);
6
      PORTB = 0b11110;
7
      _delay_us(1000);
8
  } {
9
10
      PORTB = 0b11000;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
11
      _delay_ms(1000);   // Pause
12
  }
13
}

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Hat hier jemand eine Erklärung für das Verhalten des Attiny45?
Scheinbar kommt der uC mit dem Abschalten nach diesem speziellen Ton 
nicht klar?
Das führt zum Ticken des Lautsprechers und hört sich an, als ob der 
Lautsprecher immer wieder versucht, den Ton zu starten, aber abbricht 
und dauert ca. 30s, bis es ganz aufhört.
Als Abblock Cs hab ich 100nF und 10uF Kerkos verwendet.
Warum reichen zwei geschweifte Klammern zwischen den Programmteilen aus, 
um das Problem zu beseitigen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> Und so gehts nicht mehr
Klar, damit hast du die Zeitschleife der Tonausgabe von 12..6ms auf 
1012..1006ms verlängert und damit die ausgegebene Frequenz von 80..166 
Hz auf ca. 1 Hz reduziert.

> Kann man das so machen?
Man kann die unnötigen Klammern weglassen:
1
void Beep2 (void) { // Sweep mit 83 Pulsen von 80Hz/12ms nach 166Hz/6ms --> 6ms/83 = 72µs
2
  for(int i=83; i>0; i--) {
3
      PORTB = 0b11101;
4
      _delay_us(5000);
5
      for (int j=0; j<i; j++) _delay_us(72);
6
      PORTB = 0b11110;
7
      _delay_us(1000);
8
  }
9
  PORTB = 0b11000;   // vor der Pause: Ausgänge auf gleichen Pegel        
10
  _delay_ms(1000);   // Pause
11
}

Alexander H. schrieb:
> Warum reichen zwei geschweifte Klammern zwischen den Programmteilen aus,
> um das Problem zu beseitigen?
Es sind wie gesagt nicht die Klammern, sondern die Position, an der du 
fehlerhafterweise die 1s Pause eingefügt hast: mitten in die Schleife 
der Tonerzeugung rein, statt erst danach.

> als ob der Lautsprecher immer wieder versucht, den Ton zu starten, aber
> abbricht und dauert ca. 30s, bis es ganz aufhört.
Es dauert genau 83s, denn so soft wird die Schleife durchlaufen.

: Bearbeitet durch Moderator
von Alexander H. (alexander_h732)


Lesenswert?

Lothar M. schrieb:
> Es sind wie gesagt nicht die Klammern, sondern die Position, an der du
> fehlerhafterweise die 1s Pause eingefügt hast: mitten in die Schleife
> der Tonerzeugung rein, statt erst danach.

Danke für die Erklärung!
Alles klar. :) Da der Ton eher niederfrequent ist, dachte ich an 
Stromaufnahme oder Abblock Cs.

Lothar M. schrieb:
>> die Mutefunktion (Resetpin auf GND) per LED zu signalisieren
> An üblichen Mischpulten leuchtet die Mute-LED, wenn der Kanal gemutet
> ist. Dann müsste man die LED einfach nur gegen Vcc anschließen und
> fertig ist die Laube:

An der Stelle ist es doch auch egal, ob die LED mit einem Bein an Reset 
hängt, sprich der 1k Vorwiderstand gegen Vcc liegt, oder andersherum, 
richtig? Richtung Resetpin fließt 0,1mA.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> egal, ob die LED mit einem Bein an Reset hängt, sprich der 1k
> Vorwiderstand gegen Vcc liegt, oder andersherum, richtig?
Stichwort: Reihenschaltung.
In einer Reihenschaltung aus Widerstand und LED ist es egal, in welcher 
Reihenfolge die Bauteile angeordnet sind.

> Richtung Resetpin fließt 0,1mA.
Das würde ich jetzt als Messfehler einstufen. Denn
1. der Reset-Pin ist hochohmig, da fließt kein Strom rein
2. bei 0,1mA würde eine zeitgemäße LED erkennbar leuchten

Ein Tipp: miss die Spannung, statt den Strom zu messen. Wenn in dieser 
Schaltung der Reset-Pin bei nicht gedrücktem Taster 5V hat, dann fließt 
kein Strom durch den Widerstand und die LED, denn dann ist Ur = 0V und 
damit Ir = 0V/1k = 0mA:
1
   5V ------o--------
2
            | LED
3
            V =>
4
            -
5
            |
6
            1k
7
            |
8
            o---- RST
9
            |
10
           \
11
            |
12
  GND ------o--------

Denn wenn Strom durch die LED fließen würde, dann würden an ihr 1,5V 
abfallen und somit wäre am Reset-Pin nur noch höchstens 3,5V.

von Alexander H. (alexander_h732)


Lesenswert?

Lothar M. schrieb:
>> egal, ob die LED mit einem Bein an Reset hängt, sprich der 1k
>> Vorwiderstand gegen Vcc liegt, oder andersherum, richtig?
> Stichwort: Reihenschaltung.
> In einer Reihenschaltung aus Widerstand und LED ist es egal, in welcher
> Reihenfolge die Bauteile angeordnet sind.

Ok, das macht wohl in der Praxis keinen Unterschied, denn ich messe 
exakt 5V. Ich hatte eher an Störungen/Effekte(es gibt wohl sog. diode 
ringing) am Reset Pin gedacht, wenn die Diode leitet, bzw. dass die 1k 
dann am Resetpin prinzipiell vorteilhaft sein könnten.

Nochmal eine kurze Frage zum Code: PB5 (Reset) ist auch generell per 
internem Pullup auf high, oder? Bei der Schreibweise: PORTB = 0b11101 
würde ich "0b" als 1111101 übersetzen aber eigentlich gibt es ja nur 6 
Bits (PB0-PB5)?
Man sieht ja an Reset oft einen externen Pullup zB. 10K an Vcc und 100nF 
an GND (wahrscheinlich störsicherer?).

von H. H. (hhinz)


Lesenswert?

Alexander H. schrieb:
> Nochmal eine kurze Frage zum Code: PB5 (Reset) ist auch generell per
> internem Pullup auf high, oder?

Ja, als Reset schon.


> Bei der Schreibweise: PORTB = 0b11101
> würde ich "0b" als 1111101 übersetzen aber eigentlich gibt es ja nur 6
> Bits (PB0-PB5)?

"0b" steht für binär. Da PB5 nicht existiert (ist ja als Reset 
konfiguriert), sind natürlich nur 5 Bit nötig.


Alexander H. schrieb:
> Man sieht ja an Reset oft einen externen Pullup zB. 10K an Vcc und 100nF
> an GND (wahrscheinlich störsicherer?).

Ja, der eingebaute Pullup hat bis zu 50kOhm, das ist manchem zu 
hochohmig.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> PORTB = **0b**_11101_ würde ich "0b" als **11**_11101_ übersetzen
Also meinst du, "0b" wäre der Platzhalter für "11"? Oder wie?

H. H. schrieb:
> "0b" steht für binär.
Es ist eine Erweiterung zum C-Standard, in dem "0x" dafür steht dass 
eine "hexadezimale Zahl folgt". "0b" bedeutet also "binäre Zahl folgt".

Das Ganze kann man natürlich nur verstehen, wenn man ein grundlegendes 
Wissen zu den drei wichtigsten Zahlensystemen (dez, bin, hex) hat.

Alexander H. schrieb:
> Man sieht ja an Reset oft einen externen Pullup zB. 10K an Vcc und 100nF
> an GND (wahrscheinlich störsicherer?).
Der Kondensator macht das Ganze störsicher, weil er die Energie eines 
Störimpulses aufnimmt. Siehe den 
Beitrag "Re: Raspberry GPIO Schaltung Taster und Relais". Aber 10nF reichen 
da gut.

: Bearbeitet durch Moderator
von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> hat hier jemand schon bemerkt, dass die Eingänge der Attinys sehr
> empfindlich sind? Bei mir hat teilweise ein Lichtschalter gereicht, um
> einen Ton auszulösen. Angeschlossen war nur 3-5cm Kabel.
> Der interne Pullup scheint sehr schwach (wohl 30K?).

So ist es. Für alles, was die Platine verlässt, sind die internen 
Pull-Ups alleine zu schwach. Ich empfehle, sie für mindestens 1 mA aus 
zu legen. Viele Schaltkontakte brauchen sogar mehr, um langfristig 
zuverlässig zu funktionieren.

Bei langen Leitungen (mehr als 30 cm) ist auch ein Kondensator zum 
Abblocken von HF hilfreich.

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Lothar M. schrieb:
> Also meinst du, "0b" wäre der Platzhalter für "11"? Oder wie?
>
> H. H. schrieb:
>> "0b" steht für binär.
> Es ist eine Erweiterung zum C-Standard, in dem "0x" dafür steht dass
> eine "hexadezimale Zahl folgt". "0b" bedeutet also "binäre Zahl folgt".

Ja, das hatte ich zuerst vermutet. Ok, danke für die Erklärung.

Nemopuk schrieb:
> Bei langen Leitungen (mehr als 30 cm) ist auch ein Kondensator zum
> Abblocken von HF hilfreich.

Ich hab aktuell 5k als Pullup und 2k als Serienwiderstand nahe am 
Attiny, weil das manchmal eine Verbesserung brachte. Aber hin und wieder 
fange ich doch noch Störungen ein (Leitungslänge 10cm). Wie wäre die 
ideale Kombination für gute Störsicherheit (mit C)?
Wie genau wird der C am Eingang verschaltet?

Nochmal kurz zur ursprünglichen Uhrenschaltung
(https://radiokot.ru/circuit/digital/home/215/05.gif):

Um mein Display/Ausgänge des Atmega8 auf einfache Weise auf 
Verdrahtungsfehler zu prüfen, hab ich einfach alle Vcc Verbindungen vom 
Atmega8 aufgetrennt.
In dem Moment sind alle Ausgänge auf high (ich messe 2,0V bei Vcc=2,75V) 
und alle Segmente leuchten statisch. Der Atmega wird nicht warm und es 
fließen laut Multimeter 0,01mA an den Ausgängen.
Der ganze Rest der Schaltung ist aber mit dem Atmega weiterhin 
verbunden.
RESET (hängt mit 10k an Vcc), das kann man wahrscheinlich an Vcc 
belassen.
Gibt es evtl. irgendeine Verbindung, die zu Problemen wie latch up 
führen kann bzw. kann mein Vorgehen den Atmega beschädigen? Oder ist in 
dem Fall ein latch up ausgeschlossen?

EDIT: Die Fotodiode geht direkt an Vcc, hier könnte doch der Eingangspin 
parasitär versorgt werden (messe dort aber nur 0,07mA)? Bei normalem 
Licht hat die LDR einen Widerstand von 5k, aber der fällt bis auf unter 
500 Ohm bei direktem Licht. Google gibt sogar Werte von fast 0 Ohm an. 
Sollte ich für den Fall lieber einen 500 Ohm Vorwiderstand einplanen?

: Bearbeitet durch User
von Nemopuk (nemopuk)


Angehängte Dateien:

Lesenswert?

Alexander H. schrieb:
> Wie wäre die ideale Kombination für gute Störsicherheit (mit C)?

Ich kann dir keine ideale Empfehlung geben. Das hängt von vielen mir 
unbekannten Faktoren ab, und selbst wenn ich sie wüsste, habe ich keine 
Ahnung, wie man es berechnet.

Ich würde einfach ein Oszilloskop mit 1:10 Teiler an den Eingangspin 
hängen und schauen, wie er auf diverse Störungen in direkter Nähe 
reagiert.

> Wie genau wird der C am Eingang verschaltet?

Eine mir vertraute Möglichkeit ist die angehängt.

R1 soll mehr als 1 mA durch den Schaltkontakt fließen lassen, damit er 
langfristig zuverlässig funktioniert (Wetting Current). Je nach Schalter 
kann mehr Strom nötig sein.

R2 beschützt den Mikrochip weitgehend vor Fremdspannung.

R2 + C1 bilden einen Tiefpass, der eventuell eingekoppelte 
Funkstörungen/Radiowellen abblockt. Die Grenzfrequenz ist grob geschätzt 
F = 1/(R·C) also in diesem Fall 450 Hz. Normale Schaltvorgänge sind viel 
langsamer, diese lässt der Filter durch.

von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Nemopuk schrieb:
> Ich würde einfach ein Oszilloskop mit 1:10 Teiler an den Eingangspin
> hängen und schauen, wie er auf diverse Störungen in direkter Nähe
> reagiert.

Danke, guter Tipp! Ich hab vorhin ein bisschen getestet und folgende 
Lösung funktionierte gut.(Anhang). Ich schalte per Atmega mit 2Hz ein. 
Macht die Anordnung so Sinn, oder geht das besser?

von Nemopuk (nemopuk)


Lesenswert?

Alexander H. schrieb:
> Ich schalte per Atmega mit 2Hz ein. Macht die Anordnung so Sinn, oder
> geht das besser?

Verstehe ich nicht. Der gezeichnete Mikrocontroller kann kein ATmega 
sein. Ist der Mikrocontroller die Quelle des Signals? Wenn ja, warum 
diskutieren wir dann über Schaltkontakte an Eingängen?

Gebe dir mal ein bisschen mehr Mühe mit deinen Schaltplänen!

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Der uC in der Skizze soll den Attiny45 zeigen. PB2 ist der Eingang.

H. H. schrieb:
>> Bei der Schreibweise: PORTB = 0b11101
>> würde ich "0b" als 1111101 übersetzen aber eigentlich gibt es ja nur 6
>> Bits (PB0-PB5)?
>
> "0b" steht für binär. Da PB5 nicht existiert (ist ja als Reset
> konfiguriert), sind natürlich nur 5 Bit nötig.

Der Resetpin ist per Fuse gesetzt, richtig? Wie erkennt der Attiny 
intern, dass der Resetpin (+Zustand an RESET=high oder low) gesetzt ist 
(per internem Pullup, oder auf andere Weise?)?
Ich frag mich, ob es dann prinzipiell für den Resetpin die Möglichkeit 
interner/externer Pullups gibt? In dem Fall würde man hier 7 Bits 
reinschreiben, oder?
Wenn man Störungen befürchtet, sollte man wohl besser an allen Eingängen 
und an RESET einen externen Pullup verwenden.
Und an RESET müsste man auch einen 10k an Vcc +100nF and GND vorsehen.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alexander H. schrieb:
> 2k als Serienwiderstand nahe am Attiny, weil das manchmal eine
> Verbesserung brachte.
Ich kann finde keine physikalische Erklärung für diese gefühlte 
Verbeserung.

> hin und wieder fange ich doch noch Störungen ein (Leitungslänge 10cm).
Könnte am restlichen Aufbau liegen...

> Die Fotodiode geht direkt an Vcc, hier könnte doch der Eingangspin
> parasitär versorgt werden (messe dort aber nur 0,07mA)?
Wie denn? Parasitäre Versorgung ist nur möglich, wenn der LDR versorgt 
wird, während der µC nicht versorgt ist. Weil aber beide an den selben 
5V hängen kann da nichts parasitär versorgt werden.

Alexander H. schrieb:
> Wenn man Störungen befürchtet, sollte man wohl besser an allen Eingängen
> und an RESET einen externen Pullup verwenden.
Es ist billiger, wenn man seine Software so schreibt, dass sie mit 
diesen erwarteten Störungen zurechtkommt, denn die Software bestimmt das 
Verhalten auf die Signale an den Eingangspins. Weil man aber am 
Verhalten des Resetpins nichts ändern kann, ist ein 4k7 Pullup und ein 
10nF Kondensator direkt am µC ratsam.

> Ich frag mich, ob es dann prinzipiell für den Resetpin die Möglichkeit
> interner/externer Pullups gibt? In dem Fall würde man hier 7 Bits
> reinschreiben, oder?
Lies das Datenblatt zum µC. Prinzipiell ist der Resetpin ein ganz 
normaler Portpin, den man per Fuse auch auf die Resetleitung des µC 
legen kann. Du kannst ihn sogar als ADC-Eingang nehmen, wenn er als 
Reset konfiguriert ist. Nur wird dann eben bei Eingangsspannungen 
kleiner Ulomax ein Reset ausgelöst.

Alexander H. schrieb:
> Ich hab vorhin ein bisschen getestet und folgende Lösung funktionierte
> gut.(Anhang).
Damit hast du dann am Eingangspin keinen sauberen Lowpegel mehr, sondern 
immer noch 1.4V, wenn 0V am 1k8 anliegen. Aber wie gesagt: du brauchst 
für einen normalen Eingang gar keine zusätzliche Beschaltung, sondern 
neben einer sauberen Verdrahtung bestenfalls ein besseres Programm.

Und für den Resetpin nimm die Schaltung vom Nepomuk ein wenig 
abgewandelt:
1
   5V ------o--------
2
            | LED
3
            V =>
4
            -
5
            |
6
            1k
7
            |
8
            o--10k--o--- RST
9
            |       |
10
           \       === 10n
11
            |       |
12
  GND ------o-------o----
Der 10n Kondensator ist direkt am µC direkt zwischen dessen Reset-Pin 
und GND-Pin.

von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Lothar M. schrieb:
>> Die Fotodiode geht direkt an Vcc, hier könnte doch der Eingangspin
>> parasitär versorgt werden (messe dort aber nur 0,07mA)?
> Wie denn? Parasitäre Versorgung ist nur möglich, wenn der LDR versorgt
> wird, während der µC nicht versorgt ist. Weil aber beide an den selben
> 5V hängen kann da nichts parasitär versorgt werden.

Indem ich nur den Atmega von der Versorgung nehme, kann ich alle 
Segmente aufleuchten lassen.
Wenn ich Vcc1, Vcc2; Avcc und Aref abtrenne und den Rest der Schaltung 
weiter an der Versorgung hängt, tritt theoretisch der Fall ein. Im 
Datenblatt des Atmega steht dazu (unter Maximum Ratings) "voltage on any 
pin except RESET with respect to GND" -0,5V  to Vcc + 0,5V.
Hab am Atmega nachgemessen und an keinem der Pins kommt es zur 
Überschreitung, oder zu Strömen >1mA. Es gibt dann außer am LDR keine 
niederohmige Verbindung zur Versorgung (an der Stelle könnte man 500 Ohm 
einsetzen), also schätze ich, dass das ok ist.

Lothar M. schrieb:
> Damit hast du dann am Eingangspin keinen sauberen Lowpegel mehr, sondern
> immer noch 1.4V, wenn 0V am 1k8 anliegen.

Ja, das stimmt genau. Ungefähr ab der Schwelle reagiert der Attiny.
Ich muss das nochmal genau mit dem Oszi anschauen, was der 
Serienwiderstand überhaupt gegen Störungen nützt.


Lothar M. schrieb:
> Lies das Datenblatt zum µC. Prinzipiell ist der Resetpin ein ganz
> normaler Portpin, den man per Fuse auch auf die Resetleitung des µC
> legen kann.

An den Fuses hab ich nichts geändert, d.h. der uC steht auf 
Standardeinstellung, somit ist die Resetfunktion aktiv.
RSTDISBL=1 (=unprogrammed).
Ich würde nun dem Resetpin einen externen 10k Pullup+10nF gegen GND 
(Standardvariante) geben und parallel generell die internen Pullups 
weglassen.
Dasselbe bei den Tasten (PB3 und PB4), wobei hier wahrscheinlich ein 
Pullup reicht, wegen der Entprellung in Software (die wirkt ja bereits 
gegen Störungen), oder?

Wie würde dazu die Bitfolge aussehen? Einfach nur PB2,3,4,5 auf 0, also 
statt "PORTB = 0b11101" >  "PORTB = 000001"?

Lothar M. schrieb:
> Und für den Resetpin nimm die Schaltung vom Nepomuk ein wenig
> abgewandelt:

Aber in dem Beispiel wird doch der Resetpin nicht dauerhaft per Pullup 
auf Vcc gezogen, da die Diode dazwischen ist?

Im Anhang die Variante mit externen Pullups. Kann ich das so belassen?

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Angehängte Dateien:

Lesenswert?

Ich hab nochmal nachgeschaut und es darf wohl maximal 1mA über die 
Schutzdioden an den I/Os fließen, also ist es sicherer darauf zu 
verzichten.

Die Uhr (https://radiokot.ru/circuit/digital/home/215/) hat in der 
neuesten Firmware u.A. einen 1,9KHz Tastenton (zuschaltbar) bekommen.
Bei Tastendruck wird ein kurzer 1,9kHz Beep ausgegeben, bei Alarm wird 
ein 1,9KHz Rechtecksignal im 2Hz Takt ausgegeben.
Wäre es möglich, beide Töne, Alarm und Tastenton auf dem gleichen 
Lautsprecher auszugeben?

Meine Überlegung:
Damit zwischen Tastenton und Alarm unterschieden werden kann, wollte ich 
zuerst ein Delay von 10s einsetzen. Nach Überschreiten der 10s sollte 
der Alarmton ertönen, solange die Pulse an PB2 unter 10s bleiben, sollte 
der Tastenton aktiv sein. Der Ansatz ist aber nicht praktisch, wenn man 
mal länger als 10s im Menü ist und es verändert die Abstände der 
Alarmtöne. Die Lautstärke bei Tastendruck geht gerade so (mit 
Schottkydiode).
Gibt es eine Möglichkeit, per Software die regelmäßigen 2Hz Pulse (im 
Alarmfall) zu detektieren und somit den Ton bei Tastendruck vom 
2Hz-Alarmton zu unterscheiden?
Oder könnte man das doch an PB2 per RC-Glied filtern?

Folgendes hab ich probiert (Anhang).
Buzzer= PH5 (parallel zum Buzzer hängen noch zwei LEDs).

Der Tastenton funktioniert (während der 5s), also solange PB0 auf high 
gehalten wird(es fließen 36mA und damit wird der Attiny überlastet).
Wahrscheinlich ist das Ganze viel zu kompliziert gedacht?!:)
1
#include <avr/io.h>
2
#define F_CPU 8000000L 
3
#include <util/delay.h>
4
5
void Beep2 (void) { // Sweep mit 83 Pulsen von 80Hz/12ms nach 166Hz/6ms --> 6ms/83 = 72µs
6
  for(int i=83; i>0; i--) {
7
      PORTB = 0b000001;
8
      _delay_us(5000);
9
      for (int j=0; j<i; j++) _delay_us(72);
10
      PORTB = 0b000010;
11
      _delay_us(1000);
12
  }
13
  PORTB = 0b000000;   // vor der Pause: Ausgänge auf gleichen Pegel        
14
  _delay_ms(1000);   // Pause
15
}
16
17
void A (void) {
18
    for(int i=0; i<100; i++) { // A: 2kHz, 50ms
19
        PORTB = 0b000001;
20
        _delay_us(250);
21
        PORTB = 0b000010;
22
        _delay_us(250);
23
    }
24
}
25
26
void B (void) {
27
    for(int i=0; i<160; i++) { // B: 3k2Hz, 50ms
28
        PORTB = 0b000001;
29
        _delay_us(155);
30
        PORTB = 0b000010;
31
        _delay_us(156);
32
    }
33
}
34
35
void Beep1(void) {
36
    // 50ms Ton an, 20ms Pause Tonfrequenz A: 2000Hz Tonfrequenz B: 3200Hz
37
    // Die Sequenz ist: A,A,B,still,B,A Das ganze dauert 6*70ms = 420ms
38
    A();
39
    _delay_ms(20);          // kurze Pause
40
    A();
41
    _delay_ms(20);          // kurze Pause
42
    B();
43
    _delay_ms(20);          // kurze Pause
44
    _delay_ms(50);          // still
45
    _delay_ms(20);          // kurze Pause
46
    B();
47
    _delay_ms(20);          // kurze Pause
48
    A();
49
    PORTB = 0b000000;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
50
    _delay_ms(1000);   // Pause
51
}
52
53
void C (void) {
54
    for(int i=0; i<227; i++) { // A: 2k2Hz, 100ms
55
        PORTB = 0b000001;
56
        _delay_us(220);
57
        PORTB = 0b000010;
58
        _delay_us(220);
59
    }
60
}
61
62
void Beep3(void) {
63
    // Ton: Frequenz 2k2Hz Dauer 100ms, 
64
    // Sequenz:  C,25ms,C,25ms,C,40ms,C
65
    C();
66
    _delay_ms(25);          // kurze Pause
67
    C();
68
    _delay_ms(25);          // kurze Pause
69
    C();
70
    _delay_ms(40);          // längere Pause
71
    C();
72
    PORTB = 0b000000;   // vor der Pause die Ausgänge auf gleichen Pegel schalten        
73
    _delay_ms(1000);    // Pause
74
}
75
76
int main(void)
77
{
78
    PORTB = 0b000000; // PB3..4 Eingang mit Pullup, PB2 Eingang Hi-Z, PB1,0 = Lautsprecher Gegentakt
79
    DDRB  = 0b000011;  
80
    while(1)
81
    {
82
        _delay_ms(100);                        // zur "Entprellung" kurz warten
83
        PORTB = 0b000001;
84
        while ((PINB&0b000100)==0b000100) {}     // warten, solange Start = hi
85
        _delay_ms(5000); 
86
        
87
                                               //   PB4   PB3
88
        if ((PINB&0b011000)==0b000000) Beep3();  //    0     0  Beep3            
89
        if ((PINB&0b011000)==0b010000) Beep2();  //    1     0  Beep2            
90
        if ((PINB&0b011000)==0b001000) Beep3();  //    0     1  Beep3      
91
        if ((PINB&0b011000)==0b011000) Beep1();  //    1     1  Beep1      
92
        PORTB = 0b000000;                       // Gegentaktausgänge abschalten
93
        while ((PINB&0b000100)!=0b000100) {}     // Warten, solange Start = lo
94
    }                      
95
}

: Bearbeitet durch User
von Alexander H. (alexander_h732)


Lesenswert?

Nachtrag: es gibt auch eine Firmware ohne 1,9KHz Rechteck, d.h. bei 
Tastendruck wird nur ein kurzes LOW ausgegeben.
Am logischsten erscheint mir ein zusätzlicher Ton im Programm des Attiny 
(1,9KHz Ton="Beep4"), der nur bei Tastendruck ausgelöst wird.
Wie könnte man die Unterscheidung der Töne realisieren? Leider steht 
kein freier Eingang mehr zur Verfügung.

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.