Forum: Mikrocontroller und Digitale Elektronik Interrupts


von Steffen Burr (Gast)


Lesenswert?

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

von mikki merten (Gast)


Lesenswert?

Interrupt auf negative Flanke und Routine zum Entprellen nicht 
vergessen.

von Steffen Burr (Gast)


Lesenswert?

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

von Thomas H. (Gast)


Lesenswert?

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.

von Steffen Burr (Gast)


Lesenswert?

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

von Thomas H. (Gast)


Lesenswert?

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.

von mikki merten (Gast)


Lesenswert?

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.

von Steffen Burr (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.