mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Grundstruktur zum Taster einlesen und auswerten


Autor: Peter Novell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin noch ein ziemlicher Anfänger in Assembler. Ich hab bis jetzt 
einwenig mit dem STK rumgespielt, um die Hard- und Software zu 
verstehen. Ich bin nun soweit, dass ich ohne Probleme mit meinen Tastern 
und LED's und einem mega8515 rumspielen kann.

Nun möchte ich mich weiter hinein wagen und dafür brauche ich erstmal 
Grund-Codevorlagen.
Momentan bin ich auf der Suche nach simplen Taster einlese und auswert 
Möglichkeiten sowie Entprellungen.

Also als Entprellung hab ich die Idee, einfach die Taster einzulesen, 
mit einem 10ms Delay entprellen und dann nochmal einlesen und wenn die 
selbe Taste immer noch gedrückt ist, den Tasterdruck akzeptieren.
Ist das so ok? Wie wandle ich das am Besten in Code um?

Wichtig für mich wäre auch noch folgendes. Das Programm soll 
beispielsweise nicht ausgeführt werden, solange eine Taste nicht 
gedrückt wird. Also ich warte also am Anfang des Programms, bis eine 
Taste gedrückt wird, dann lasse ich eine LED leuchten, was signalisiert, 
dass das Programm läuft. Nun komm ich am Ende des Programms wieder in 
die Abfrage ob die Taste gedrückt wurde, da ich mit dieser Taste quasi 
das Programm auch wieder ausschalten will. Nun ist es so, wenn das 
Programm ja sehr kurz ist, ist es schon wieder bei dieser Abfrage wenn 
ich die Taste noch zum einschalten gedrückt halte und das Programm wird 
quasi wieder ausgeschaltet. Wie kann ich das realisieren, dass das 
Programm erst bei einem zweiten Tastendruck ausgeschaltet wird?

Zusätzlich sollen zwischen diesem einschalt und ausschalt Punkt mehrere 
Taster ausgewertet werden.
Jeder Taster führt quasi eine spezielle Funktion aus. Ich hab mir 
gedacht, ich kann die Taster wieder einlesen, entprellen und dann in ein 
Register zwischenspeichern, das erste Register mit irgend einer 
Logischen Verknüpfung verbinden und abfragen ob dieser Taster gedrückt 
wurde. Und dies würde ich dann für jeden meiner Taster machen und bei 
zutreffen die nötige funktion ausführen.

Ihr merkt, eigentlich hätte ich schon einige Ideen, aber wenn ich dies 
in Code umsetzen soll, wird es für mich schwierig.

Aber ich denke ihr Assembler-Cracks könnt mir da weiterhelfen und habt 
sehr warscheinlich auch Code für oben genannte Probleme im Einsatz.
Wäre also über Hilfe und wenn möglich Codebeispiele extrem dankbar.

Grüsse Peter Novell

Autor: df311 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
code gibts von mir keinen, dafür ein paar lösungshinweise ;-)

als erstes nimmst du dir das avr-tutorial und fängst an, das 
durchzukauen. gleich am anfang werden taster eingelesn und leds 
geschaltet (das entprellen solltest du vllt. für ein bisschen später 
aufheben, im laufe des tutorials kommen ein paar ideen ;-) ). ob im 
tutorial kontrollstrukturen wie schleifen behandelt werden weiß ich 
nicht auswendig, aber diese sind dann der nächste schritt.

sobald du dann ein bisschen plan von der assembler-programmierung hast 
nimmst du dir ein blatt papier und malst auf, welche "zustände" dein 
programm annehmen soll (z.b. warten auf start, läuft, ende).
dann schreibst du dir mit pfeilen dazu, wo das programm starten soll, in 
welcher reihenfolge die einzelnen zustände ablaufen, bei welchem 
ereignis der zustand gewechselt wird, in welchen zuständen auf ein 
ereignis gewartet wird.

und wenn du diese einzelteile hast, kannst du das programm ganz leicht 
selbst zusammenstöpseln.

viel spaß beim experimentieren...

p.s. ein beispiel für eine skizze befindet sich im anhang; ich weiß, 
meine schrift ist grauenhaft ;-)

Autor: Peter Novell (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank für dein Antwort.

So ich hab mich heute mal rangesetzt und mich mit dem sauberen Einlesen, 
sprich mit einer vernünftigen Entprellung auseinandergesetzt.

Die AVR-Tutorials kenne ich eigentlich fast alle zum grössten Teil, doch 
das Tutorial zur Flankenerkennung hat mir sehr geholfen;)

Ich hab mir die Aufgabe wie im Anhang gestellt.

Hier ist das Resultat. Ich weiss könnte man bestimmt noch sauberer 
lösen, aber wie findet ihr die Lösung soweit und wie sicher ist meine 
Entprellung?

Starttaste:
// Auf Starttaste warten
Ein:
  rcall  Taster_einlesen        ; Taster einlesen

  andi  Temp,    $80
  cpi    Temp,    $80
  brne  Ein              ; Warten bis Taste7 gedrückt wurde

// Warten bis Starttaste losgelassen wurde
Wait_Ein:
  rcall  Taster_einlesen        ; Taster einlesen

  andi  Temp,    $80
  cpi    Temp,    $00
  brne  Wait_Ein          ; Warten bis Taste 7 losgelassen wurde

// LED 7 einschalten
Starteinstellungen:
  ldi    Temp,    $80
  com    Temp  out    PORTB,    Temp 

Flanke:
// Taktflanken einlesen und auswerten
Takt_einlesen:
    rcall  Taster_einlesen    ; Taster einlesen
  
    andi  Temp,  $10      ; nur Taste 4 beachten

  // Nur Flanken annehmen
    mov    Key_now, Temp
    eor    Key_now, Key_old
    mov    Key_old, Temp
 
    breq   Aus
 
    and    Temp, Key_now
    breq  Aus

Aktion:
// Ausgabe
  inc    Counter
  in    Temp,    PORTB  
  com    Temp
  cpi    Counter,  $0F
  brne  Ausgabe
  clr    Counter

Ausgabe:
  andi  Temp,    $F0  
  or    Temp,    Counter
  com    Temp
  out    PORTB,    Temp

Ausschalttaste:
// Auf Ausschalttaste überprüfen
Aus:
  rcall  Taster_einlesen

  andi  Temp,    $80
  cpi    Temp,    $80
  brne  Takt_einlesen

// Auf loslassen der Ausschalttaste warten
Wait_Aus:
  rcall  Taster_einlesen  
  andi  Temp,    $80  
  cpi    Temp,    $00
  brne  Wait_Aus

  ser    Temp
  out    PORTB,    Temp
  rjmp  Ein

Taster_einlesen:
// Taster einlesen mit Entprellung //
Taster_einlesen:
  in    Temp,    PIND  
  com    Temp

  rcall  Delay  
  in    Temp2,    PIND
  com    Temp2
  cp    Temp2,    Temp
  brne  Taster_Einlesen  

  ret  

Als Delay hab ich eine 20ms Verzögerung geschreiben.

Würd mich über Kommentare und Verbesserungssvorschläge freuen.

Grüsse Peter

Autor: df311 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieht doch schon mal ganz gut aus, wenns dazu noch funktioniert ist ja 
alles bestens.
nur irgendwie stören mich die c/C++-kommentar im asm-code ;-)

Autor: Peter Novell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktionieren tuts ohne Probleme;)

Dies liegt wohl daran, dass ich hauptsächlicht C programmiere;) Wie 
kommentiert man denn ein asm Code am besten?

Grüsse Peter

Autor: df311 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das "normale" kommentarzeichen im avr-asm ist ";", kommt in deinem code 
auch vor. kommentieren im normalfall wie c-programme - also irgendwas 
zwischen gar nicht und jede zeile ;-)

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kommentiere meist so:
tim0_ovf:       ;Interrupt-Handler für Timer0-Überlauf (0,25ms)
 in srsk,sreg   ;SREG sichern
 inc teiler     ;Zeitscheibe hoch
 andi teiler,teilermsk  ;auf 16ms begrenzen
 brne tastendauer1  ;jetzt keine Entprellung...

                ;Entprellroutine (Idee geklaut bei Peter Dannegger...)
 in itmp,tapin  ;Tastenport einlesen (gedrückt=L)
 com itmp       ;invertieren (gedrückt=H)
 andi itmp,inmsk;nur Tasten und Jumper berücksichtigen
 eor itmp,tas   ;nur Änderungen werden H
 and tz0,itmp   ;Prellzähler unveränderter Tasten löschen (Bit0)
 and tz1,itmp   ;Prellzähler unveränderter Tasten löschen (Bit1)
 com tz0        ;L-Bit zählen 0,2,->1, 1,3,->0
 eor tz1,tz0    ;H-Bit zählen 0,2,->tz1 toggeln
 and itmp,tz0   ;Änderungen nur dann erhalten, wenn im Prellzähler
 and itmp,tz1   ;beide Bits gesetzt sind (Zählerstand 3)
 eor tas,itmp   ;erhaltene Änderungen toggeln alten (gültigen) Tastenstatus
 and itmp,tas   ;nur (neu) gedrückte Tastenbits bleiben erhalten
 or tfl,itmp    ;und zugehörige Bits setzen (gelöscht wird nach Abarbeitung)
 ;in "tas" steht jetzt der gültige Tastenzustand,
 ;in "tfl" die Flags der neu gedrückten, noch nicht abgearbeiteten Tasten...
Tastendauer:
 mov itmp,tas       ;Tastenzustand kopieren
 andi itmp,tasten   ;nur Tasten mit Wiederholfunktion stehen lassen
 tst itmp           ;ist eine Taste betätigt?
 breq Tastendauer0  ;nein, Dauer auf Startwert...
 dec twz            ;ja, Zähler runter
 brne Tastendauer1  ;Dauer abgelaufen? - nein...
 or tfl,itmp        ;ja, noch aktive Tasten übernehmen (alternativ)
 ldi twz,twz1       ;und Zähler auf Wiederholwert setzen
Tastendauer1:
 out sreg,srsk      ;SREG wiederherstellen
 reti               ;fertig, zurück...

Tastendauer0:       ;Reset Dauerzähler
 ldi twz,twz0       ;Tastendauerzähler auf Startwert
 rjmp Tastendauer1  ;fertig...

Und der kommentierte Code passt vermutlich auch noch zur Fragestellung, 
oder?

...

Autor: Peter Novell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen dank für eure Antworten. Jo der Code passt, jedoch ist mir das 
entprellen über einen Interrupt momentan noch zu übertrieben, da ich wie 
gesagt erst am Anfang stehe.
Momentan tut meine Variante ihren Job gut. Eine Frage hätt ich noch, 
momentan hab ich ein 20ms Entprelldelay eingebaut, da ich einen Taster 
ausgemessen habe welcher maximal 10ms geprellt hat. Denkt ihr die 20ms 
sind ok und die meisten Taster prellen weniger lang oder soll ich das 
Delay sicherheitshalber hochschrauben?

Grüsse

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.