Taster mit Interrupt entprellen
guten abend gemeinde,
bin seit ein paar wochen angefixt vom arduino und komme nicht mehr weg von dem
habe schon einige tutorials durch und auch schon einiges "gebastelt" mit den kindern zusammen.
jetzt zu meinem problem. irgendwie hab ich einen knoten im hirn. versuche seit stunden auf die lösung zu kommen. aber ich komme nicht weiter.
ich mit einem taster die hintergrundbeleuchtung einem lcd ein- und ausschalten.
das klappt mit dem anhängenden sketch super. ich dachte nur ich kann das irgendwie in einem rutsch in der isr erledigen ... nur wie
ich hoffe ich bekomme einen schlag auf den hinterkopf
auch falls sonst irgendwelche fehler im sketch sind (auch wenn er geht, heißt es ja nicht das er gut ist
), freue ich mich über verbesserungsvorschläge.
danke im voraus! bin für jeden tipp dankbar.
schönes restwochenende !
bin seit ein paar wochen angefixt vom arduino und komme nicht mehr weg von dem

habe schon einige tutorials durch und auch schon einiges "gebastelt" mit den kindern zusammen.
jetzt zu meinem problem. irgendwie hab ich einen knoten im hirn. versuche seit stunden auf die lösung zu kommen. aber ich komme nicht weiter.
ich mit einem taster die hintergrundbeleuchtung einem lcd ein- und ausschalten.
das klappt mit dem anhängenden sketch super. ich dachte nur ich kann das irgendwie in einem rutsch in der isr erledigen ... nur wie

ich hoffe ich bekomme einen schlag auf den hinterkopf

auch falls sonst irgendwelche fehler im sketch sind (auch wenn er geht, heißt es ja nicht das er gut ist

danke im voraus! bin für jeden tipp dankbar.
schönes restwochenende !
code: [select]
// wire bibliothek inkludieren für die i2c kommunikation (sda, scl)
#include <wire.h>
// i2c-lcdisplay bibliothek inkludieren
#include <liquidcrystal_i2c.h>
/* ************************* d e f n t o n e n ************************************************************ */
// definitionen benötigen weniger speicherplatz, da der compiler nur den namen mit dem wert ersetzt.
#define taster_lcd_backlight 18 // taster um die lcd beleuchtung ein/aus zu schalten
liquidcrystal_i2c lcd(0x27, 20, 4); // i2c-lcd objekt erstellen mit der adresse 0x27, mit 20 zeichen und 4 zeilen
/* ************************* v r b l e n ******************************************************************* */
byte entprellzeit = 200; // entprellzeit des taster. achtung byte nur bis 255 ms !!!
unsigned long lasttimelcdtaster = 0; // variable für den timer des tasters zum entprellen
byte zustandlcdtaster = high; // variable für den lcd tasterzustand. volatile um die variable immer neu zu lesen und nicht aus dem speicher !
/* ************************* s e t u p *************************************************************************** */
void setup() {
pinmode(taster_lcd_backlight, input); // pin ist ein input für den taster der hintergrundbeleuchtung
attachinterrupt(digitalpintointerrupt(taster_lcd_backlight), lcdlight, high); // interrupt den taster input aktivieren und bei high funktion "lcdlight ausführen
lcd.init(); // lcdisplay initialisieren
lcd.backlight(); // lcdisplay hintergrundbeleuchtung an
lcd.clear(); // lcdisplay löschen
}
/* ************************* p r o g r m m b l u f ********************************************************* */
void loop() {
// taster per interrupt überwachen für hintergrundbeleuchtung
if (zustandlcdtaster == high) {
lcd.backlight();
}
else {
lcd.nobacklight();
}
}
/* ************************* e g e n e f u n k t o n e n *************************************************** */
// lcd hintergrundbeleuchtung an/aus mit entprelltem taster
void lcdlight()
{
if ((millis() - lasttimelcdtaster) > entprellzeit) {
zustandlcdtaster = !zustandlcdtaster;
lasttimelcdtaster = millis();
}
}
quote
ich dachte nur ich kann das irgendwie in einem rutsch in der isr erledigen ... nur wiedas ist mit einer hürde verbunden.
in einer isr sind die interrupts gesperrt.
i2c funktioniert bei gesperrten interrupts nicht.
quote
diese variablen müssen als volatile gekennzeichnet werden, da sie von dir in einer isr genutzt werden.code: [select]unsigned long lasttimelcdtaster = 0; // variable für den timer des tasters zum entprellen
byte zustandlcdtaster = high; // variable für den lcd tasterzustand. volatile um die variable immer neu zu lesen und nicht aus dem speicher !
tipp:
tasten entprellen geht auch ohne interrupts.
(oft gar viel besser)
denn:
dein tasten interrupt betreibt dauerfeuer, solange der taster betätigt wird.
nur ein einzelnes maschinenkommando wird zwischen den isr aufrufen ausgeführt.
die performance des restprogramms dürfte auf ca 1% zusammenbrechen.
Arduino Forum > International > Deutsch (Moderator: uwefed) > Taster mit Interrupt entprellen
arduino
Comments
Post a Comment