Ich habe an einem MEGA8535 einen Taster angeschlossen. WIe kann ich den Taser durch eine Software entprellen? In diesem Forum habe ich schon mal ein Beispiel von P. Dannegger gesehen. Ich verstehe da nicht so viel was er da genau gemacht hat. Kann man die Entprellung auch ohne Interrupt bewältigen?
Hallo! Die einfachste Methode: nach der ersten Erkennung eines Tastendrucks eine Pause von 100 ms (oder mehr) einfügen.
"Kann man die Entprellung auch ohne Interrupt bewältigen?" Im Prinzip ja, ist aber lange nicht so eine schön kleine, schnelle, zuverlässige und universelle Lösung. In der Regel machen diese auch nur eine Taste, d.h. für 8 Tasten braucht man den 8-fachen Code und SRAM-Bedarf. Es gibt da folgende Ansätze: - die natürliche Laufzeit der Mainloop nutzen -> sehr unzuverlässig, da total Programmabhängig - eine Delayloop -> pure Rechenzeitvernichtung - externer Flankeninterrupt -> sehr störempfindlich (ESD) Peter
Prinzip: Wenn erkannt wurde, dass Taste gedrückt, dann einfach Pause von ca. 20ms. Anschließend noch einmal überprüfen ob Taste immer noch gedrückt ist. Das Ganze am besten zwei- oder dreimal wiederholen. Anschließend kannst du sicher sein, dass die Taste nicht mehr prellt. Unter C würde ich das Timing mit Interrupt lösen (bleibt Zeit um noch etwas Sinnvolles zu tun). Ansonsten einfach verschachtelte Zählschleifen, bis die Zeit abgelaufen ist. Taste einlesen und eine weiteren Zähler inkrementieren, bis 3 oder 4. Danach erst das Tasten-Erreignis auslösen.
Sowiet verstehe ich das jetzt. Nur wie ich die Interrupt Routine mit Taster programmieren soll, das weiss ich allerdings nicht. Ich tue mir da halt noch schwer!
Ich habe mal mir dazu was überlegt wie es eventuell gehen könnte: int start=0,x=0; void taster1 (void); { start = 1; } void interrupt overflow { if (start == 1) { for(int i=0; i<10; i++) // insgesamt 100ms { } } } main(void) { while(1) { if (taster1() == 1) { PORTB = 0x55; } } }
Leider kann ich dies nicht testen, da ich zur Zeit nicht Zuhause bin. Würde der Code so funktionieren?
Ich habe meinen Code mal genauer angeschaut. Ich denke so wird es nicht funktionieren! Kann mir da jemand weiterhelfen?
Das wird sicher nicht funktionieren. Problem liegt schon mal in der main-Funktion " . . . if (taster1() == 1) { PORTB = 0x55; } . . . " "void taster1 (void);" Also, die Funktion "taster1" hat keinen Rückgabewert (void). Bei der If-Abfrage "if (taster1() == 1)" wird die If-Bedingung nie wahr werden. Denn die Funktion "taster1" gibt keine "1" zurück - Rückgabewert ist void! Für den Interrupt würde ich einen Timer benutzen und damit die erforderliche Zeit erzeugen.
Ich hab das so geregelt, da ich sowieso einen Timer am laufen habe (1ms) sezt dieer timer einfach eine Varibale auf 1, das kann ich dan abfragen [pseudocode!!] loop: if (timerisr == 1) then { if (PIN == 1) { taster = taster+1 } if (taster < 100) { jmp loop } else { taster = 0 call tastergedrücktroutine } irgenwasandereswasasonstnochgemachtwerdensoll } else { jmp loop }
Jag doch mal Peter Danneggers Entprellroutine (Codesammlung) durch den Simulator und versuche sie zu verstehen. Einfacher geht es nicht. Es gibt keinerlei Warterei, dem Hauptprogramm steht pro Taster ein Bit zur Verfügung, das anzeigt, ob der Taster (entprellt!) betätigt ist oder nicht. Und zusätzlich gibt ein weiteres Bit pro Taster, welches aussagt, dass auf einen Tastendruck noch nicht reagiert wurde (Impulsfalle). Bequemer geht es einfach nicht. Ich nutze zwar die ASM-Version, aber die C-Version dürfte ebenso effizient sein. ...
Hi Läubi, den Code verstehe ich nicht ganz: Kannst du mir eventuell mal deinen kompletten C- Code geben? Vielleicht verstehe ich es dann. Wenn ich mal den kompletten Code sehe, dann verstehe ich auch die Zusammenhänge.
Hallo Läubi! Erklär mir doch bitte mal die folgeneden zwei Zeilen vorallem das mit { jmp loop }! Sowas habe ich in C noch nie gesehen! if (taster < 100) { jmp loop } else { jmp loop } Gruß Klaus
ich wieß nicht ob C jumps unterstüzt, ich selber Programieren nur in Assembler, wewirken tu diese beiden zeilen, das wenn > 100x hintereinander ein Tastendruck registireiert wurde eine unteroutine aufgerufen wird. das lezte jmp loop ist einfach nur ne endlosschleife.
Gibt es echt noch keinen Artikel irgendwo im Netz, der dieses Standardproblem, was alle paar Tage hier diskutiert wird, mal erschöpfend erklärt? Diesen kennst du schon? http://www.mikrocontroller.net/articles/Entprellung Wer noch was weiß, kann diesen ja vervollständigen. Ich glaube, es scheitert immer daran, dass die, die es dann wissen, zu faul sind, es für die Nachwelt zu konservieren.
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.