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


von Frank Voss (Gast)


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

von xyz (Gast)


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.

von Johnny (Gast)


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.

von Frank Voss (Gast)


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

von Johnny (Gast)


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;
}

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.