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
Interrupt mit Tastern und "Drückdauer"
01.10.2013, 10:24 (Dieser Beitrag wurde zuletzt bearbeitet: 02.10.2013 09:20 von Odiug.)
Beitrag #1
Interrupt mit Tastern und "Drückdauer"
Hallo und Guten Tag,

ich bin neu hier und daher ein paar Worte über mich.
Ich bin nicht der reine Elektronikbastler, ich nehme auch mal eine Flex, eine Stichsäge oder ein Schweißgerät in die Hand. Heute das Hochbett, morgen die Gartenpumpe und übermorgen die Heizungsregelung. Somit treffe ich auf viele Probleme, die ich dann lösen möchte.
Zur einiger Zeit beschäftige ich mich nach einem Arduini Uno mit einem Arduino Due. Hier komme ich nicht weiter, da es mir noch an Verständnis fehlt.

Ich habe an einen Due vier Tasten angeschlossen. Alle vier Tasten werden über einen Interrupt überwacht, da die spätere Anwendung zeitkritisch werden kann.

Hier das einfache funktionierende Programm dazu:

//-----------------------------------------------------------------------------
// Taster-Steuerung
//-----------------------------------------------------------------------------


//-----------------------------------------------------------------------------
// Die Pin's vom Bord erhalten einen Namen:
volatile int tasterLinks = 2;
volatile int tasterRechts = 3;
volatile int tasterStop = 4;
volatile int tasterWarn = 5;

// Variablen und Konstanten
volatile int irqFlag = 0; // 0=do nothing


//--------------------------------------------------------------------------------
// Setup and Main:
void setup()
{
Serial.begin(9600); // Initialisierung Interface mit 9600 Baud

pinMode(2, INPUT); // Pin ist Eingang
pinMode(3, INPUT); // Pin ist Eingang
pinMode(4, INPUT); // Pin ist Eingang
pinMode(5, INPUT); // Pin ist Eingang

attachInterrupt(2, fTasterLinks, HIGH); // Enable interrupt
attachInterrupt(3, fTasterRechts, HIGH); // Enable interrupt
attachInterrupt(4, fTasterStop, HIGH); // Enable interrupt
attachInterrupt(5, fTasterWarn, CHANGE); // Enable interrupt
}


//--------------------------------------------------------------------------------
void loop()
{
Serial.print("Loop ");
Serial.println(irqFlag);

switch (irqFlag)
{
case 1:
Serial.println("Taste Links ");
delay(1000);
irqFlag=0;
break;

case 2:
Serial.println("Taste Rechts");
delay(1000);
irqFlag=0;
break;

case 3:
Serial.println("Taste Stop");
delay(1000);
irqFlag=0;
break;

case 4:
Serial.println("Taste Warn");
delay(1000);
irqFlag=0;
break;

default:
irqFlag=0; // Reset IRQ flag
}
}


//--------------------------------------------------------------------------------
// Subs and Functions:

// Interrupt-Routine Taster Links
void fTasterLinks()
{
irqFlag = 1;
}

// Interrupt-Routine Taster Rechts
void fTasterRechts()
{
irqFlag=2;
}

// Interrupt-Routine Taster Stop
void fTasterStop()
{
irqFlag=3;
}

// Interrupt-Routine Taster Warn
void fTasterWarn()
{
irqFlag=4;
}

Soweit alles recht einfach. Auf eine Entprellung habe ich zur Zeit verzichtet, da ich diese wohl besser mit einem Widerstand und Kondensator auf Hardwarebasis bewerkstellige.
Was ich jedoch nicht hinbekomme, ist die "Drückzeit eines Taster" zu bestimmen. Ich möchte einen kurze Kontaktdauer und eine lange Kontaktdauer bei jedem Taster unterscheiden können.
Mit millis() kann ich in den Interruptroutinen nicht arbeiten, der Befehl funktioniert dort nicht.
Ich habe irgendetwas über "Register" gelesen, die man auslesen kann. Verstanden habe ich es nicht.
Wer kann helfen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2013, 11:31
Beitrag #2
RE: Interrupt mit Tastern und "Drückdauer"
Hallo Odiug,

da sprichst du einen Punkt an, für den ich auch noch keine optimale Lösung gefunden habe. Wie wir es auch anstellen, wir riskieren die Unterbrechung laufender Funktionen. Deshalb suche ich auch noch nach einem guten Taskmanagement. Also ich verwende keinen Interrupt für die Bedienung, sondern lasse den Zweibeiner u.U. etwas länger drücken, bis das Programm an sinnvoller Stelle unterbrochen werden darf. Kurz- und Langdrücken kann dann nur noch bedingt eingesetzt werden. Insofern kann ich dir da keine wirkliche Lösung anbieten. Vielleicht hat ja sonstwer eine? Ansonsten herzlich willkommen hier. Smile

Gruß, Stefan . . . . . . //Wo mein Kölbchen dampft, da bin ich unverkrampft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2013, 11:57 (Dieser Beitrag wurde zuletzt bearbeitet: 01.10.2013 12:36 von rkuehle.)
Beitrag #3
RE: Interrupt mit Tastern und "Drückdauer"
Moin,

kann man das nicht über die bounce.h abfangen Huh
Die hat doch eine Parameter über den man die verschiedenen Tasterinputs innerhalb einer Zeitspanne als ein Signal bewerten kann, oder?
Man könnte das doch "missbrauchen" nach dem Motto:
Code:
#include <Bounce.h>
#define BUTTON 2
Bounce bouncer1 = Bounce( BUTTON,1000 ); // lange "Drückzeit" als erstes
Bounce bouncer2 = Bounce( BUTTON,10 ); // kurze "Drückzeit" als zweites
void setup() {
pinMode(BUTTON,INPUT);
}
void loop()
{
if (bouncer1.update ( ) || bouncer2.update ( ))
{
if ( bouncer1.read() == HIGH) {bla bla}// lange Zeit abfragen
if ( bouncer2.read() == HIGH) {blu blu} // falls nicht lange Zeit, dann vllt. die kurze?
}
}

Grüße Ricardo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.10.2013, 13:06
Beitrag #4
RE: Interrupt mit Tastern und "Drückdauer"
ich bin mir nicht sicher, ob dein Code das gewünschte Ergebnis liefert - aber du hast schon Recht: mit der Bounce-lib könnte es gehen.

so, jetzt muss ich aber erst mal zu einer Beerdigung.......

Gruß, Stefan . . . . . . //Wo mein Kölbchen dampft, da bin ich unverkrampft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  while Schleife nach sleep mode interrupt tklaus 13 260 23.11.2016 17:40
Letzter Beitrag: Tommy56
  NRF24L01 Interrupt MeisterQ 22 517 02.11.2016 15:50
Letzter Beitrag: MeisterQ
  Interrupt matthias3579 5 221 15.10.2016 13:23
Letzter Beitrag: hotsystems
  Interrupt und Sicherung der Prozessorregister MKc 5 225 31.08.2016 11:17
Letzter Beitrag: MKc
  Interrupt bei Serieller Übertragung Binatone 8 365 21.06.2016 14:09
Letzter Beitrag: Scheams
  Interrupt wenn softwareSerial Daten BennIY 3 445 01.05.2016 18:39
Letzter Beitrag: tiny85fan
  Timer Interrupt Anfängerprobleme Fox 4 620 05.03.2016 02:28
Letzter Beitrag: Fox
  Problem mit Pin Change Interrupt in Library Retian 0 321 10.02.2016 23:37
Letzter Beitrag: Retian
  Aus While-Schleife durch Interrupt aussteigen Zill3 10 1.191 08.02.2016 16:28
Letzter Beitrag: ardu_arne
  Verwendung ? : Arduino MEGA 2560 - Interrupt 3 und 2 (Pin 20 /21) zauche 7 1.467 18.06.2015 22:01
Letzter Beitrag: zauche

Gehe zu:


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