Forum: Mikrocontroller und Digitale Elektronik Problem mit Taste kurz / Taste lang!


von H. G. (ledi)


Lesenswert?

Hallo!

Ich tüftle gerade daran, einen langen Tastendruck zu erkennen und damit 
eine Routine für eine LED-Dimmung auszuführen.

Wird die Taste 9 gedrückt, wird in der ISR "9" in Taste gespeichert. Der 
Tastenwert 9 bleibt also solange erhalten, bis eine andere Taste 
gedrückt wird.

Bei einem Tastendruck wird alle 35ms ein Interrupt ausgelöst.

Folgendes soll passieren:

Wenn Taste 9 == kurz --> dimm LED um + 20%
Wenn Taste 9 == lang --> dimm LED stufenlos solange Taste 9 gedrückt 
wird

Bitte um einen Vorschlag, wie ich das lösen kann!

Die Abfrage der Taste passiert in main unter
1
while(1)
2
{
3
    if( Taste == 9 und kurz)       
4
    {
5
        OCR0SA = valuetable[ value + 20% ];
6
    }
7
    if (Taste == 9 und lang)      
8
    {
9
        OCR0SA = valuetable[ value + x ];
10
    }
11
}

Hier die ISR:
1
ISR(INT2_vect)  // Int.2 on PB5
2
{
3
    Payload_RX(0x61, 0x00);    // Read FIFO payload
4
5
    Taste = SPDR;             // and store value in Taste
6
7
    Flush_RX();      // clear  RX-FIFO
8
}

von gerd (Gast)


Lesenswert?

Wenn es nur funktionieren soll, dann kannst du dir ja mal Peter 
Danneggers Routine anschauen.

Entprellung: Interrupt-Verfahren nach Peter Dannegger

- gerd

von H. G. (ledi)


Lesenswert?

Danke, die Routine kenne ich. Sie hilft mir hier aber nicht weiter, da 
in meinem Fall der Tastenwert als fixer Wert zugewiesen wird und zwar 
solange, bis eine andere Taste gedrückt wird.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Dann baue einen Zähler ein für die Anzahl dieser Tastenwerte. Damit 
unterscheidest du kurze Tastendrücke (niedriger Zählerstand) von langen 
(hoher Zählerstand)

Damit das funktioniert brauchst du aber einen "Stopper" für den Zähler.

Der Stopper wäre idealerweise bei der Taste und liefert über SPI ein 
Event "Taste-Losgelassen". Dann brauchst du keine 2. Taste zu drücken.

von Karl H. (kbuchegg)


Lesenswert?

Heimo G. schrieb:
> Danke, die Routine kenne ich. Sie hilft mir hier aber nicht weiter, da
> in meinem Fall der Tastenwert als fixer Wert zugewiesen wird und zwar
> solange, bis eine andere Taste gedrückt wird.

Und?

Die Erkennung von Tasten und die Auswertung was ein Tastendruck machen 
soll, sollte man sowieso voneinander trennen. Der in der Danegger Lösung 
eingebaute Autorepeat erledigt deine Anforderungen mit Leichtigkeit.

Das einzige Problem: Du hast keine physischen Tasten am µC 
angeschlossen. Aber auch das lässt sich lösen indem man die Danegger 
Entprellung auf simulierte Tastenbits loslässt, die von deiner FIFO ISR 
entsprechend umgestellt werden.

Das heißt: Der entscheidende Schritt besteht nicht darin, da jetzt in 
der Auswertung rumzufuhrwerken. Der entscheidende Schritt ist die Frage: 
Wie sind eigentlich deine Tasten angeschlossen, bzw. wodurch wird der 
Interrupt ausgelöst bzw. wäre ein regelmässiges Polling (des 
Schieberegisters?) nicht eigentlich besser?

von Artur R. (artur2000)


Lesenswert?

du kannst es so lösen:
Du nimmst einen Timer der per Interrupt alle 100ms eine Variabel 
hochzählt, z.B:

ISR(TIMER1_COMPA_vect){
  hSekunden++;
  if (hSekunden >= 864000)//24h vorbei,wieder auf 0
    Sekunden = 0;
}

Danach kommt dein Zeug ins Spiel:

while(1)
{
    if( Taste == 9)
    {
        i_var=hSekunden;
    }
    while ((Taste == 9 und (hSekunden-i_var)< 10) // eine Sekunde )
    {
        OCR0SA = valuetable[ value + 20% ];
    }
    while (Taste == 9 und (hSekunden-i_var) >= 10) // eine Sekunde
    {
        OCR0SA = valuetable[ value + x ];
    }
}

von H. G. (ledi)


Lesenswert?

Das kann ich so nicht lösen, da ich bei einem Tastendruck alle 35ms 
einen Interrupt auslöse!

von Peter D. (peda)


Lesenswert?

Heimo G. schrieb:
> Das kann ich so nicht lösen, da ich bei einem Tastendruck alle 35ms
> einen Interrupt auslöse!

Na dann nimmst Du eben nicht 10ms, sondern 50ms für den Timerinterrupt. 
Und die lang-/kurz Zeiten werden auf 50ms-Schritte berechnet.

Wird das Tasteinputbit alle 35ms gesetzt, ist es also nach 50ms 
garantiert gesetzt, solange gedrückt wird.


Peter

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.