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
Stop Befehl während einer Void - Loop
13.01.2014, 15:56
Beitrag #1
Stop Befehl während einer Void - Loop
Hey,

ich habe folgendes Anliegen:

ich habe eine Void - Loop in der 9 Leds im Sekundentakt durchblinken wenn ich einen Taster betätige. Nach durchlauf wird es automatisch gestoppt. Jetz möchte ich jedoch auch, wenn ich den Start Taster noch einmal betätige die Sequenz direkt Stoppen. Wie tu ich das Big Grin

Anbei mal mein Code:

const int button = 12;
const int led = 0;
const int led2 = 1;
const int led3 = 2;
const int led4 = 3;
const int led5 = 4;
const int led6 = 5;
const int led7 = 6;
const int led8 = 7;
const int led9 = 8;
const int led10 = 10;

int button1 = 0;







void setup(){
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);

while (digitalRead(button)==HIGH)
{
digitalWrite(led10, HIGH);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
digitalWrite(led2, HIGH);
delay(1000);
digitalWrite(led2, LOW);
delay(1000);
digitalWrite(led3, HIGH);
delay(1000);
digitalWrite(led3, LOW);
delay(1000);
digitalWrite(led4, HIGH);
delay(1000);
digitalWrite(led4, LOW);
delay(1000);
digitalWrite(led5, HIGH);
delay(1000);
digitalWrite(led5, LOW);
delay(1000);
digitalWrite(led6, HIGH);
delay(1000);
digitalWrite(led6, LOW);
delay(1000);
digitalWrite(led7, HIGH);
delay(1000);
digitalWrite(led7, LOW);
delay(1000);
digitalWrite(led8, HIGH);
delay(1000);
digitalWrite(led8, LOW);
delay(1000);
digitalWrite(led9, HIGH);
delay(1000);
digitalWrite(led9, LOW);
delay(1000);
}

}


void loop()
{
button1 = digitalRead(button);


if (button1 == HIGH)
{
digitalWrite(led10, HIGH);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
digitalWrite(led2, HIGH);
delay(1000);
digitalWrite(led2, LOW);
delay(1000);
digitalWrite(led3, HIGH);
delay(1000);
digitalWrite(led3, LOW);
delay(1000);
digitalWrite(led4, HIGH);
delay(1000);
digitalWrite(led4, LOW);
delay(1000);
digitalWrite(led5, HIGH);
delay(1000);
digitalWrite(led5, LOW);
delay(1000);
digitalWrite(led6, HIGH);
delay(1000);
digitalWrite(led6, LOW);
delay(1000);
digitalWrite(led7, HIGH);
delay(1000);
digitalWrite(led7, LOW);
delay(1000);
digitalWrite(led8, HIGH);
delay(1000);
digitalWrite(led8, LOW);
delay(1000);
digitalWrite(led9, HIGH);
delay(1000);
digitalWrite(led9, LOW);
delay(1000);
}
else {

digitalWrite(led10, LOW);
}



}



Schnelle Hilfe wäre super, danke im Vorraus.

Mfg
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.01.2014, 17:35 (Dieser Beitrag wurde zuletzt bearbeitet: 13.01.2014 17:39 von investmentclub.)
Beitrag #2
RE: Stop Befehl während einer Void - Loop
Eine einfache Möglich ist immer wieder den oder die Taster abzufragen.

Gruß
Hans-Jürgen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.01.2014, 08:55
Beitrag #3
RE: Stop Befehl während einer Void - Loop
Wenn du es vernünftig machen willst, löst du mit deinem Taster einen externen Interrupt aus Wink

Dann hast du wirklich und sicher die Funktion, dass er genau Das Programm sofort an Laufender Stelle unterbricht, wenn dein Button kommt.

MfG demo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.01.2014, 09:00
Beitrag #4
RE: Stop Befehl während einer Void - Loop
(13.01.2014 17:35)investmentclub schrieb:  Eine einfache Möglich ist immer wieder den oder die Taster abzufragen.

ich habe den code nun umgeändert und eine taster abfrage hinzugefügt. Jedoch wird der loop nicht unterbrochen wenn ich ein 2. mal auf den button drücke. anbei mein code. Ich hoffe ihr entdeckt meinen Fehler und könnt mir einen Tipp geben.

const int button = 12;
const int led = 0;
const int led2 = 1;
const int led3 = 2;
const int led4 = 3;
const int led5 = 4;
const int led6 = 5;
const int led7 = 6;
const int led8 = 7;
const int led9 = 8;
const int led10 = 10;

int button1 = 0;
long debounce = 200;

int state= HIGH;
int reading;
int previous = LOW;


void setup(){
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
pinMode(led9, OUTPUT);
pinMode(led10, OUTPUT);

while (digitalRead(button)==HIGH)
{
digitalWrite(led10, HIGH);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
digitalWrite(led2, HIGH);
delay(1000);
digitalWrite(led2, LOW);
delay(1000);
digitalWrite(led3, HIGH);
delay(1000);
digitalWrite(led3, LOW);
delay(1000);
digitalWrite(led4, HIGH);
delay(1000);
digitalWrite(led4, LOW);
delay(1000);
digitalWrite(led5, HIGH);
delay(1000);
digitalWrite(led5, LOW);
delay(1000);
digitalWrite(led6, HIGH);
delay(1000);
digitalWrite(led6, LOW);
delay(1000);
digitalWrite(led7, HIGH);
delay(1000);
digitalWrite(led7, LOW);
delay(1000);
digitalWrite(led8, HIGH);
delay(1000);
digitalWrite(led8, LOW);
delay(1000);
digitalWrite(led9, HIGH);
delay(1000);
digitalWrite(led9, LOW);
delay(1000);
}

}


void loop()
{
reading = digitalRead(button);


if (reading == HIGH && previous == LOW > debounce)
{
button1 = digitalRead(button);


if (button1 == HIGH)
{
digitalWrite(led10, HIGH);
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
digitalWrite(led2, HIGH);
delay(1000);
digitalWrite(led2, LOW);
delay(1000);
digitalWrite(led3, HIGH);
delay(1000);
digitalWrite(led3, LOW);
delay(1000);
digitalWrite(led4, HIGH);
delay(1000);
digitalWrite(led4, LOW);
delay(1000);
digitalWrite(led5, HIGH);
delay(1000);
digitalWrite(led5, LOW);
delay(1000);
digitalWrite(led6, HIGH);
delay(1000);
digitalWrite(led6, LOW);
delay(1000);
digitalWrite(led7, HIGH);
delay(1000);
digitalWrite(led7, LOW);
delay(1000);
digitalWrite(led8, HIGH);
delay(1000);
digitalWrite(led8, LOW);
delay(1000);
digitalWrite(led9, HIGH);
delay(1000);
digitalWrite(led9, LOW);
delay(1000);
}
else {

digitalWrite(led10, LOW);
if (state == HIGH)
state = LOW;
else
state = HIGH;

}
}
else {

digitalWrite(led10, LOW);
}

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.01.2014, 09:30
Beitrag #5
RE: Stop Befehl während einer Void - Loop
Deine if(digitalRead(button)==HIGH)-Bedingung wird mit True-Bedingung begonnen. Dann läuft dein Muster durch. Während dieser Abarbeitung wird kein weiterer Button ausgewertet.

Möglichkeit 1 (nicht schön, quick and really dirty, nicht wirklich funktionell):
Bei jeder LED abfragen:
Code:
digitalWrite(led10, HIGH);
while (digitalRead(button)==HIGH)...
digitalWrite(led, HIGH);
while (digitalRead(button)==HIGH)...
delay(1000);
while (digitalRead(button)==HIGH)...
digitalWrite(led, LOW);
while (digitalRead(button)==HIGH)...
delay(1000);
while (digitalRead(button)==HIGH)...
digitalWrite(led2, HIGH);
Aber auch hier: Wenn du den Button nur antippst und er gerade im delay() hängt, wird das auch nicht registriert.

Dehalb:
Möglichkeit 2: externer Interrupt mit dem Button auslösen (sehr elegant und genau das, was du willst) Wink

MfG demo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2014, 00:53
Beitrag #6
RE: Stop Befehl während einer Void - Loop
(14.01.2014 09:30)demokrit schrieb:  Deine if(digitalRead(button)==HIGH)-Bedingung wird mit True-Bedingung begonnen. Dann läuft dein Muster durch. Während dieser Abarbeitung wird kein weiterer Button ausgewertet.

Möglichkeit 1 (nicht schön, quick and really dirty, nicht wirklich funktionell):
Bei jeder LED abfragen:
Code:
digitalWrite(led10, HIGH);
while (digitalRead(button)==HIGH)...
digitalWrite(led, HIGH);
while (digitalRead(button)==HIGH)...
delay(1000);
while (digitalRead(button)==HIGH)...
digitalWrite(led, LOW);
while (digitalRead(button)==HIGH)...
delay(1000);
while (digitalRead(button)==HIGH)...
digitalWrite(led2, HIGH);
Aber auch hier: Wenn du den Button nur antippst und er gerade im delay() hängt, wird das auch nicht registriert.

Dehalb:
Möglichkeit 2: externer Interrupt mit dem Button auslösen (sehr elegant und genau das, was du willst) Wink

MfG demo

Also den Button einfach an den Interrupt pin anschliessen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2014, 07:20
Beitrag #7
RE: Stop Befehl während einer Void - Loop
(15.01.2014 00:53)Coleby schrieb:  
(14.01.2014 09:30)demokrit schrieb:  Deine if(digitalRead(button)==HIGH)-Bedingung wird mit True-Bedingung begonnen. Dann läuft dein Muster durch. Während dieser Abarbeitung wird kein weiterer Button ausgewertet.

Möglichkeit 1 (nicht schön, quick and really dirty, nicht wirklich funktionell):
Bei jeder LED abfragen:
Code:
digitalWrite(led10, HIGH);
while (digitalRead(button)==HIGH)...
digitalWrite(led, HIGH);
while (digitalRead(button)==HIGH)...
delay(1000);
while (digitalRead(button)==HIGH)...
digitalWrite(led, LOW);
while (digitalRead(button)==HIGH)...
delay(1000);
while (digitalRead(button)==HIGH)...
digitalWrite(led2, HIGH);
Aber auch hier: Wenn du den Button nur antippst und er gerade im delay() hängt, wird das auch nicht registriert.

Dehalb:
Möglichkeit 2: externer Interrupt mit dem Button auslösen (sehr elegant und genau das, was du willst) Wink

MfG demo

Also den Button einfach an den Interrupt pin anschliessen?

Nein Wink
Du musst deinem Programm sagen:
- dass es Interrupts gibt
- welche Art von Interrupts (in diesem Fall extern)
- wann der Interrupt ausgelöst werden soll (steigende Flanke, fallende Flanke, steigend oder fallend...)
- was ausgeführt wird, wenn der Interrupt ausgelöst wurde

Im Datenblatt des Mikrocontrollers (beim Uno ATmega328) findet mal alle nötigen Informationen.

In etwa so:

Code:
cli();                           // globale Interrupts deaktivieren
EICRA  |= (1 << ISC11);          // Interrupt bei fallender Flanke an INT1 (Pin 3)    
EIMSK  |= (1 << INT1);           // INT1 enable                                        
sei();

Wenn der Interrupt ausgelöst wird, wird eine ISR (Interrupt Service Routine) ausgeführt und das laufende Programm unterbrochen

Code:
ISR(INT1_vect)
{
// mach irgendwas
}

Dieses Beispiel ist jetzt aber für fallende Flanke (Ruhestromprinzip), für steigende Flanke, also wenn dein Schließer zu geht, musst du das entsprechende Register ändern (EICRA)...

Grundsätzlich gilt:
Beim auslösen eines Interruptes wird das laufende Programm sofort unterbrochen und die ISR ausgeführt. Wenn diese ausgeführt wurde, wird das Programm an der Stelle, wo man ausgestiegen ist, fortgesetzt.

Hinweis: Meine Programmfragmente sind "reines C", also kein Arduino-Dialekt... Wer das sozusagen von der Pike auf lernen will, sollte das mit Datenblatt etc. machen.

Einfache Variante mit Beispiel ist hier zu finden:
http://arduino.cc/de/Reference/AttachInterrupt

Letzten Ende macht dieser Code aber nichts anderes Wink

MfG demo
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2014, 11:41 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2014 11:44 von Stefan.)
Beitrag #8
RE: Stop Befehl während einer Void - Loop
so langsam biegen sich mir die Fußnägel hoch, die Nackenhaare stehen bereits. Big Grin Interuptstsuerung für diesen Zweck! Er sollte für unerwarteten, azyklischen, also selten auftretenden Ereignissen reserviert bleiben und nicht für solche Standardfunktionen verschwendet werden.

Normalerweise macht man so etwas, indem man ein kleines Grundprogramm schreibt, das die Funktion einmal abbildet und zur Laufzeit dann die Daten entsprechend einsetzt. Also: Zuerst Gedanken über die informelle Abbildung der gewünschten Funktionen machen, zuordnen und dann physikalisch ausgeben.

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
  Ausschaltverzögerung bei einer PV Heizung Hans_Maulwurf 27 746 29.11.2016 23:38
Letzter Beitrag: georg01
Question Webserver, Client, Loop Marc2014 6 369 29.07.2016 21:04
Letzter Beitrag: Marc2014
  Innenwiderstand einer Batterie (Rundzelle 1,5V) Einsteiger94 2 206 24.07.2016 11:42
Letzter Beitrag: SkobyMobil
  Brauche etwas Hilfe bei der Umsetzung einer Idee raspido 3 537 23.04.2016 10:26
Letzter Beitrag: rkuehle
  I2C Ansteuerung einer MSM3 (elv mp3 Box) Voreifel 2 316 09.04.2016 17:56
Letzter Beitrag: Voreifel
  Problem: SDFat - Das Ende einer Datei finden und Schleife beenden MartinK 4 490 01.04.2016 05:49
Letzter Beitrag: MartinK
  Problem: RFID code mit Inhalt einer Textdatei auf einer SD Karte vergleichen MartinK 6 515 29.03.2016 16:45
Letzter Beitrag: MartinK
  Inhalt einer Variable mit per Virtual Wire versenden toto1975 17 1.774 26.03.2016 18:57
Letzter Beitrag: hotsystems
  Constrain-Befehl -wie gehts richtig? Nimes 8 954 14.03.2016 18:00
Letzter Beitrag: DL1AKP
  Funktion in Loop einmalig ausführen Haustechno 4 647 09.03.2016 22:43
Letzter Beitrag: Haustechno

Gehe zu:


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