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
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
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
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...
...
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 ;)
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.
...
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
@ 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.
> 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.
...