2 Tasten: eine oder beide gedrückt

Gast #231117
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!
Gast #231118
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
    }

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.