Forum: Mikrocontroller und Digitale Elektronik Einzelne Taster entprellen


von Carsten (Gast)


Lesenswert?

Hallo Forum.
Ich habe ein Problem, dass ich mit Suchen im Forum nicht lösen kann.
Ich prauche Port D als LCD und UART-Port.
Entsprechend habe ich nur noch PortB für Taster und LEDS.
(AT90S2313)
Hier im Forum wird immer nur der komplette Prot gelesen und entprellt.
Hat vielleicht jemand ein Beispiel wie explizit ein bestimmter Pin
abgefragt und entprellt werden kann ?
Bin so langsam echt am Ende.
By the way, ich bin Newbie und daher stelle ich mich vielleicht
manchmal etwas blöd an - also seid bitte nachsichtig.

Danke Carsten

von Christoph (Gast)


Lesenswert?

Hallo,

Du kannst doch den Port komplett einlesen und anschließend mit
einer log. Verknüpfung die uninteressanten Pins "ausblenden":
in r15,PINB
andi r15,0b00000100
oder, falls der AT90S2313 den Befehl "andi" nicht kennt, dann
halt:
in r15,PINB
ldi r16,0b00000100
and r15,r16

das löscht in r15 alle Bits, die mit Null AND-verknüpft werden.
Hier bleibt nur Bit 2 (also PB2) übrig. Den Rest der Entprellerei
kannst Du dann eigentlich wie beim ganzen Port machen.

Gruß,
Christoph

von Carsten (Gast)


Lesenswert?

...genau das hatte mir gefehlt.
Danke Dir.
...jetzt muss ich nur noch eine knappe Entprellroutine finden, die bei
mir läuft.
Die von Peter (
http://www.mikrocontroller.net/forum/read-4-20435.html#38426 ) bekomme
ich partout nicht zum rennen.
Ist aber auch ewig verwirrend mit diesem ganzen ge-And-e und ge-OR-e.
Naja schaun mer mal .
Vielleicht hat ja eine richtig kurze, gute und dokumentierte (so das
ich sie verstehe grinsverlegen)

von Christoph (Gast)


Lesenswert?

Naja, ich empfehle Dir, die Beispiele hier mal zu ignorieren und
selbst was zusammenzuschreiben.

Entprellen bedeutet ja eigentlich nichts anderes als das schnelle
hin- und herspringen des log. Wertes eines Tasters zu ignorieren und
den Wert erst dann zu akzeptieren, wenn er längere Zeit stabil
geblieben ist.
Du mußt also nur den aktuellen Zustand einlesen und ein paar Mal
zu späteren Zeitpunkten damit vergleichen. Ist es immer derselbe
Wert, dann kann man annehmen, daß er stabil ist. Die Parameter - wie
z.B. die Anzahl der Vergleiche, die notwendig sind, oder die Größe
der Intervalle, in denen "Nachverglichen" wird, kann man durch
Probieren und etwas Überlegen gut bestimmen.
Auf diese Weise hast Du sicherlich mehr davon, als wenn Du fertigen
Code verwendest.

Viel Spaß,
Christoph

von Carsten (Gast)


Lesenswert?

...sehe ich auch so.
Ist nur schöner auf diesem Wege auch etwas den Programmierstil anderer
zu sehen.
Letztenendes ist mir das vom Ablauf ja alles klar. Nur mit der
Umsetzung hapert es noch.
Bin halt Anfänger.

von peter dannegger (Gast)


Lesenswert?

Hier, die Routine ist noch zuverlässiger, da sie 4-fach entprellt:

http://www.mikrocontroller.net/forum/read-4-20549.html#new

Es ist richtig, die Routine ist für 1-8 Tasten, d.h. man muß nur die
Bits auswerten, die auch wirklich mit einer Taste verbunden sind. Die
anderen Bits läßt man einfach links liegen.


Wenn es aber aufs Bitsparen ankommt, ist hier eine optimierte Routine
für nur eine Taste, die benötigt nur die unteren 4 Bits eines
Registers:

http://www.mikrocontroller.net/forum/read-4-27035.html#new


Peter

von Carsten (Gast)


Lesenswert?

Also, bei dem Bitsparer komme ich auf einen Thread, wo ich nur ein
C-Programm finde.
Das andere Beispiel wollte ich gern mal probieren aber ich bekomme es
nicht zum Laufen.
Der MC zeigt keine Reaktion.
Kann man eigentlich auch online (im MC) debuggen ?
Ich hab ein STK500

von ...HanneS... (Gast)


Lesenswert?

Suche mal im WIKI nach "entprellung"

...

von Carsten (Gast)


Lesenswert?

Ok, hab ich getan.
Das Proggi von Peter tuts ja nunmal nicht auf meinem 2313.
Mit Deinem Code kann ich leider ohne das drumrum bis jetzt auch noch
nichts tun.
Ist es möglich, diesen mal vollständig zu bekommen?
Bis ich die ganzen Deklarationen und den Timer mir aus der Birne
gedrückt habe, bin ich wahnsinnig geworden.
Ich habs zwar mittlerweile mehrfach gelesen und getippt und auch
verstanden aber auswendig kann ich das noch nicht.
Ich meine diesen Threat:
http://www.mikrocontroller.net/forum/read-1-140056.html#140946

****VERZWEIFLUNG !!*****

von peter dannegger (Gast)


Lesenswert?

"Also, bei dem Bitsparer komme ich auf einen Thread, wo ich nur ein
C-Programm finde."

Also ich sehe da nur mein ASM-Programm (1wire.zip auspacken).



"Das andere Beispiel wollte ich gern mal probieren aber ich bekomme
es
nicht zum Laufen."

Du must schon etwas kooperativ sein, in den Kopf kann Dir keiner
schauen.
Also was hast Du probiert und was geht wie nicht.



Peter

von Marcus (Gast)


Lesenswert?

Hallo!

Kannst Du auch was mit C-Code anfangen, oder akzeptieren Deine
Software-Tools nur Assembler ?

In C hätte ich was für Dich - also wenn Du was damit anfangen kannst,
dann poste hier nochmal.

Gruß

Marcus

von peter dannegger (Gast)


Lesenswert?

"Bis ich die ganzen Deklarationen und den Timer mir aus der Birne
gedrückt habe, bin ich wahnsinnig geworden."

Dann fang erstmal klein an:

- Taste drücken -> LED an, Taste loslassen -> LED aus
- Timer -> LED blinken
usw.


Die Beispiele laufen natürlich nur auf der gleiche Hardware, andere
AVRs mußt Du selber anpassen.


Peter

von ...HanneS... (Gast)


Lesenswert?

Eines vorweg:
Es ist nicht mein Code, sondern der von Peter Dannegger. Ich habe ihn
lediglich analysiert und umfassender kommentiert, um die von Markus
gestellte Frage zu beantworten. Verstanden habe ich den Code auch erst,
nachdem ich mich intensiv damit beschäftigt hatte. Und das hat schon
einige Zeit gedauert.

Ein komplettes Programm kann ich dir nicht liefern, da ich selbst
diesen Code noch nicht in eigenen Programmen verwendet habe.

Wichtig ist aber, dass du dein Programm so strukturierst, dass es von
einem ständig (periodisch) laufenden Timer-Interrupt gesteuert wird.

Soll heißen: Ein Timer wird so konfiguriert, dass er alle soundsoviel
Prozessortakte einen Interrupt auslöst. In dieser ISR (der
"Herzschlag" des Programms) werden Tasten abgefragt, Blinkzähler
erhöht (oder verringert), Flags für das Hauptprogramm gesetzt usw...

...

von Carsten (Gast)


Lesenswert?

Nun gut...
ich habe get8key in mein Studio kopiert.
.include "2313def.inc" angepasst.
Dann hab ich das mal versucht Schrittweise zu simulieren.
Irgendwann bin ich dann ausgestiegen.
In main brabbelt er ja so lange rum, bis der Timer kommt.
Dann springt er nach der get8key-Routine wieder zu init, was ich
persönlich erstmal komisch finde - aber gut.
Hier werden wieder alle Key-Variablen gelöscht ?
Dann wird in main wieder der Interrup disabled, die gelöschte key_press
exclusiv mit leds verknüpft und danach wieder gelöscht (halte ich für
blödsinn - aber gut).
Dann brabbeln wir wieder ne Weile im main rum und das ganze beginnt von
neuem.
Nun denn, hab ich mir gedacht - vielleicht ist der Simulationsbetrieb
ja nicht geeignet zum testen. Also Board ran und auf den 2313
geschossen.
Nix Reaktion.
Irgendwie fehlt mir hier absolut der logische Ablauf.
Wozu das Label get8key, wenn's nicht aufgerufen wird?
Wieso wird immer wieder initialisiert ?
Ich verstehe das nicht :-(

von ...HanneS... (Gast)


Lesenswert?

Dann initialisiere mal den Stackpointer...

von Carsten (Gast)


Lesenswert?

Unglaublich, wie einfach das Leben sein kann.
Toller Tip.
Und Danke an alle für Eure Mühen.
So langsam dämmerts auch bei mir.

Gruß Carsten

von Carsten (Gast)


Lesenswert?

Hallo Peter,
ich habe Deine Routine mal versucht in mein Programm einzubinden.
Wie kann ich die im AVR-Studio simulieren ?
Dein Original läuft aufm MC einwandfrei. Im Simulator bleibt key_press
immer 0.
TIFR muss ich setzen um den Interrupt zu erzeugen.
Dann natürlich PinD.
Aber er kommt nicht zu einem Ergebnis in key_press

Kann man das überhaupt simulieren?

von peter dannegger (Gast)


Lesenswert?

Mit dem Simulator habe ich noch nie gearbeitet.

Man muß da irgendein Stimulus schreiben, mit dem dann die Eingänge
gesetzt werden. Es muß ja eine Flanke erzeugt werden.


Peter

von Carsten (Gast)


Lesenswert?

Wie testest Du denn ?
Kann man den Programmablauf online im MC beobachten ?
Gibt's eigentlich sowas wie debug.print um Werte im Outputfenster
darzustellen ?

von mathias (Gast)


Lesenswert?

Hallo Marcus

>In C hätte ich was für Dich - also wenn Du was damit anfangen
>kannst,dann poste hier nochmal.

Also ich suche sowas in C, vielleicht kannst du es mir ja mal schicke!

mfg mathias

von peter dannegger (Gast)


Lesenswert?

"Also ich suche sowas in C"


Was gefällt Dir denn an meinen C-Beispilen nicht ?


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
Noch kein Account? Hier anmelden.