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
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.
.
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.
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.
.
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.
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
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.
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
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 :-)
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
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.
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
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
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.
...
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
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
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