Taster mit Interrupt entprellen


guten abend gemeinde,

bin seit ein paar wochen angefixt vom arduino und komme nicht mehr weg von dem  :d
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  :smiley-mr-green:
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 !


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 wie
das ist mit einer hürde verbunden.

in einer isr sind die interrupts gesperrt.
i2c funktioniert bei gesperrten interrupts nicht.


quote
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 !
diese variablen müssen als volatile gekennzeichnet werden, da sie von dir in einer isr genutzt werden.


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

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts