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
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
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?
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
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
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.
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.
Wastl schrieb: > zum Wegfiltern der Oberwellen. Ich glaub die Tröte die das verlautbaren wird, filtert schon genug.
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.
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
Ich tippe auf nicht ganz perfekten bzw. gut aufgenommenen Sägezahn.
:
Bearbeitet durch User
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
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.
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
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
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
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?
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.
Wenn man den IC noch beschaffen kann wäre das eine Lösung. https://media.elv.com/file/2004_04_02_gs3.pdf
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!
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.
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.
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.
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.
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
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!
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
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
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?
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.
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
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
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.
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
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?
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
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....
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.
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?
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?
Esmu P. schrieb: > Ist die Volks-Verblödung mittlerweile auch hier im Forum angekommen? Das war am 29.08.2016 10:05.
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
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
>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
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
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
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
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
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
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.
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.
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.
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
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.
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.
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?
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
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?
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
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.😊😅
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
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
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.
Wenn du die Arduino IDE verwendest, wirst du das brauchen: https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md
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.
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
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?
Wenn man nichts zum Thema beitragen kann: einfach mal die klappe halten. Stattdessen könntest du dich über den Dativ informieren.
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?
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
Ich habe den Code exakt so übernommen/herauskopiert. Hätte ich irgendetwas anpassen müssen?
Es geht nicht um den Quelltext, sondern um die Board-Einstellungen in der IDE. Die müssen mit der Ziel-Hardware übereinstimmen.
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.
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.
Es blinkt!👍 Hab es nach folgender Anleitung hinbekommen.😉 https://www.instructables.com/Program-an-ATtiny44458485-with-Arduino/
:
Bearbeitet durch User
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
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"
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
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
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
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
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.
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.".
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
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 | :
|
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
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
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
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
Edit: es sind scheinbar doch 1,5-2Hz und damit leider schneller als gedacht.
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
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).
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
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.
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.
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.
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
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.
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.
Alexander H. schrieb: > aber bei Input LOW passiert nichts was hast du erwartet? KI kann nichts werden wenn die natürliche Inteligenz stetig abnimmt.
Genau das hatte ich von „KI“ auch erwartet, daher überrascht mich das nicht.😊
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.
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
Mach bitte wie schon beschrieben die [c]-Tags um den Code.
:
Bearbeitet durch Moderator
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
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
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
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
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
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
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.
Nemopuk schrieb: > Hast du eventuell den > falschen Mikrocontroller in der IDE eingestellt Das wars! Danke. :) Aber dieser Code macht leider garnichts. :(
:
Bearbeitet durch User
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
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.
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
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.
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
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?
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
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); }
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
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
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
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.
SAB0600 ist speziell für 3 Klang Gong, das müsste auch mit 5V funktionieren, habs aber selber noch net probiert...
Kurt schrieb: > SAB0600 ist speziell für 3 Klang Gong, .. und wird von Siemens noch aktiv gefertigt?
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...
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.
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
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
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.
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
Alexander H. schrieb: > Ich hab das Gelesene nicht verstanden und immer noch keine Bilder geliefert!
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.
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.
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.
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. :)
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.
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
Beep.mp3 (33,8 KB) audacity vorgeworfen und die zeitskala angepasst
:
Bearbeitet durch User
Esmu P. schrieb: > Beep.mp3 (33,8 KB) audacity vorgeworfen und die zeitskala > angepasst Und das Forum mit einem weiteren Megabyte voelliger Redundanz geflutet.
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
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.
Ob S. schrieb: ... > > D.h.: Dein Beitrag geht zu 100% am Thema vorbei. Sechs, setzen. gilt nur für dich
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
Nemopuk schrieb: ... > Nach deiner Doku arbeitest du mit 2000 und 3200 Hz. ... Nein, er wünscht sich das nur...
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.
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...
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
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.
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)
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
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
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.
>> 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().
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
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
@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,
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
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?
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
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?
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!
Esmu P. schrieb: > Ich vermisse immer noch den Klang vom Dreiklang. Kein Dreiklang, aber 3-Tonruf (wie SAA1094-2/U4076B, КР1008ВЖ4) angehängt.
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
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
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
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.
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?
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
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 | }
|
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
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
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?
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
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
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.
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?).
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
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
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
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
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.
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?
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
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.





























