mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Frage zu Interrupts/Taster


Autor: Frank Voss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe 5 Taster an meinem f149 angeschlossen, über Interrupt. Die
Tasterabfrage per Interrupt funktioniert prima. Nun wollte ich
folgenedes realisieren, bleibe da aber irgendwie stecken.

Die Eingänge liegen auf 3,3V und die Taster ziehen die auf GND.

Ich will nun eine Taste (1) drücken. Wenn ich dieses Taste drücke und
gedrückt halte und eine weitere Taste (2) drücke, soll als Test eine
LED toggeln. Ich bin nun soweit,dass wenn ich die erste Taste drücke
und gedrückt halte und dann die zweite Taste immer wieder drücke, die
LED toggelt.
Also Taste 1 drücken und festhalten und Taste 2 immer wieder drücken,
damit die LED toggelt. Das geht.
Nun habe ich das Problem, dass ich auch abfragen möchte, wann die Taste
1 losgelassen wird, damit ich das IFG für die erste Taste zurücksetzen
kann.

Gibt es da eine Möglichkeit oder kann man das irgendwie eleganter oder
anders lösen?

Gruß
Frank

Autor: xyz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann lösch doch einfach in der ISR für Taster1 das IFG und ändere die
Richtung der Flankenerkennung und verlasse die ISR. Beim loslassen
erzeugt das dann halt wieder ein Interrupt. Je nachdem wie dein Taster
prellt kann es sein dass du dich dann im Kreis drehst.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich würde die Tastendrücke gar nicht direkt mit Interrupts
abfragen, sondern einen Timerinterrupt (z.B. mit 1kHz) aufsetzen, der
dann den Zustand der Tasten auswertet. Das Prellen ist so auch schon
automatisch weg und man kann viel leichter messen wie lange eine Taste
gedrückt ist oder komplexe Kombinationen auswerten.

Für Dein Problem könntest Du vielleicht eine kleine State Machine (im
Timerinterrupt oder Main) programmieren, welche je nach Reihenfolge der
gedrückten oder losgelassenen Tasten den gewünschten Vorgang ausführt.

Autor: Frank Voss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da werde ich mal schauen wie ich das löse. Bin ein blutiger Anfänger und
werde mich da dann mal mt beschäftigen. Einen Timer nutze ich als
Real-Time-Clock. Werde mir dann man den Timer B heranziehen und sehen,
was ich da so hinbekomme.


Gruß
Frank

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst auch denselben Timer wie für die RTC benutzen, einfach den
Takt in der Software für die Tastenabfrage runterteilen.

Falls Du Dich noch nicht mit State Machines auskennst, würde ich mir
das mal angucken. So auf die schnelle habe ich das gefunden:
http://de.wikipedia.org/wiki/Endlicher_Automat

Im Code kannst Du das dann z.B. in einem grossen Switch / Case
verpacken, welches vom Timerinterrupt her bzw. durch ein im
Timerinterrupt gesetztes Flag immer wieder im Main aufgerufen wird.

Das nachfolgende Beispiel macht nicht so viel gescheites, aber so kann
man das Beispielsweise umsetzen...

Bsp.:

switch (zustand)
{
  case 1:
    if (taste_1_gedrück)
    {
      zustand = 2;
    }

    if (taste_2_gedrückt)
    {
      zustand = 3;
    }

    if (taste_1_gedrückt && taste_2_gedrückt)
    {
      zustand = 4;
    }
    break;

  case 2:
    // code der ausgeführt wird, wenn Taste 1 gedrückt wurde...
    ...
    zustand = 1;
    break;

  case 3:
    // code der ausgeführt wird, wenn Taste 2 gedrückt wurde...
    ...
    zustand = 1;
    break;

  case 4:
    // code der ausgeführt wird, wenn Taste 1 und 2 gedrückt wurden...
    ...
    zustand = 1;
    break;
}

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.