Forum: Mikrocontroller und Digitale Elektronik 2 Tasten: eine oder beide gedrückt


von leif (Gast)


Lesenswert?

So,

ich bin wirklich nicht der geborene Programmierer. Ich möchte mit den
beiden Tastern den Motor rauf bzw. runter fahren, und wenn beide
gleichzeitig gedrückt werden, aus der Schleife raus.

Habe alles mögliche ausprobiert, aber egal was ich mache, es greift
immer noch einer der Einzeltastenprüfungen, so daß der Motor noch
angeschaltet wird. Das muß ausgeschlossen werden.

Natürlich könnte man den dann einfach wieder ausschalten, aber erstens
erwarte ich Probleme mit dem verfügbaren Programmspeicher, und zweitens
bin ich mir sicher, daß es eine gute Lösung gibt.

system.beat kommt alle 20ms, die Entprellung wird durch Peters
'bulletproof' Routine mit Takt alle 1,6ms vorgenommen.



while(1) {                                // forever true


if( system.beat ) {
system.beat=0;
system.prescaler++;

tempB=switch_closed(1<<BUTTON_GREEN | 1<<BUTTON_RED);

if ( temp==system.prescaler ) {                  // every ms
temp=temp+20;

if( tempB == (1<<BUTTON_RED | 1<<BUTTON_GREEN) ) {

led_red=5;
break;

}
else if(tempB == 1<<BUTTON_GREEN ) {
stepper.dir=DOWN;
stepper.speed=120;
stepper.power=1;
PORT_LED_GREEN |= 1 << LED_GREEN;
}
else if( tempB == 1<<BUTTON_RED) {
stepper.dir=UP;
stepper.speed=120;
stepper.power=1;
PORT_LED_RED |= 1 << LED_RED;
}

}


}


if(switch_opened(1<<BUTTON_GREEN)) {
stepper.power=0;
PORT_LED_GREEN &= ~(1 << LED_GREEN);
}



if(switch_opened(1<<BUTTON_RED)) {
stepper.power=0;
PORT_LED_RED &= ~(1<<LED_RED);
}



}  // while(1)


Hier erfolgt also nach spätestens 400ms die Erkennung, vielleicht
sollte ich die Verzögerung auch noch erhöhen.

Ich würde mich wirklich über ein wenig Hilfestellung freuen, so ein
bescheuertes Brett vor dem Kopf kann einem die ganze Lust verderben!
Danke!

von leif (Gast)


Lesenswert?

Oh, es kann auch sein, daß dieser Code völlig versagt.. bei mir tut sich
nämlich gerade gar nichts. Ich habe gester nach etlichen Versuchen wohl
entnervt aufgegeben.

Aber der Code ist nicht so wichtig, das fiese ist ja, daß durch die
Schleife z.B. erst der eine Taster erkannt wird, und im nächsten
Durchlauf dann noch der andere dazukommt: für den µC sind dann beide
gedrückt, der Motor läuft noch. Sense.

Auch die Zustandsabfrage hat mich nicht weitergebracht, ich verwende
dazu folgende Fkt.

jetzt dochmal mit dem syntaxdingens
1
    uint8_t switch_state( uint8_t key_mask )   {            // debounce
2
switches
3
      cli();                              // disable global interrupts
4
      key_mask &= key_state;                      // read key(s)
5
      sei();                              // careful! this enables interrupts globally
6
                                      // regardless of previous state!
7
      return key_mask;
8
    }

von Hannes L. (hannes)


Lesenswert?

Prüfe doch zuerst, ob beide Taster gleich sind (gedrückt oder nicht
gedrückt ist egal) und prüfe den Rest (Richtung) nur bei Ungleichheit.
Somit reagierst du nur dann, wenn nur einer der Taster betätigt ist.

...

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.