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