Kleinigkeit, doButtonActions im MainLoop nötig?

Hi,

muss eigentlich doButtonActions() im MainLoop getriggert werden?

Hab das mal so im buttonHandler versetzt:

if (buttons[i].currentState != buttons[i].lastState && currentTimestamp - buttons[i].lastPressedTimestamp > buttonDebounceInterval) {
if (!buttons[i].currentState) {
buttons[i].isPressed = true;
buttons[i].lastPressedTimestamp = currentTimestamp;
doButtonActions();
} else {
buttons[i].isReleased = true;
buttons[i].lastReleasedTimestamp = currentTimestamp;
doButtonActions();
}

Kommt mir etwas schneller vor von der Bedienung.

Ich hatte auch mal versuchsweise das ganze in eine ISR verlegt, aber der Interrupt wurde auch bei Nichtbetätigung bei mir getriggert. Das könnte an zu langen Kabeln etc liegen…
Hab es nicht weiter verfolgt.

Gruß,
Elmar

Ist ein guter Punkt. Ja, das kann man vermutlich auch anders machen.
Grundsätzlich ausgelesen werden die Buttons über einen 1000 Hz-Hardwaretimer. ISR würde ich da nicht nehmen. Der Timer sorgt einfach für konstante Verhältnisse, ohne dem Ganzen zu hohe Priorität einzuräumen.

Der Hardware-Timer ist ein 240er-Prescaler mit 1000 Hz. Kannst mal nach „timerSemaphore = xSemaphoreCreateBinary();“ suchen.

Danke für die Info mit dem Timer. Hatte ich nicht gesehen.
Gruß,
Elmar

Ich merke gerade, dass ich ISR und Interrupt durcheinander geworfen habe :slight_smile:

Bei der ISR sollte man ja immer schauen, dass sie kurz bleibt. Hab da ja schon Leute gesehen, die haben da serielle Ausgaben reingemacht. Das geht einfach nicht, weil das blockiert ja so lange ALLES. Ich habe das auf jeden Fall so gelernt, dass man die ISR kurz macht und dort ein Flag setzt. Und mit dem Flag triggert man dann was Anderes, so dass die ISR nicht zu lange die CPU blockiert.