Forum: Mikrocontroller und Digitale Elektronik Entprellen mit Debounce


von Noob (Gast)


Lesenswert?

Hallo,

hätte mal ne Frage zu dem Befehl "debounce" in Bascom.

Kann ich damit auch einfach nur einen Port entprellen OHNE das er in ein 
Unterprogramm springt?

Laut meinem Prof. (Fachhochschule) sollte das gehen, aber ich kriegs 
nicht hin. Bascom meckert immer das der Verweis zum Unterprog. fehlt 
bzw. unvollständiger Befehl.

Hab die Tastererkennung anders gelöst und möchte es auch nicht ändern.
Erklärung: 4 Taster sind an jeweils einen Port angeschlossen und 
zusätzlich sind alle an Int0 angeschlossen. Wenn dann der Int0 ausgelöst 
wird fragt er in der Interruptroutine ab welcher der 4 Eingangsport 
aktiviert ist und setzt einen entsprechenden Zähler hoch. Controller ist 
ein Mega32.

Danke im voraus,
Noob

von Paul Baumann (Gast)


Lesenswert?

Nein, das wäre auch nicht sinnvoll, weil Du ja Deinen Taster oder was Du 
gerade entprellen willst, auch auswerten mußt.

Debounce Pind.0 , 0 , Schnulli

Schnulli: Print "Taster wurde gedrückt"

Wenn der Pind.0 auf 0 geht, wird zur Marke "Schnulli" gesprungen.

MfG Paul

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Nix zu machen wenn der Taster gedrückt wurde ist doch auch ne Art 
entprellung ;)

von Paul Baumann (Gast)


Lesenswert?

So in der Art: "Sind Sie verheiratet? Wenn ja, warum nicht? Haben Sie 
Kinder? Wenn nicht, wie machen Sie denn das?"

;-)
Paul

von Werner A. (homebrew)


Lesenswert?

las das doch mit dem debounce. in der interrupt routine setzt du ein 
flag und fragst 10 ms später ab, ob noch ein taster gedrückt ist.

von Peter D. (peda)


Lesenswert?

Wenn man genau das will, was die vorgefertigten Bascom-Legosteine 
können, dann nimmt man diese.

Wenn man was anderes will, muß man es eben selbst programmieren, wie man 
es in C oder Assembler auch machen würde.

Die Legosteine aber mit was eigenem zu mixen, dürfte in der Regel 
schiefgehen, da man ja nicht in die Legosteine reingucken kann (Black 
Box).


Ich entprelle immer so:

Beitrag "Universelle Tastenabfrage"

besser gehts nicht.


Peter

von Hannes L. (hannes)


Lesenswert?

Peter Dannegger wrote:
> Ich entprelle immer so:
>
> Beitrag "Universelle Tastenabfrage"
>
> besser gehts nicht.

Das stimmt. mach' ich inzwischen auch so.
Aber kannst Du da nicht mal einen BASCOM-kompatiblen Legostein draus 
bauen?

Duck & weg...

...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hannes Lux wrote:
> Peter Dannegger wrote:
>> Ich entprelle immer so:
>>
>> Beitrag "Universelle Tastenabfrage"
>>
>> besser gehts nicht.
>
> Das stimmt. mach' ich inzwischen auch so.
> Aber kannst Du da nicht mal einen BASCOM-kompatiblen Legostein draus
> bauen?
>
> Duck & weg...
>
> ...
Ich behaupte "besser gehts nicht" ist nicht allgemeingültig ;)

von Hannes L. (hannes)


Lesenswert?

Läubi Mail@laeubi.de wrote:

> Ich behaupte "besser gehts nicht" ist nicht allgemeingültig ;)

Dann zeig' mal, wie es besser (effizienter, ressourcenschonender) und 
zuverlässiger geht. ;-)

Ich habe 'ne Weile gebraucht, bis ich den Algorithmus und dessen 
Umsetzung in ASM verstanden habe, aber nun nutze ich diese Routine in 
verschiedenen Modifikationen, die auf den jeweiligen Zweck zugeschniien 
sind. Mal brauche ich nur den entprellten Zustand, mal die 
Key-press-Flags, mal die Key-lost-Flags, mal beide und wenn es nur auf 
Flankenerkennung (ohne Entprellung) ankommt, fliegt eben auch mal die 
Prellzählerei raus. Es ist und bleibt eine hocheffiziente Routine die 
enorm wenig Ressourcen beansprucht.

...

von jojansen (Gast)


Lesenswert?

Moin,
ich bin gerade dabei so etwas ähnliches zu probieren. Die vier Taster 
sind über AND Gatter an einem IRQ Eingang angeschlossen und zusätzlich 
noch an einem Port. Wenn eine Taste gedrückt wird, geht es in die IRQ 
Routine, schalte den entsprechenden IRQ ab und entprelle mit Debounce. 
Wenn das Ergebnis negativ ist, springt Debounce ja in die nächste Zeile. 
Dort schalte ich den IRQ wieder ein und verlasse alles mit Return. Bei 
positivem Ergebnis springe ich über ein Label gerade zwei Zeilen weiter, 
lese den Port in eine Variable  und von dort aus per Return wieder ins 
Hauptprogramm. Den uninteressanten Teil vom Port maskiere ich mit AND 
aus.
Das ganze sieht in etwa so aus:

'tastenabfrage
disable INTx
debounce Int-eingang,0,weiter
enable INTx
return

weiter:
key = porty AND &h0f 'die unteren vier bit werden ausgewertet
return

Ich habe es noch nicht ausprobiert, da meine Hardware noch nicht ganz 
fertig ist, aber so habe ich mir das vorgestellt.
Es gibt sicherlich elegantere und bessere Varianten, aber ich bin 
grundsätzlich faul und muß mich bei diesem Projekt noch um vieeel mehr 
kümmern, als um eine schöne Tastenentprellung... ;-)
Good Luck
:-) Johannes

von Werner A. (homebrew)


Lesenswert?

entprellen in der interrupt routine ist wohl eine der denkbar 
schlechtesten möglichkeiten...

von Noob (Gast)


Lesenswert?

@ Paul Baumann

Die Taster werden doch ausgewertet, in der Interruptroutine.

@ Werner A.

Das mit dem Flag setzen hab ich hier schon öfters gelesen, es ging halt 
nur darum ob man es nicht auch einfach mit dem "Debounce" irgendwie 
lösen könnte. (Mal davon abgesehen ihn in ein leeres Unterprogramm 
springen zu lassen)

@ Peter Dannegger

Deine Lösung scheint ja das non-plus-ultra zu sein, nur leider is die 
mir 2-3 Stufen zu hoch. Bin froh das ich mit dem "Bascom-Basic" 
einigermaßen zurecht komm, deshalb wäre ich natürlich an einem kleinen 
Legostein für Bascom auch interessiert.

von Hannes L. (hannes)


Lesenswert?

> deshalb wäre ich natürlich an einem kleinen
> Legostein für Bascom auch interessiert.

Hast Du das "Duck & weg" übersehen?
Das war ein Scherz meinerseits.

Wenn Du Dir den Algorithmus in ASM und C ansiehst, kannst Du ihn 
vermutlich auch in BASCOM implementieren. Er wird aber sehr viel mehr 
Rechenzeit beanspruchen, da BASCOM in der (Timer-) ISR unnötigerweise 
alle Register sichert, was unnötig lange dauert. Auch (aber nicht nur) 
ein Grund für mich, ASM zu bevorzugen.

...

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.