mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik immernoch taster abfragen auf 2 arten


Autor: lordchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin das problem hatte ich  ja aschonmal leider funzt es immernoch nicht 
!

ichhabe nun eine variable in dem interrupt, der alle 20ms ausgeführt 
wird

ist die variable bei 10 also 200ms soll er sie als KURZ erkennen
und ist sie bei 200 (4 sekunden) soll er sie als lang erkennen
ich hab mir überlegt das in dem INT. nur die VAR hochgezählt wird 
sofern das wahr wird:

if (PIND == 254 || PIND == 253 || PIND == 251 || PIND == 247 || PIND == 
239 || PIND == 223 || PIND == 191 || PIND == 127)


aber ich verstehe das irgendwie nicht wie bzw wann man das loslassen 
auswerten kann ?!muss ich den aktuellen port in einer variable irgendwo 
zwischenspeichern und danach bei nächsten int mit dem aktuellen port 
vergleichen um eine veränderung(loslassen) festzustellen
oder soll ich erstmal filtern WELCHER knopf gedrückt ist und dann mit 
IF_pin_is__Set abfragen ...

und wo soll der counter wieder zurück gesetzt werden ?

bis jetzt habe ich es so das ich in der main herausfinde was gedrückt 
ist und wielange ...
undem ich eine caseanweisung mache:

      switch(taster1)
        {
      case 254:
        PORTB = 254;
        if (counter == 10)
        {
          lcd_clrscr();
          lcd_puts("Position 1 saved");
          delay();
          delay();
          delay();
          delay();
          taster1 = 0;
          counter = 0;
        }

ich hoffe ihr könnt mir weiter helfen !
dankedafür schonmal !


gruß lordchen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, du must Dir natürlich den vorherigen Zustand merken, um den 
Wechsel von Losgelassen nach Gedrückt und umgekehrt auszuwerten.

In meinem Codebeispiel habe ich aber nur dan Wechsel zu Gedrückt 
ausgewertet.

Ich habe auch nur einen Wiederhohlzähler für alle Tasten gemeinsam 
verwendet. D.h. wenn man eine Taste drückt, bevor man die andere 
losläßt, wird diese auch als lang gedrückt ausgewertet.

Bei langem Druck, wird bei mir der gleiche Tastenkode wiederholt. Wenn 
man da ein anderes Register nimmt kann man aber auch einen anderen Kode 
erzeugen.

Da ich den Wechsel zu Gedrückt auswerte, wird immer zuerst der Kode für 
kurz gedrückt ausgegeben und erst nach der Wartezeit auch der Kode für 
lang gedrückt (in meinem Beispiel ist beides dasselbe).

Ich hoffe, jetzt kannst Du mein Beispiel besser verstehen.

Du kannst es ja im Simulator ausprobieren.


Peter

Autor: lordchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne du danke für deine anwort aber ich verstehs nicht ...
wie meinst du das ? wann muss ich den aktuellen portzustand denn 
abspeiichern ? und wie wird dieser im weiteren verlauf nochmal 
vergliachen ?


gruß
lordchen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der alte entprellte Zustand aller 8 Tasten wird in "key_state" 
gespeichert. Der neue wird erstmal in "i" abgelegt. Dann wird die Flanke 
erkannt und das entsprechende Bit in "key_press" gesetzt, wo man es in 
der Main-Loop bequem testen und rücksetzen kann.

Die Variablen "ct0" und "ct1" bilden 8 Stück 2-Bit-Zähler, d.h. Sie 
können bis 4 Zählen und dienen dem Entprellen. D.h. "key_state" 
übernimmt das Tastenbit erst, wenn es 4-mal hintereinander der 
entgegengesetzt Zustand war.


Vielleicht solltest Du erstmal nur mit dem Entprellen anfangen, z.B.:

http://www.mikrocontroller.net/attachment.php/2055...

Das ist haargenau der C-Kode, aber ohne Repeat-Funktion und in AVR 
Assembler.
Du kannst es bequem im Simulator laufen lassen, um die Funktion zu 
verstehen, bzw. direkt auf dem STK500.

Dann kannst Du die Repeat-Funktion wieder anhängen.


Aber da sind ja noch viele andere Entprellroutinen in der Codesammlung. 
Vielleicht nicht so kompakt, aber in der Funktionsweise ähnlich.

Du darfst bloß keine Angst vor fremden Kode haben. Ist völlig normal, 
daß man da erst mal Bahnhof versteht. Einfach von oben anfangen, sich 
durchzuwusteln. Du kannst mir auch per E-Mail Fragen stellen.


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.