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!
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.