Hallo! Ich habe meinen uC erst seit ein paar Tagen am laufen .... deshalb bin ich noch nicht sehr erfahren. Ich versuche gerade einen Schalter in ASM zu programmieren. Bei einmaligem betätigen des Tasters (an PD2) soll die LED an gehen, und bei erneutem betätigen wieder aus gehen. Ich habe versucht, das Problem mit Interrupts zu lösen - es funktioniert auch ganz gut, nur dass während der Zeit, während der ich den Taster gedrückt halte, die LED (ganz schnell) ímmer aus und an geschaltet wird. JE nachdem, wann man los lässt wird quasi zufällig entschieden, ob die LED nun an oder aus ist. Wie kann ich nun erreichen, dass der Interrupt bei einmaligem betätigen auch nur einmal aufgerufen wird ?? Danke für eure Hilfe! Steffen
Gut, auf negative Flanke hab ich den Interrupt gestellt - Entprellen ... Sorry, ich habs im Forum schon oft gelesen, aber bisher noch nicht verstanden. Was ist das und wie macht man 's ?? Vielleicht ghast du ein einfaches Beispiel. Danke nochmal für deine Antwort! Steffen
Hallo Steffen, zum Prellen: Wenn ein Schalter ein bzw. ausgeschaltet wird, dann macht er keine scharfe Pegel-Trennung zwischen "ein" und "aus", sondern "zittert" ein wenig waehrend des Schaltvorganges zwischen beiden Zustaenden hin und her. Dies bedeutet, dass der Controller waehrend dem Schaltvorgang nicht nur eine Pegelaenderung mitbekommt, sondern eine ganze Menge, bis der Schaltvorgang abgeschlossen ist. Dies dauert - je nach Schalter - Zeiten im ms-Bereich. Diese vielen Aendrungen bewirken natuerlich auch, dass mehrere Interrupts ausgeloest werden Um dieses Problem zu loesen gibt es im Wesentlichen 2 Varianten: 1. Hardwaremaessig durch eine entsprechende Schaltung ODER 2. durch eine Software-Loesung. Du musst einfach eine Wartezeit mit in deine Interrupt-Routine einbauen, welche dieses Prellen ueberbrueckt. 20ms sind denke ich ein guter Wert. Nach diesem Warten, musst du noch einmal dein Signal abfragen. Es koennte ja sein, dass du eigentlich den Schalter ausschaltest, aber durch das Prellen wieder ein Flankenimpuls generiert wird, obwohl du ihn ja gar nicht moechtest. In Programmform in etwa so: Interrupt-Routine: warte 20 ms (z. B. Schleife) teste ob immer noch Taster gedrueckt wenn ja, gehe weiter wenn nicht, dann beende (reti) - dein Programm - reti Ich hoffe ich konnte dir helfen! Thomas H.
Hi Thomas, danke für deine schnelle Hilfe. Ich habe es probiert, mit 20 ms - funktioniert zwar besser, aber er schaltet troztdem nicht immer korrekt. Deshalb habe ich versucht auf die hardwaremäßige Seite zu gehen. Ich hab einen 10 uF Kondensator zum Schalter parallel geschaltet und erreiche ein ganz gutes Ergebnis - Das Programm funktioniert jetzt. Gibt es noch eine professionellere Lösung das Problem von der Hardware anzugehen, oder sollte man Kondensatoren einer bestimmten Kapazität verwenden? Im Internet habe ich dazu nicht alzu viel aufschlussreiches gefunden. Vielleicht kannst du mir ein wenig weiterhelfen. Gibt es vielleicht schon entprellte Taster? Danke für deine Antwort! Steffen
Hallo Steffen, ich habe gerade einmal in meinen Programmen nachgesehen: ich habe eine Wartezeit von 30 ms genommen und es funktioniert immer ganz gut ohne Kondensatoren. 100%ig sicher bin ich mir jetzt nicht, aber ich habe gehoert, dass die neueren AVR's schon Entprell-Schaltungen integriert haben. Es gibt verschiedene Wege es hardwaremaessig zu loesen. Der Regelfall ist ein RC-Glied oder RS-FlipFlop. Hier sind einige Vorschlaege in Foren diskutiert worden. http://www.mikrocontroller.net/forum/read-1-3715.html#3715 http://www.mikrocontroller.net/forum/read-1-6026.html#6026 Hier findest du eine kurze Zusammenfassung: http://dse-faq.e-online.de/dse-faq.htm#F.29.1 Entprellte Taster direkt gibt es nicht. Es gibt einige je nach Qualitaet, die weniger prellen als die anderen. Ganz vermeiden laesst es sich nicht. Es gibt allerdings einige wenige - teuere -, die im Schaltergehaeuse eine Entprellschaltung integriert haben. Viel Erfolg, Thomas H.
Du darfst natürlich nicht vergessen, das entsprechende Interrupt-Flag innerhalb der Interrupt-Routine am Ende zurückzusetzen. Sonst wird nach Beendigung ein zusätzlicher (zwischengespeicherter) Interrupt ausgelöst.
@thomas: Danke! Ich werd mir mal die Links anschauen ... Mit dem Kondensator funktioniert es ganz gut - und im Moment fallen mir keine Nachteile davon ein ... Nochmals danke! @mikki: Werd ich gern machen, wenn du mir sagst wie ;-) Tut mir leid, aber ich bin eingentlich erst seit gestern in der Materie und blick noch nicht ganz durch! Steffen
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.