INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Effekt mit ISR für Button
29.01.2021, 11:12
Beitrag #1
Effekt mit ISR für Button
Hallo,
ich habe einen Rotary Encoder mit einer Tastfunktion KY-040. Den Button (SW) steuere ich per Interrupt an. Mir wurde bereits davon abgeraten, das per Interrupt zu machen. Trotzdem möchte ich gerne verstehen, was da passiert. Hier der Code:
Code:
#define SW 2                                                // SW am rotary encoder (2 wegen Interrupt)
const int BOUNCINGTIME = 10;                                // zum entprellen
volatile unsigned long buttontime = 0;                      // wird für millis() gebraucht
volatile bool buttondown = false;                           // Signal für Button gedrückt

void setup() {
  pinMode(SW, INPUT_PULLUP);                                // pullup Widerstand
  attachInterrupt(digitalPinToInterrupt(SW), ISR_SW, LOW);

  Serial.begin(9600);
}

void loop() {
  if (buttondown) {
    Serial.println("Button gedrückt");
    buttondown = false;
  }

}

void ISR_SW() {
  if ((millis() - buttontime) > BOUNCINGTIME) {
    buttontime = millis();
    buttondown = true;
  }
}

Wenn ich nun den Taster drücke, wird "Bu" ausgegeben, und wenn ich ihn dann loslasse, wird "tton gedrückt" ausgegeben.
Weiß jemand, warum Serial.println so zerhackt wird?
LG Karl

Karl Stanger
www.stangerweb.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 11:42
Beitrag #2
RE: Effekt mit ISR für Button
(29.01.2021 11:12)Karl Stanger schrieb:  Wenn ich nun den Taster drücke, wird "Bu" ausgegeben, und wenn ich ihn dann loslasse, wird "tton gedrückt" ausgegeben.
Weiß jemand, warum Serial.println so zerhackt wird?

Vermutlich, weil auch die serielle Ausgabe den IRQ nutzt.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 11:46
Beitrag #3
RE: Effekt mit ISR für Button
Für einen manuell betätigten Button braucht man keinen Interrupt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 12:31
Beitrag #4
RE: Effekt mit ISR für Button
Ich weiß, dass man da keinen Interrupt braucht. In meinem Projekt hat ich da auch keinen Interrupt. Trotzdem will ich verstehen, warum es mit einem Interrupt diesen Effekt gibt.

Karl Stanger
www.stangerweb.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 12:39
Beitrag #5
RE: Effekt mit ISR für Button
(29.01.2021 12:31)Karl Stanger schrieb:  Ich weiß, dass man da keinen Interrupt braucht. In meinem Projekt hat ich da auch keinen Interrupt. Trotzdem will ich verstehen, warum es mit einem Interrupt diesen Effekt gibt.

Der Interrupt "grätscht" in die serielle Ausgabe hinein und löscht dir den Ausgabepuffer. Alles was bis dahin noch nicht die Schnittstelle verlassen hat, ist dann einfach weg...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.01.2021, 13:34 (Dieser Beitrag wurde zuletzt bearbeitet: 29.01.2021 13:36 von MicroBahner.)
Beitrag #6
RE: Effekt mit ISR für Button
(29.01.2021 12:39)fhpa schrieb:  Der Interrupt "grätscht" in die serielle Ausgabe hinein und löscht dir den Ausgabepuffer. Alles was bis dahin noch nicht die Schnittstelle verlassen hat, ist dann einfach weg...
Weshalb sollte der Buttoninterrupt den seriellen Puffer löschen? Das wäre ziemlich fatal, wenn dem so wäre.

Nein, damit hat das nichts zu tun. Das Problem liegt im attachInterrupt:
Code:
attachInterrupt(digitalPinToInterrupt(SW), ISR_SW, LOW);
Durch das LOW wird der Interrupt ständig ausgelöst, solange der Button gedrückt wird. Es gibt da also einen regelrechten Interruptschauer - so dicht, dass die ISR für die serielle Schnittstelle gar nicht mehr dran kommt.
'LOW' darf man bei attachInterrupt nur verwenden, wenn man in der ISR das entsprechende Eingangssignal auch wieder auf HIGH stellen kann. Hier wäre dann wohl eher FALLING angesagt - mal unabhängig davon, dass es da gar keinen Interrupt braucht. Aber das war ja nicht die Frage.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.01.2021, 13:16
Beitrag #7
RE: Effekt mit ISR für Button
Das mit dem dauernd auslösen durch das LOW leuchtet mir ein. Danke für die Erklärung.
Hier noch meine Lösung ohne Interrupt zur Info:
Code:
const int BOUNCINGTIME = 10;                                // zum entprellen
volatile unsigned long buttontime = 0;                      // wird für millis() gebraucht
volatile bool buttondown = false;                           // Signal für Button gedrückt
...
void loop {
  if (digitalRead(SW) == HIGH) {
    buttontime = millis();
    buttondown = true;
  }
  if ((millis() - buttontime > BOUNCINGTIME) && buttondown) {
    buttondown = false;  
...

Karl Stanger
www.stangerweb.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Touch Button am TFT mit Libary „MCUFRIEND_kbv“ Heiko67 2 351 18.02.2021 21:56
Letzter Beitrag: Tommy56
  LED Flacker (Lagerfeuer effekt) Natsnok 3 498 09.01.2021 07:54
Letzter Beitrag: Natsnok
Brick 4 Button und 4 LED mögliche Kombinationen Mando 44 2.810 29.09.2020 09:22
Letzter Beitrag: Mando
  Nextion Fehler bei Button Abfrage wenn ich zusätzlich Text sende MarkZero0815 24 4.032 28.01.2020 08:23
Letzter Beitrag: hotsystems
  Button funktioniert nicht trotz korrekter Schaltung Schneggl 3 1.228 12.10.2019 08:17
Letzter Beitrag: Schneggl
  Led bei gedrückt gehaltenen Button nur 2 Sekunden leuchten lassen kiefer_dev 5 1.641 29.12.2018 14:36
Letzter Beitrag: Tommy56
  Button Anzahl erweitern 74HC4051 Andii1980 24 5.036 18.10.2018 23:26
Letzter Beitrag: Andii1980
  Hold Button - Doppel Klick Hilfe GSA1150 8 5.221 08.03.2018 16:24
Letzter Beitrag: Tommy56
  Button auswerten aggro600 14 4.327 09.11.2017 13:23
Letzter Beitrag: Tommy56
  Servo-Ansteuerung über einen Push-Button Aubergine83 1 1.986 16.02.2017 19:49
Letzter Beitrag: georg01

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste