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?
"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!
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.