mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einzelne Taster entprellen


Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Suche mal im WIKI nach "entprellung"

...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann initialisiere mal den Stackpointer...

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Also ich suche sowas in C"


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


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.