Ich überwache einen Taster mit einem Mikrocontroller, wo ich versuche, vier Dinge zusammen zu erledigen:
Unten ist ein kurzer Pseudocode dessen, was ich bisher implementiert habe. Ich denke, es deckt alle diese Fälle ab.
Sehen Sie mögliche Verbesserungen oder potenzielle Probleme? (Zum Beispiel interessiere ich mich für alle subtilen Fälle, die blinde Flecken für meinen Ansatz sein könnten.)
Pseudocode:
Main loop {
Sleep
}
Falling-Interrupt {
Disable Falling-Interrupt
Enable 50-millisecond-Debounce-Timer-Interrupt
}
50-millisecond-Debounce-Timer-Interrupt {
if PushButton state is still LOW {
Enable Rising-Interrupt
Enable 1000-millisecond-Hold-Timer-Interrupt
}
}
1000-millisecond-Hold-Timer-Interrupt {
Register as Pushbutton long-hold
}
Rising-Interrupt {
if (Time since Falling-Interrupt < 1000 millisecond) {
Register as Button Short-press
}
Disable 1000-millisecond-Hold-Timer-Interrupt
Enable 25-millisecond-Debounce-Timer-Interrupt
}
25-millisecond-Debounce-Timer-Interrupt {
Enable Falling-Interrupt
}
Ich kann keinen Code in einen Kommentar einfügen, daher eine Antwort. Mein 'Framework' für einfache eingebettete Systeme ist die Hauptschleife mit Polling. Um den Stromverbrauch zu minimieren, kann die Hauptschleife beispielsweise 50 ms im Ruhemodus warten. Ich weiß nicht, welches uC Sie verwenden, ich kenne PICs, die durch einen Interrupt aus dem Schlaf geweckt werden können.
set up an interrupt to wake me from sleep each 50 ms
down_counter = 0
for(;;){
sleep();
if( key down ){
down_counter++;
if( down_counter == 20 ){
(start of) long_down detected
}
} else {
if( down_counter > 1 && down_counter < 20 ){
(end of) short press detected
}
down_counter = 0;
}
}
Wouter van Ooijen
Brettbiss
Nick Alexejew
re: how can I detect a pushbutton event amidst sleep?
Du kannst nur einen (1) Interrupt verwenden: den Falling-Interrupt. Wachen Sie bei diesem Interrupt auf und erledigen Sie den Rest der Entprellung in der Hauptschleife. Schlafen Sie wieder ein, wenn der Code anzeigt, dass der Tastendruck nicht "echt" war.