mikrocontroller.net

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


Autor: leif (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: leif (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

    uint8_t switch_state( uint8_t key_mask )   {            // debounce
switches
      cli();                              // disable global interrupts
      key_mask &= key_state;                      // read key(s)
      sei();                              // careful! this enables interrupts globally
                                      // regardless of previous state!
      return key_mask;
    } 

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

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.