Hallo, wenn man einen Taster entprellt, hat man ja immer die klassische Signalfolge: Sagen wir erst mal NULL, dann mehrfach abwechselnd kurze Null und Eins und dann nach einer gewissen Zeit, sagen wir 10-20ms konstant Eins. (Wenn ich es richtig verstanden habe) In meinem Fall habe ich aber das durch einen BC547 verstärkte Signal eines Piezo Kistall-Mikrofons. Bei Geräuschanregung bringt das ein völlig anderes Signal. Ein chaotisches Rauschsignal, dass sich nach der Erregung wieder abschwächt. Also tausende von steigenden und fallenden Flanken, aber eigentlich nie den Zustand, dass es über längere Zeit Eins (oder Null, je nach Widerständen) bleibt. Wie kann man denn so ein Signal entprellen? Mein Signal soll übrigens INT0 triggern. Danke für die entscheidenden trickreichen Hinweise:))) VG Karl
Signal einfach mit Kondensator passender Größe glätten/mitteln?
Gleichrichten und über einen Tiefpass schicken, oder auf einen Spitzenwertdetektor geben wäre eventuell ein Möglichkeit.
>Ein chaotisches Rauschsignal, >dass sich nach der Erregung wieder abschwächt. Also tausende >von steigenden und fallenden Flanken, aber eigentlich nie >den Zustand, dass es über längere Zeit Eins (oder Null, je >nach Widerständen) bleibt. Das nennt man Schall. Wenn du den Mund aufmachst und redest kommt ja auch nicht nur ein Knack raus. >Wie kann man denn so ein Signal entprellen? Pegel messen. Mittel/Spitzen/Effektivwert. Such dir was aus. >Mein Signal soll übrigens INT0 triggern. Such mal nach Klatschschalter.
Mit einem sog. "nachtriggerbaren Monoflop", falls du den Pegel hoch genug bekommst, um den auszulösen. Frank
@Gast >>Signal einfach mit Kondensator passender Größe glätten/mitteln? Derzeit habe ich aus dieser Schaltung: http://www.mikrocontroller.net/attachment/42571/klatschschalter.jpg den Teil aus BC547 und den beiden Widerständen (aber ohne das Poti, dafür aber ein 220K-Widerstand) herausgenommen und alles verlötet. Die Signale werden wunderbar verstärkt und die Empfindlichkeit ist perfekt. Nur halt die vielfachauslösungen stören. Zuerst habe ich mir überlegt, dass ich in der Interupt-Routine direkt nach dem ersten Trigger den betreffenden Interupt sperre und diesen dann beim Timerinterupt, der pünktlich jede Sekunde eintrifft, wieder freigebe. Aber bevor ich das umgesetzt habe, habe ich in diesem Forum gesucht und das scheint wohl nicht so eine gute Idee zu sein, bei diesen hohen Triggerfrequenzen. Wenn ich jetzt hinter der Verstärkerschaltung einen Kondensator parallel zum BC547 Emitter-Kollektoranschluss schalte, dann müsste der Kondensator im Ruhezustand immer schön voll sein, um dann im Moment des Triggers vom leitenden Transistor auf nahezu Null gezogen zu werden. Macht der BC547 dann wieder dicht, könnte ich der Kondensator wieder über den Widerstand oben (wo in der Schaltung das Poti sitzt) wieder aufladen. Je nach Kombination von Kondensatorgröße und Widerstand oben müsste der Kondensator sich dann mehr oder weniger schnell aufladen. Die Berechnung könnte ich nach dem gleichen Verfahren machen, wie im Tutorial zur Hardware-Entprellung. Ist das richtig so? Der Nachteil an der Sache ist der: Wenn der BC547 nicht voll oder nicht lange genug durchschaltet , weil z.B. das Geräusch nur sehr leise oder sehr kurz ist, dann könnte es doch sein, dass er sich bei einem sehr kurzen Impuls nicht weit genug entlädt, um überhaupt ein gültiges Signal für den Controller zu erzeugen, während es ohne Glättung stark genug wäre. @Frank Danke für den Hinweis. Aber diese Schaltung ist mir NOCH zu aufwendig. Erst mal versuchen, ob es nicht auch einfacherere Lösungen gibt. @Holger Wenn ich das Signal gleichrichten muss, gehen durch die Dioden wieder 2*0,7V (Brückengleichrichter) verloren. Dann bin ich ganz schnell wieder unterhalb der Schwelle,bei der der Controller eine Eins erkennen kann. Irgendwie ist mir sowieso nicht klar, dass die Schaltung überhaupt funktionieren kann, weil die Spannung an der Basis muss doch mindestens 0,7V betragen, damit überhaupt ein Steuerstrom fließen kann. ??? Mein Piezo bringt aber nur im Extremfall 0,3V. Bei den Signalen, die ich detektieren will sogar nur paar Millivolt. Eigentlich ein Wunder dass die Schaltung überhaupt funktioniert.
wenn du mal genau schaust, ist da ein Widerstand von 10M...
Vielleicht hättest Du meinen Beitrag aus Deinem anderen Piezo Thread nicht völlig ignorieren sollen.
Stell Dir doch mal die grundsätzliche Frage: Warum willst Du "entprellen"? Entprellen dient dazu: a) kurze Störimpules nicht als Tastendruck auszuwerten, also zu ignorieren b) prellenede Tasten nur einmal als gedrückt zu erkennen Was liegt bei Dir vor? Hast Du einen Signalverlauf, bei dem Deine Schaltung ein High rausgibt, ohne, daß der uP reagieren soll (Fall a)? Denke nach Deiner Beschreibung zu gehen: nein. Fall b liegt vor. Deine Idee den erkannten Interrupt für eine gewisse Zeit zu sperren ist doch nicht schlecht. Ich würd ja keinen Interrupt für so ne Aufgabe verwenden. - im HP ein Port pollen - Signal erkannt - Funktion auslösen - eine Zeitvorgabe starten (Zähler in der HP-Schleife reicht völlig) - Pollen des Eingangs sperren (Variable) - nach Ablauf des Zählers (der Zeit) das Pollen wieder freigeben und gut.
Hallo Kurz, mir ist klar, was entprellen ist. Bei mir gilt Fall B, also eine prellende Taste soll nur einmal erkannt werden. Wobei die prellende Taste (mein verstärktes Piezo-Signal) in kürzester Zeit sehr viele Interupts auslöst (sagen wir 20-30) , wo ich eigentlich nur ein Auslösung haben will. Zwischen zwei Interupts soll mindestens ungefähr eine Sekunde vergehen. Interupts verwende ich deshalb, weil ich die Schaltung an Knopfzellen betreiben muss. Also muss Strom gespart werden, wo es nur geht. Zwischen den sekündlichen Timerereignissen und zwischen Triggern des Piezos sollte der Mü also möglichst schlafen. @ H.j.Seifert: Das ist vielleicht ein eintscheidender Hinweis, warum auch kleinere Spannungen als 0,7V schon verstärkt werden können. Durch die Beiden Widerstände 10M und 220K (in meiner Schaltung) und durch den Innenwiderstand des Piezos wird die Spannung so "vorgeteilt", dass im Ruhezustand des Piezos genau die 0,7V an der Basis anliegen. Wenn an der Spannungsteiler- schaltung, die sich aus den beiden oberen Widerständen und dem Piezo genau die 0,7V an der Basis ergeben, dann müsste jede noch so kleine Spannungsänderung am Piezo bereits eine Änderung des Widerstandes Rce ergeben und das dann wiederum zu einer Veränderung des Spannungspegels am Kollektor ergeben. Ist das so korrekt? Wenn die Schaltung optimal funktionieren sollte, müssten die Widerstände oben genau auf den Innenwiderstand des Piezos abgestimmt werden. Deshalb vielleicht auch das Poti! Ich dachte bisher, das wäre nur die Empfindlichkeitseinstellung. Werde nacher den Gleichstromwiderstand des Piezos ausmessen und berechnen, wie groß die Spannung an der Basis und damit der optimale Widerstand oben sein müsste. (weil ich ja kein Poti hier habe) Travelrec, vielleicht bin ich einfach nicht ahnungshabend genug, um die entscheidenden Punkte zu erkennen. Ich versuche die Entprellung gleich mal mit dem Kondensator parallel zu Kollektor und Ground und schaue mal am Oszi, was dabei rauskommt. Optimal wäre es ja, wenn die Schallsignale in der richtigen Lautstärke es schaffen würden, den Transistor zum Durchschalten zu bewegen, so dass der Kondensator komplett entladen wird, und dieser sich in etwa einer Sekunde wieder aufladen würde.
Der klassische Klatschschalter :) Nimm einen Hochpass (paar kHz), einen Detektor, ein Monoflop, ein T-Flipflop.
Kurz´s Idee ist nicht schlecht und kommt ohne weitere Bauelemente aus. Der erste vom Piezo ausgelöste Interrupt sperrt sich nach seiner Ausführung selber und wird erst nach einer Zeit von hier 1 Sekunde durch einen Timer wieder eingeschaltet. Mein Vorschlag sah das kontrollierte Laden eines Pufferkondensators (mit Einzel- oder Mehrfachpulsen) über eine Diode vor, dessen Spannung für den Fall des Auslösens eines Interruptpins mit einem Transistor oder Komparator hätte aufbereitet werden können. Der Analog-Komparator im Controller kann übrigens auch Interrupte auslösen. Das Piezo selbst muß mit einem hochohmigen Widerstand immer entladen werden, da es sich sonst selber lädt und nach ein paar Pulsen keine Spannung mehr abgibt.
@Travel Rec > Kurz´s Idee ist nicht schlecht und kommt ohne weitere Bauelemente > aus.Der erste vom Piezo ausgelöste Interrupt sperrt sich nach seiner > Ausführung selber und wird erst nach einer Zeit von hier 1 Sekunde > durch einen Timer wieder eingeschaltet. Habe es jetzt auch so gemacht und es entprellt perfekt. Mit meiner momentanen Erfahrung kann ich leider nocht nicht verstehen, warum man von dieser Methode so oft abgeraten bekommt. Ich habe zum Abschalten des Interupts folgendes Codeschnippsel benutzt. Direkt hinter dem Sichern der Register : cli in temp1, GICR ldi temp1, (0 << INT0) out GICR, temp1 sei In der Timerroutine das Gegenstück: cli in temp1, GICR ldi temp1, (1 << INT0) out GICR, temp1 sei Ich würde noch gerne in der Timerroutine überprüfen, ob INT0 aus ist, bevor ich Cli aufrufe. Aber ich finde den Befehl zum Testen, ob das Bit gesetzt ist, nicht. Nicht, dass ausgerechnet in der kurzen Phase zwischen cli und sei ein Signal getriggert und unterschlagen wird.
>in temp1, GICR >ldi temp1, (0 << INT0) Das 'ldi' nach dem 'in' macht keinen Sinn, da es wieder alles überschreibt. Stattdesen schreibe: sbr Templ (1<<Int0) setzt das Bit, cbr Templ (1<<Int0) löscht das Bit. Testen auf Bits geht mit sbrs (skip if bit in register is set) und sbrc (skip if bit in register is cleared).
>Das 'ldi' nach dem 'in' macht keinen Sinn, da es wieder alles >überschreibt. Oh, das ist schlecht. Ich dachte, ich würde das GICR ins Temp1 laden und dort dann das Bit umändern, wobei der Rest unverändert bleiben sollte. >Stattdesen schreibe: sbr Templ (1<<Int0) setzt das Bit, >cbr Templ (1<<Int0) löscht das Bit. Genau das meinte ich eigentlich. >Testen auf Bits geht mit sbrs (skip if bit in register is set) >und sbrc (skip if bit in register is cleared). Ah so. Werde mir das sofort hinter meine Ohren schreiben. Bzw. in meine Datenbank. Ich bedanke mich für Eure vielen Tips und Hinweise. Mein Miniprojekt "Körperschallereignisse messen und die Zeitpunkte (32-Bit-Zahl) ins interne EEPROM schreiben zwecks späterem Auslesen über TTL-UART-USB klappt soweit fehlerfrei. Wenn auch auf Lochraster freiluftverdrahtet: Wenn Profis das sehen würden, würden sie bestimmt einen Lachanfall bekommen. ;))) Als nächstes würde ich noch gerne eine externe RTC und ein AT24C512 (in 3V, falls es das gibt) anbinden, weil die 512Byte EEPROM des Atmega8 doch etwas knapp sind. Und die Zeit als 32 Bitzahl zu speichern erfordert beim Auslesen noch heftige Umrechnngsorgien. Deshalb auch die RTC, die mir hoffentlich genau Datumsangaben, am besten als Datumssstring ausgibt. Außerdem ermöglicht mir eine externe RTC, dass ich auf den Timer verzichten kann, was mir dann wiederum ermöglicht den Powerdown-Modus zu benutzen. Die Anbindung von EEPROM und RTC würde ich dann gerne per I2C machen, wobei ich sagen muss, dass ich davon noch keine Ahnung habe und bestimmt einen neuen Fred eröffnen muss. Und dann müsste ich noch auf SMD umstellen, damit das alles schön klein wird. Danke nochmals und bis zum nächsten Fred. VG Karl
>Wenn auch auf Lochraster freiluftverdrahtet: Wenn Profis das sehen würden, >würden sie bestimmt einen Lachanfall bekommen. ;))) Nana, Profis verdrahten hin und wieder auch erst mal Schaltungsteile auf Lochraster, um die Funktion zu überprüfen. Das sieht auch nicht immer super aus ;-) >Ah so. Werde mir das sofort hinter meine Ohren schreiben. Drück mal im AVR-Studio Assembler-Editor ab und zu auf F1 ;-)
>Mit meiner momentanen Erfahrung kann ich leider nocht nicht verstehen, >warum man
von dieser Methode so oft abgeraten bekommt.
Ein Interrupt ist i.d.R. zu kostbar, um ihn mit einem Taster zu belegen,
den man auch in regelmäßigen Abständen abfragen kann.
Für Aufweckzwecke ist es natürlich legitim, einen Interrupt zu benutzen.
Wenn der Controller aber nicht schlafen geschickt wird, also auch nicht
geweckt werden muss, ist die Verwendung eines Interrupt-Einganges für
einen Taster verschwendung. Die Bedienung eines Tasters durch den
Menschen und die Reaktion des Menschen auf den Tastendruck liegt im
Bereich von Zehntelsekunden...
>warum man von dieser Methode so oft abgeraten bekommt.
Weil Polling einfacher und resourcensparender (externer Interrupt,
Timer) ist und sonst keine gewichtigen Nachteile hat.
Das mit dem Recourcenverbrauch ist einleuchtend. Aber mein Miniprojekt hat ja recourcenmäßig noch genügend Luft. Wenn das also das wichtigste Argument dagegen ist, dann mache ich es wieter so. Habe die Schaltung heute testweise dort installiert, wo sie später auch laufen soll. Die Empfindlichkeit war aber viel zu hoch, so dass so ziemlich alles gezählt wurde, was nicht niet- und nagelfest war. Nun könnte ich durch geschickte Auswahl der Widerstände die Verstärkung des BC547 ja passend einstellen. Aber leider kann ich das nicht ausrechnen. Und Ausprobieren dauert zu lange. Jetzt überlege ich mir, den Piezo, der ja immerhin bis zu 0,3V bringt direkt an den AD-Wandler des Mega8 zu klemmen und den Komparator-Modus zu benutzen, der ja auch Interupts auslösen kann. Dann könnte ich mit einem Poti parallel zum Piezo die Spannung an der Mittelabzapfung die heruntergeteilte Spannung abgreifen. Aber auch hier ist wieder Neuland für mich. Wieder mal mehrere Steuerregister verstehen und so einstellen, dass der Komparator genau das macht, was er soll. Es ist schon ein Kreuz! ;)))
>Jetzt überlege ich mir, den Piezo, der ja immerhin bis zu 0,3V bringt >direkt an den AD-Wandler des Mega8 zu klemmen und den Komparator-Modus >zu benutzen, der ja auch Interupts auslösen kann. Späte Einsicht. Aber damit kannst Du den Controller nicht wecken. Nimm doch eine Kombination aus beidem, den Transistorausgang an den Interruptpin und direkt über Gleichrichter und Schutzbeschaltung an den ADC. Der Interrupt weckt und der ADC mißt.
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.