Forum: Mikrocontroller und Digitale Elektronik ATmega8 und Tastenentprellung


von Dan (Gast)


Lesenswert?

Hallo allerseits,

ich habe ein Problem mit der Tastenentprellung am ATmega8.

Grundsätzlich schalte ich in der jeweiligen ISR den Interrupt für den 
jeweiligen Externen Interrupt aus.

ISR(INT0_vect)
{
  GICR &= ~( _BV(INT0) );  //External Interrupt 0 disable
}

In einem Timer zähle ich - sofern der Interrupt deaktiviert ist - mit 
und schalte ihn nach 5000ms = 5s wieder frei. Die Zeit wähle ich deshalb 
so lange, damit ich sehe was passiert.

Das Problem ist: Am Board wird wie erwartet der Taster direkt 
deaktiviert. Drücke ich den Taster aber zwei Mal direkt hintereinander, 
dann wird die ISR aufgerufen, INT0/1 deaktiviert und nach 5 sekunden 
erneu aufgerufen!

Es scheint als würde sich der ATmega den Interrupt merken und einfach 
aufrufen, sobald ich sie wieder freigebe.

Kann sich jemand vorstellen was das Problem ist? Kann man dieses 
"merken" unterbinden?

VIelen Dank und mfG

Dan

von Uwe (de0508)


Lesenswert?

Hallo,

da das alles schon 1000x behandelt wurde, nutze doch die beste Routine 
von Peda:

- Beitrag "Re: Universelle Tastenabfrage"

- Beitrag "Universelle Tastenabfrage"

Dort kannst Du auch das Debounce-System verstehen.

Manchmal hilft auch die Suchfunktion des Forums und Taster fragt man NIE 
in der ISR ab, die Prellen.

Wenn ein ISR Aufruf ansteht kann man den auch wieder löschen.

GIFR = (1<<INTF0) ;

Steht aber auch alles im Datenblatt, das man sich immer von ATMEL direkt 
holen sollte.

.

von Dan (Gast)


Lesenswert?

Uwe S. schrieb:
> da das alles schon 1000x behandelt wurde, nutze doch die beste Routine
> von Peda:

Ich möchte es gerne so lösen wie oben beschrieben, sofern es geht.




Uwe S. schrieb:
> Wenn ein ISR Aufruf ansteht kann man den auch wieder löschen.
>
> GIFR = (1<<INTF0) ;
>
> Steht aber auch alles im Datenblatt, das man sich immer von ATMEL direkt
> holen sollte.

Habe ich berücksichtigt. Ich gucke mit dem Simulator auch in die Flags 
rein. Alles ist so wie es sein sollte in der Theorie.

von Uwe (de0508)


Lesenswert?

Sorry, ich vertraue keinem Simulator, nur der Logik und einer realen 
Hardware.

Suche bitte aus Spaß nach Simulator und Probleme hier im Forum und du 
wirst dich wundern.

.

von Karl H. (kbuchegg)


Lesenswert?

Dan schrieb:
> Uwe S. schrieb:
>> da das alles schon 1000x behandelt wurde, nutze doch die beste Routine
>> von Peda:
>
> Ich möchte es gerne so lösen wie oben beschrieben, sofern es geht.

Wenn du dir selbst das Leben schwer machen willst.

von Dan (Gast)


Lesenswert?

Danke für die Antworten bisher.


Ich bin nachwievor auf der Suche nach einer Antwort auf die Frage warum 
der ATmega die externen Interrupts registriert obwohl ich sie 
AUSGESCHALTET habe und warum er sie sogar nachholt, sobald ich sie 
wieder EINSCHALTE!

danke und mfg

von Karl H. (kbuchegg)


Lesenswert?

Dan schrieb:
> Danke für die Antworten bisher.
>
>
> Ich bin nachwievor auf der Suche nach einer Antwort auf die Frage warum
> der ATmega die externen Interrupts registriert obwohl ich sie
> AUSGESCHALTET habe

Weil du nicht die Annahme eines Interrupts deaktivierst, sondern dessen 
Auswertung (ANspringen der Interrupt Funktion). Egal was du tust, dass 
am Interrupt Pin ein Ereignis eingetreten ist, wird auf jeden Fall immer 
registriert. Und das ist auch gut so. Ein Interrupt darf nicht verloren 
gehen, nur weil temporär Interrupts deaktiviert sind.

> und warum er sie sogar nachholt, sobald ich sie
> wieder EINSCHALTE!

Weil du das Flag "Interrupt am Eingang registriert" nicht zurück setzt.

von Peter D. (peda)


Lesenswert?

Dan schrieb:
> Es scheint als würde sich der ATmega den Interrupt merken und einfach
> aufrufen, sobald ich sie wieder freigebe.

Das ist richtig so und muß auch so sein.

Es wäre ja schlimm, wenn Interrupts verloren gingen, nur weil man sie 
zeitweise disablen muß. Eine solche grottige Interruptlogik wäre absolut 
unbrauchbar.

Auch muß die Möglichkeit bestehen, daß man keine Interrupts benutzt, 
sondern auf das Interruptflag pollt.


Dan schrieb:
> Kann sich jemand vorstellen was das Problem ist?

Das Problem ist, daß diese Anfängerfragen fast täglich auftauchen und 
schon bis zum Erbrechen diskutiert wurden und auch perfekte Lösungen 
dafür vorliegen.
Damit ich davon keine Fusseln am Mund kriege, werde ich hier also nicht 
die einmillionste-und-ein Erklärung starten, sondern auf die 
Suchfunktion verweisen.


Peter

von Udo S. (urschmitt)


Lesenswert?

Peter Dannegger schrieb:
> Damit ich davon keine Fusseln am Mund kriege, werde ich hier also nicht
> die einmillionste-und-ein Erklärung starten, sondern auf die
> Suchfunktion verweisen.
Das sind doch keine Fusseln mehr sondern eher ein 1m langer Vollbart :-)

von Dan (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Das Problem ist, daß diese Anfängerfragen fast täglich auftauchen und
> schon bis zum Erbrechen diskutiert wurden und auch perfekte Lösungen
> dafür vorliegen.
> Damit ich davon keine Fusseln am Mund kriege, werde ich hier also nicht
> die einmillionste-und-ein Erklärung starten, sondern auf die
> Suchfunktion verweisen.

Danke, Problem gelöst. Und zu den Suchfunktions-Hinweisen:

Ich habe gesucht aber nichts passendes gefunden. Zweitens geht Fragen 
meistens schneller als suchen und drittens hab ihr dann eine gelegenheit 
euch über Anfängerfragen zu echauffieren. Das macht doch Spaß oder? 
Scheint jedenfalls so!

Grüße

von Dan (Gast)


Lesenswert?

Peter Dannegger schrieb:
> [...] und auch perfekte Lösungen
> dafür vorliegen.

Ich such keine andere, sondern genau diese Lösung weil es eine 
Programmieraufgabe ist.

von Oliver J. (skriptkiddy)


Lesenswert?

So könnte man hardwareseitig entprellen:
1
                                       .------------.
2
                                       |       VCC  |
3
                                       |        +   |
4
                                       |        |   |
5
                                       |       .-.  |
6
                                       |       | |  |
7
                 T                     |       | |  |
8
                ---                    |       '-'  |
9
           .----o o--o-----------------|--------'   |
10
           |         |                 |            |
11
           |        --- 100nF          |            |
12
           |        ---                |            |
13
           |         |                 |            |
14
           |         |                 |            |
15
          ===       ===                |        AVR |
16
          GND       GND                '------------'
17
18
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

Gruß Oliver

von oldmax (Gast)


Lesenswert?

Hi
> Ich such keine andere, sondern genau diese Lösung weil es eine
> Programmieraufgabe ist.
Soll vermutlich heißen: Ich suche nicht nach möglichen Lösungen, sondern 
hoffe, das man mir direkt meine Hausaufgaben macht. Weil ja bei einer 
Hausaufgabe nicht das eigene Wissen gefragt ist, sondern es sollen sich 
gefälligst alle dran beteiligen.....
Nur weiter so. Das hat Zukunft.
( aber nur solange, wie es Menschen gibt, die sich selbst noch was 
erarbeiten. Irgendwann sind sie mal ausgestorben..... )
Gruß oldmax

von Peter D. (peda)


Lesenswert?

Dan schrieb:
> drittens hab ihr dann eine gelegenheit
> euch über Anfängerfragen zu echauffieren. Das macht doch Spaß oder?

Ne, macht es nicht.
Wie gesagt, Entprellen-Fragen kommen fast täglich und man sieht sofort, 
daß nicht gesucht wurde.
Also ganz nach dem Motto: "Und täglich grüßt das Murmeltier".

Es ist ja nicht so, daß man das in 2 Sätzen abhandeln kann.
Entprellen scheint nur so, daß es ohne groß nachzudenken lösbar ist, ist 
es aber nicht (zumindest nicht zufriedenstellend).

Du kennst bestimmt auch Geräte, wo Tasten oder Drehgeber unzuverlässig 
sind. Genau da hat der zuständige Programmierer gedacht, das mache ich 
schnell mal wischiwaschi so nach Gefühl.
Bei mir auf Arbeit sind es z.B. die Fahrstühle, die Kaffemaschinen und 
ein Frequenzgenerator, wo die Entprellung buggy ist.


Dan schrieb:
> Ich such keine andere, sondern genau diese Lösung weil es eine
> Programmieraufgabe ist.

Dozenten, die verlangen, einen externen Interrupt zum Tasten einlesen zu 
nehmen, sollte man die Hände abhacken. Damit sie endlich mal aufhören, 
diesen Unsinn zu lehren.


Peter

von Hannes L. (hannes)


Lesenswert?

Peter Dannegger schrieb:
> Dozenten, die verlangen, einen externen Interrupt zum Tasten einlesen zu
> nehmen, sollte man die Hände abhacken. Damit sie endlich mal aufhören,
> diesen Unsinn zu lehren.

Das schaffen die auch ohne Hände...

Dan schrieb:
> Ich such keine andere, sondern genau diese Lösung weil es eine
> Programmieraufgabe ist.

www.hausaufgaben.de

Dan schrieb:
> Zweitens geht Fragen
> meistens schneller als suchen

Grammatik-Frage:
Heißt es "lass mir arbeiten" oder "lass mich arbeiten"?
Antwort: "lass andere arbeiten"...

> und drittens hab ihr dann eine gelegenheit
> euch über Anfängerfragen zu echauffieren. Das macht doch Spaß oder?

Nein, aber Faulpelze wie Du brauchen das gelegentlich.

...

von Oliver J. (skriptkiddy)


Lesenswert?

Peter Dannegger schrieb:
> Dozenten, die verlangen, einen externen Interrupt zum Tasten einlesen zu
> nehmen, sollte man die Hände abhacken. Damit sie endlich mal aufhören,
> diesen Unsinn zu lehren.

Ganz so Unsinn sind die Taster per Interrupt nicht, finde ich. Man 
stelle sich vor, dass ein AVR schlafen gelegt wird. Da wird es schwer 
mit Polling und Aufwachen. Von da her ist das meiner Meinung nach gar 
nicht mal so verkehrt...

Gruß Oliver

von fddgddg (Gast)


Lesenswert?

also  PCINT  als tasteneingänge habe ich mir mitlerweile angewöhnt
ein polling ist schön und gut .. brauch aber konstant strom

und nicht jeder sch** muss gepollt werden
gerade wenn man auf größeren controllern arbeitet
läuft das zu 98% alles interupt(event)getrieben

wenn ich den µC im standby auf <1µA bringe .. warum nicht

habe ne anwendung gebaut wo ALLES über die pinchangeISR geht
UART empfang  und tasteneingänge

funzt wunderbar im 3stufigen Idle/Powerdown/standbymodus

von Peter D. (peda)


Lesenswert?

Oliver J. schrieb:
> Man
> stelle sich vor, dass ein AVR schlafen gelegt wird. Da wird es schwer
> mit Polling und Aufwachen.

Nö, das sind einfach zwei ganz verschiedene Aufgaben.
Der Pin-Change-Interrupt macht nur das Aufwachen.
Und dann der Timerinterrupt das Tasten einlesen und entprellen.

Ich behandele Programmfunktion und Stromsparen immer getrennt und 
nacheinander. Das macht die Programmierung deutlich einfacher und 
übersichtlicher.

Hier ein Beispiel:
Beitrag "AVR Sleep Mode / Knight Rider"


Peter

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.