Forum: Mikrocontroller und Digitale Elektronik Arduino UNO | IF Schleife |


von Ostfront (Gast)


Lesenswert?

Guten Tag,

Ich habe hier ein kleineres Problem, und hoffe mir kann jemand helfen.

Ich würde gerne mit 2 Tastern 2 Leds ansteuern:

---------------------------------------------------------------------

Taster 1 wird gedrück ----> Led 1 blinkt ---> Taster 1 wird erneut 
gedrückt

------> Led 1 geht aus


Taster 2 wird gedrückt ----> Led 2 blinkt ---> Taster 2 wird erneut 
gedrückt

------> Led 2 geht aus

----------------------------------------------------------------------

Leider weiß ich nicht wie ich das machen soll ohne dass man einen der 
Taster

nur 1 mal drücken muss. Deshalb habe ich jetzt das ganze jetzt einfach 
mit

2 if und while Schleifen gemacht - geht nicht ;/

Hier der Code :
1
int TasterR = 12;
2
int TasterL = 11;
3
int LedL = 13;
4
int LedR = 10;
5
6
void setup(){
7
  pinMode(TasterR,INPUT);
8
  pinMode(TasterL,INPUT);
9
  pinMode(LedL,OUTPUT);
10
  pinMode(LedR,OUTPUT);
11
}
12
13
void loop(){
14
  
15
  if (digitalRead(TasterL)== HIGH){
16
  while(digitalRead(TasterL)== HIGH){
17
    digitalWrite(LedL,HIGH);
18
    delay(500);
19
    digitalWrite(LedL,LOW);
20
    delay(500);
21
    digitalWrite(LedL,HIGH);
22
    delay(500);
23
    digitalWrite(LedL,LOW);
24
    delay(500);
25
  }
26
  }
27
  
28
  if (digitalRead(TasterL)== LOW){
29
  while(digitalRead(TasterL)== LOW){
30
    digitalWrite(LedL,LOW);
31
    delay(500);
32
  }
33
  }
34
  
35
  //-----------------------------------------------
36
 
37
 if (digitalRead(TasterR)== HIGH){
38
  while(digitalRead(TasterR)== HIGH){
39
    digitalWrite(LedR,HIGH);
40
    delay(500);
41
    digitalWrite(LedR,LOW);
42
    delay(500);
43
    digitalWrite(LedR,HIGH);
44
    delay(500);
45
    digitalWrite(LedR,LOW);
46
    delay(500);
47
  }
48
  }
49
  
50
  if (digitalRead(TasterR)== LOW){
51
  while(digitalRead(TasterR)== LOW){
52
    digitalWrite(LedR,LOW);
53
    delay(500);
54
  }
55
  }
56
    
57
}
Es passiert einfach nichts wenn ich einen der Taster drücke ...
Wenn ich allerdings den 1 Teil alleine benutze geht es (über //--- ...)

Ich hoffe mir kann jemand helfen ^^

Danke !

: Bearbeitet durch User
von if-Abfrage (Gast)


Lesenswert?


von Immitsch Berater (Gast)


Lesenswert?

"if-Abfrage" rotzte einen Link hin....

Ist das die einzige "Hilfe", die Du geben kannst? Armes Schwein!

von Jürgen S. (jurs)


Lesenswert?

Ostfront schrieb:
> Es passiert einfach nichts wenn ich einen der Taster drücke ...

Wenn Du auf das Drücken der Taster reagieren möchtest, dann mußt Du 
nicht auf den Status des Tasters an sich reagieren, sondern auf eine 
Statusänderung.

Arbeite dazu das Arduino StateChangeDetection-Beispiel durch!

In der Arduino-Software zu finden unter:
Datei - Beispiele - 02.Digital - StateChangeDetection

von if-Abfrage (Gast)


Lesenswert?

Immitsch Berater schrieb:
> Ist das die einzige "Hilfe", die Du geben kannst?
Nein.

von Immitsch Berater (Gast)


Lesenswert?

Immitsch Berater fragte:
>> Ist das die einzige "Hilfe", die Du geben kannst?
>Nein.

Na -nicht so einsilbig! Gib eine vernünftige Hilfe, so ein blöder Link
nützt dem TO soviel wie Fußpilz.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Immitsch Berater schrieb:
> "if-Abfrage" rotzte einen Link hin....
>
> Ist das die einzige "Hilfe", die Du geben kannst? Armes Schwein!

deine leistung ist eher geringer zu bewerten, denn obige hatte 
wenigstens Informationsgehalt was deinem Beitrag nicht entnehmbar ist.

Also klage der Armselige nicht über Armut Anderer.


Back to topic

Du musst zusätzlich den gegenwärtigen zustand verarbeiten und die 
Tastenabfrage unabhängig vom Blinken also auch während der Blinkroutine 
erledigen.

wenn du  also keine Interrupts benutzen willst solltest du Flags, welche 
welche den Tastenstatus und den zustand der LEDS zwischenspeichern.

Beachte, dass während des Blinkens in deinem jetzigen Programm nichts 
anderes passieren kann.

: Bearbeitet durch User
von Dieter F. (Gast)


Lesenswert?


von Immitsch Berater (Gast)


Lesenswert?

Winfried schrieb:
>Also klage der Armselige nicht über Armut anderer.

Entschuldige gleich mehrfach, großer Meister...

Mir geht nur immer dann der Hut hoch, wenn schulmeisternde Nicht-helfer
in Gang kommen.

von klapper (Gast)


Lesenswert?

Immitsch Berater schrieb:
> Immitsch Berater fragte:
>>> Ist das die einzige "Hilfe", die Du geben kannst?
>>Nein.
>
> Na -nicht so einsilbig! Gib eine vernünftige Hilfe, so ein blöder Link
> nützt dem TO soviel wie Fußpilz.

Das ist Basiswissen. Dagegen enthalten deine Beiträge, Immitsch Berater, 
überhaupt keine Hilfe und ziehen vollkommen richtige Beiträge auch noch 
runter.

von Forengast (Gast)


Lesenswert?

Immitsch Berater schrieb:
> Gib eine vernünftige Hilfe, so ein blöder Link nützt dem TO soviel
> wie Fußpilz.

Du denkst etwas kurz.

Erstmal nützt es den anderen, wenn er damit in die Lage versetzt wird, 
einen weniger unsinnigen Titel für seinen Thread zu wählen. Und damit 
nützt er sich selbst, weil dann vielleich nicht so viele, von seiner 
eigentlichen Frage abweichenden Beiträge kommen.

von Dieter F. (Gast)


Lesenswert?

Während die beiden sich weiter streiten ...
Meine Antwort war auch etwas kurz:-)

Leider weiß ich nicht, wie Du die Taster angeschlossen hast. "Üblich" 
ist ein interner Pullup-Widerstand am Taster-Pin (wie im Beispiel-Link) 
mit Schalten gegen GND.

Wenn Du das so machst, kannst Du den Beispiel-Code (erstmal für einen 
Taster) nahezu unverändert übernehmen. Nur das Blinken muss noch 
ermöglicht werden (Kommentare entfernt ...):

void loop()
{
  if (digitalRead(switchPin) == LOW)
  {
    delay(100);
    running = !running;
  }
  if (running)
  {
    digitalWrite(LEDpin, HIGH);
    delay(500);
    digitalWrite(LEDpin, LOW);
    delay(500);
  }
}

Sinngemäß kannst Du jetzt 2 "running"-Variablen für 2 Taster und 2 LEDs 
einrichten ...

von omg (Gast)


Lesenswert?

Dieter Frohnapfel schrieb:
> Sinngemäß kannst Du jetzt 2 "running"-Variablen für 2 Taster und 2 LEDs
> einrichten ...

Warum soll er es für die andere Taste machen, wenn der Code für die 
erste schon nicht funktioniert.
 .. aber hast recht, soll er seine Hausaufgaben selber machen.

von Dieter F. (Gast)


Lesenswert?

omg schrieb:
> Warum soll er es für die andere Taste machen, wenn der Code für die
> erste schon nicht funktioniert.

Wäre nicht schlecht, wenn Du liest bevor Du hier "rumgrätzt". Meine 
Aussage bezog sich auf den von mir angegeben Link zur Nutzung boolscher 
Variablen. Wenn er das übernimmt und den Code wie angegeben anpasst 
sollte das Ganze schonmal für eine LED und einen Taster funktionieren.

Jetzt kannst Du Dich gerne darüber aufregen, wieso kein Interrupt 
genutzt wird ... :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ostfront schrieb:
> delay(500);
Ich habe die Ursache aller Probleme entdeckt. Mit einem delax() 
vernichtet man einfach teure Rechenzeit.

Sieh dir mal die Funktion millis() an. Sie ist (zusammen mit einer 
Zustandsvariablen) die Lösung deiner Probleme. Denk mal drüber nach: die 
Hauptschleife läuft ständig mit maximaler Geschwindigkeit durch. Und 
abhängig von einem Tastendruck merkst du dir in einer Variablen, was 
gerade für ein Zustand aktuell ist und reagierst darauf...

von Rolf Magnus (Gast)


Lesenswert?

Dieter Frohnapfel schrieb:
> omg schrieb:
>> Warum soll er es für die andere Taste machen, wenn der Code für die
>> erste schon nicht funktioniert.
>
> Wäre nicht schlecht, wenn Du liest bevor Du hier "rumgrätzt". Meine
> Aussage bezog sich auf den von mir angegeben Link zur Nutzung boolscher
> Variablen. Wenn er das übernimmt und den Code wie angegeben anpasst
> sollte das Ganze schonmal für eine LED und einen Taster funktionieren.

Der hilft eigentlich gar nicht. Das Problem sind, wie Lothar schon 
schreibt, die Delays, die für's Blinken benutzt werden. Die sind bei 
deiner Lösung immer noch da.

> Jetzt kannst Du Dich gerne darüber aufregen, wieso kein Interrupt
> genutzt wird ... :-)

Die wären allerdings eine Lösung. Man kriegt es zur Not auch ohne 
Interrupt, nur mit einem Timer hin, aber mit Interrupt ist es eigentlich 
einfacher. Wichtig ist halt, die Delays loszuwerden, da die halt alles 
blockieren. Wärend eines Blinkzyklus wird halt keine Taste abgefragt, 
und eine zweite LED noch parallel zu handhaben, wird damit auch nicht 
besser.

Immitsch Berater schrieb:
> Mir geht nur immer dann der Hut hoch, wenn schulmeisternde Nicht-helfer
> in Gang kommen.

Merkst aber leider nicht, daß du selbst einer davon bist. Du belehrst 
andere, wie sie zu antworten haben, bringst aber selbst exakt 0 Hilfe.

Immitsch Berater schrieb:
> Ist das die einzige "Hilfe", die Du geben kannst? Armes Schwein!

Von dir kam noch weniger, und das muss man erstmal schaffen.

von marc (Gast)


Lesenswert?

>Mit einem delax() ..

Delax ... ein wunderbares Wort. Das gefällt mir sehr gut. Es ist we 
"relax" nur langsamer. "Delax" eben.

von Immitsch Berater (Gast)


Lesenswert?

Rolf Magnus schrieb:
>Wichtig ist halt , die Delays loszuwerden, da die halt alles
>blockieren. Wärend eines Blinkzyklus wird halt keine Taste abgefragt,
>und eine zweite LED noch parallel zu handhaben, wird damit auch nicht
>besser.

Du regst Dich über "Delay" auf, verwendest aber in 2 Sätzen 3x "Halt".
Da steht ja das Programm nur noch...

von klapper (Gast)


Lesenswert?

Immitsch Berater schrieb:
> Rolf Magnus schrieb:
>>Wichtig ist halt , die Delays loszuwerden, da die halt alles
>>blockieren. Wärend eines Blinkzyklus wird halt keine Taste abgefragt,
>>und eine zweite LED noch parallel zu handhaben, wird damit auch nicht
>>besser.
>
> Du regst Dich über "Delay" auf, verwendest aber in 2 Sätzen 3x "Halt".
> Da steht ja das Programm nur noch...

Oh wie lustig, ein richtiger Droll.

von Rolf Magnus (Gast)


Lesenswert?

klapper schrieb:
> Oh wie lustig, ein richtiger Droll.

Vor allem ein richtiger Troll. Als solcher hat er sich damit jetzt 
endgültig geoutet.

von Dieter F. (Gast)


Lesenswert?

Ist ja wirklich konstruktiv hier ...

O.K. - mein letzter Vorschlag war nicht so prall (schlecht abgeleitet 
vom einfachen Ein- / Ausschalten) - aber wie nachstehend sollte es in 
Arduino-Kreisen (nicht unbedingt meine Welt) funktionieren:

unsigned long LedR_time  = Millis();
unsigned long Blink_time = 500;

void loop()
{
  if (digitalRead(TasterR) == LOW)
  {
    delay(100);
    runningR = !runningR;
    LedR_time = Millis();

    if (runningR)
       digitalWrite(LedR, HIGH);
    else
       digitalWrite(LedR, LOW);
  }

  if (runningR)
  {
     if((Millis() - LedR_time) > Blink_time)
     {
         if (digitalRead(LedR) == LOW)
             digitalWrite(LedR, HIGH);
         else
             digitalWrite(LedR, LOW);
         LedR_time = Millis();
     }
  }
}

Das geht sicher noch viel eleganter (mit "richtigen Timern und 
Interrupts" und ordentlicher Entprell-Routine) :-) sollte aber in dieser 
Form (mit dem impliziten Millis()-Interrupt) wenigstens funktionieren.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dieter Frohnapfel schrieb:
> Das geht sicher noch viel eleganter (mit "richtigen Timern und
> Interrupts" und ordentlicher Entprell-Routine) :-)
Es geht ganz ohne jegliches Delay noch wesentlich einfacher. Ich 
verwende hier einfach zwei Zustandsautomaten mit Namen Blinken1 und 
BLinken2:
1
unsigned long tiAkt;
2
unsigned long tiBlinken1;
3
unsigned long tiBlinken2;
4
int Blinken1; // 0 = nicht Blinken // ungleich 0 --> Blinken 
5
int Blinken2; // das LSB zeigt den Pegel für die LED an:
6
              // ungerade Zahl => LED an, Gerade Zahl => LED aus
7
void loop() 
8
  // die für diese Schleife gültige Zeit ein einziges Mal am Schleifenanfang abholen
9
  tiAkt = millis();
10
11
  // Taster 1
12
  if (digitalRead(Taster1) == HIGH) // Taster 1 nicht betätigt
13
    tiEntprelle1 = tiAkt+20;
14
  if (tiAkt>tiEntprelle1) {        // Timout => Taster 1 min. 10ms betätigt
15
    tiBlinken1 = tiAkt;
16
    tiEntprelle1 = ti.Akt+20000;   // Gebastelt: wird schon keiner den Taster 20 Sekunden lang drücken... ;-)
17
    if (Blinken1!=0)               // sind wir mit Blinken beschäftigt? 
18
      Blinken1 = 0;                // ja: ausschalten
19
    else
20
      Blinken1 = 1;                // nein: mit dem Blinken anfangen
21
  }
22
  if (Blinken1==0) {               // müssen wir überhaupt Blinken?
23
        digitalWrite(Led1, LOW);   // nein: LED ausschalten
24
  } else {                         
25
    if (tiAkt>tiBlinken1) {        // ja: Zeit für nächsten Pegelwechsel?
26
      if (Blinken1&1)              // LSB abfragen (gerade/ungerade) 
27
        digitalWrite(Led1, HIGH);
28
      else
29
        digitalWrite(Led1, LOW);
30
      Blinken1++;                  // LSB umschalten
31
      tiBlinken1 = tiAkt +500;     // nächste Aktion in 500ms
32
    }
33
  }
34
35
  // Taster 2
36
  if (digitalRead(Taster2) == HIGH) // Taster 2 nicht betätigt
37
    tiEntprelle1 = tiAkt+20;
38
  if (tiAkt>tiEntprelle2) {        // Timeout => Taster 2 min. 10ms betätigt
39
    tiBlinken2 = tiAkt;
40
    tiEntprelle2 = ti.Akt+20000;   // Gebastelt: wird schon keiner den Taster 20 Sekunden lang drücken... ;
41
    if (Blinken2!=0)               // sind wir mit Blinken beschäftigt? 
42
      Blinken2 = 0;                // ja: ausschalten
43
    else 
44
      Blinken2 = 1;                // nein: zu Blinken anfangen
45
  }
46
  if (Blinken2==0) {               // müssen wir überhaupt Blinken?
47
        digitalWrite(Led2, LOW);   // nein: LED ausschalten
48
  } else {                         
49
    if (tiAkt>tiBlinken2) {        // ja: Zeit für nächsten Pegelwechsel?
50
      if (Blinken2&1)              // LSB abfragen (gerade/ungerade) 
51
        digitalWrite(Led2, HIGH);
52
      else
53
        digitalWrite(Led2, LOW);
54
      Blinken2++;                  // LSB umschalten
55
      tiBlinken2 = tiAkt +500;     // nächste Aktion in 500ms
56
    }
57
  }
58
  
59
  // Sonstige Zustandsautomaten
60
  // ...
61
}

Weit&breit kein delay(). Und nur der impilizite Interrupt für millis().
Man könnte den Trick mit dem Hochzählen von Blinken1/2 
selbstverständlich auch entkoppeln, und eine richtige Flankenerkennung 
einbauen, um "verständlicheren" Code zu erhalten:
1
int Blinken1;  // 0 = nicht Blinken // 1 = Blinken 
2
int OnOff1;    // 0 = LED aus // 1 = LED an
3
int Taste1Alt; // für Flankenerkennung
4
 
5
void loop() 
6
  // die für diese Schleife gültige Zeit ein einziges Mal am Schleifenanfang abholen
7
  tiAkt = millis();
8
9
  // Taster 1
10
  if (digitalRead(Taster1) == HIGH) { // Taster 1 nicht betätigt
11
    tiEntprelle1 = tiAkt+20;
12
    Taste1Alt = HIGH;
13
  }
14
  if (tiAkt>tiEntprelle1) {        // Timout => Taster 1 min. 10ms betätigt
15
    if (Taste1Alt==HIGH) {         // Flanke?  
16
      Taste1Alt = LOW;
17
      tiBlinken1 = tiAkt;
18
      Blinken1 = !Blinken;         // Zustand "Blinken" umschalten
19
      OnOff = 1;
20
    }
21
  }
22
  if (Blinken1==0) {               // müssen wir überhaupt Blinken?
23
        digitalWrite(Led1, LOW);   // nein: LED ausschalten
24
  } else {                         
25
    if (tiAkt>tiBlinken1) {        // ja: Zeit für nächsten Pegelwechsel?
26
      if (OnOff1==1) {             // Zustand abfragen 
27
        digitalWrite(Led1, HIGH);
28
        OnOff1 = 0;
29
    } else {
30
        digitalWrite(Led1, LOW);
31
        OnOff1 = 1;
32
    }
33
    tiBlinken1 = tiAkt +500;       // nächste Aktion in 500ms
34
  }
35
36
  // Taster 2 entsprechend
37
  //...
38
39
  // Sonstige Zustandsautomaten
40
  // ...
Der Trick bei diesem Programmierstil ist, dass es schnurzegal ist, in 
welcher Reihenfolge die Automaten berechnet werden, sie sind unabhängig 
voneinander. Und es ist sogar schnurzegal, in welcher Reihenfolge die 
if-Abfragen kommen. Dieser Code wird genausogut funktionieren:
1
unsigned long tiAkt;
2
unsigned long tiBlinken1;
3
unsigned long tiBlinken2;
4
int Blinken1; // 0 = nicht Blinken // ungleich 0 --> Blinken 
5
int Blinken2; // das LSB zeigt den Pegel für die LED an:
6
              // ungerade Zahl => LED an, Gerade Zahl => LED aus
7
void loop() 
8
  // die für diese Schleife gültige Zeit ein einziges Mal am Schleifenanfang abholen
9
  tiAkt = millis();
10
11
  // Sonstige Zustandsautomaten
12
  // ...
13
14
  // Taster 1
15
  if (Blinken1==0) {               // müssen wir überhaupt Blinken?
16
        digitalWrite(Led1, LOW);   // nein: LED ausschalten
17
  } else {                         
18
    if (tiAkt>tiBlinken1) {        // ja: Zeit für nächsten Pegelwechsel?
19
      if (Blinken1&1)              // LSB abfragen (gerade/ungerade) 
20
        digitalWrite(Led1, HIGH);
21
      else
22
        digitalWrite(Led1, LOW);
23
      Blinken1++;                  // LSB umschalten
24
      tiBlinken1 = tiAkt +500;     // nächste Aktion in 500ms
25
    }
26
  }
27
  if (tiAkt>tiEntprelle1) {        // Timout => Taster 1 min. 10ms betätigt
28
    if (Taste1Alt==HIGH) {         // Flanke?  
29
      Taste1Alt = LOW;
30
      tiBlinken1 = tiAkt;
31
      Blinken1 = !Blinken;         // Zustand "Blinken" umschalten
32
    }
33
  }
34
  if (digitalRead(Taster1) == HIGH) { // Taster 1 nicht betätigt
35
    tiEntprelle1 = tiAkt+20;
36
    Taste1Alt = HIGH;
37
  }
38
  
39
  // Taster 2 entsprechend
40
  //...

: Bearbeitet durch Moderator
von Dieter F. (Gast)


Lesenswert?

Lothar Miller schrieb:
> noch wesentlich einfacher

Ob das nun so ist - oder auch nicht liegt im Ermessen des Betrachters.

Nur um zwei LEDs mit Taster zum Blinken zu bringen reicht die 
"Billig-Lösung" :-) - denke ich - auch aus. Die 200 mS "Verlust" sind in 
diesem Fall sicher zu verschmerzen.

Wenn da noch mehr hinzukommt wird der TO andere Wege gehen müssen. Aber 
dazu gibt es ja auch X Tutorials und Beispiele ...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dieter Frohnapfel schrieb:
> Ob das nun so ist - oder auch nicht liegt im Ermessen des Betrachters.
Es ist wesentlich einfacher, wenn man sich die SPS-Automaten-Denkweise 
mal angeeignet hat:
Einlesen (Eingänge und Zeitstempel in Variablen, die sich während der 
Verarbeitung nicht ändern)
Verarbeiten (schnellstmögliche Berechung der aktiven Zustände mit 
lokalen Variablen)
Ausgabe (aus den Zustandsvariablen an die Ausgänge)

Idealerweise wird im Verarbeitungsteil keine EA direkt manipuliert.

Und dass dieses Verfahren gut funktioniert beweisen zigmilliarden SPS, 
die von jedem angelernten Schlosser (bitte nicht persönlich nehmen!) 
programmiert werden können. Und zwar so, dass der Rest der Anlage 
unverändert funktioniert.

Dieter Frohnapfel schrieb:
> Wenn da noch mehr hinzukommt wird der TO andere Wege gehen müssen.
Das ist der Witz beim obigen Prinzip: er muss es einfach irgendwo 
dazubauen, weil die anderen Schritte auch in der Reihenfolge komplett 
unabhängig sind.

: Bearbeitet durch Moderator
von Dieter F. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Es ist wesentlich einfacher, wenn man sich die SPS-Automaten-Denkweise
> mal angeeignet hat:

Da ich mich beruflich damit beschäftige ist mir das EVA-Prinzip durchaus 
geläufig. Trotzdem erlaube ich mir eine eigene Denkweise :-) (nicht böse 
gemeint ...).

Es geht hier um ein Led an / Led aus Spielchen eines vermeintlichen 
Anfängers, der sich ja nicht weiter äußert (lacht sich vielleicht über 
die Beiträge kaputt ?).

Wir können jetzt auch über Multitasking, Multithreading und andere 
interessante Ansätze debattieren - das führt aber, glaube ich, zu weit.

Übrigens wollte ich mal Schreiner werden (nach Astronaut, Chemiker und 
...) hat sich aber im Laufe meines Lebens anders ergeben :-)

von chris_ (Gast)


Lesenswert?

Man könnte das Problem natürlich auch mit meinem Programm Sequencer 
lösen:

http://hobby-roboter.de/forum/viewtopic.php?f=4&t=143

Die zweite, etwas kompliziertere Ausführung ist für mehrere Sequenzen ( 
Tasks ).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

chris_ schrieb:
> Man könnte das Problem natürlich auch mit meinem Programm Sequencer
> lösen:
Oder ein Mulitasking OS aufsetzen...

> Man könnte das Problem natürlich auch mit meinem Programm Sequencer
> lösen:
Ich würde dort die Zeit aber auf stabilere Beine als auf ein delay(1) 
stellen...

von omg (Gast)


Lesenswert?

Dieter Frohnapfel schrieb:
> void loop()
> {
>   if (digitalRead(TasterR) == LOW)
>   {
>     delay(100);
>     runningR = !runningR;
>     LedR_time = Millis();
>
>     if (runningR)
>        digitalWrite(LedR, HIGH);
>     else
>        digitalWrite(LedR, LOW);
>   }
>
>   if (runningR)
>   {
>      if((Millis() - LedR_time) > Blink_time)
>      {
>          if (digitalRead(LedR) == LOW)
>              digitalWrite(LedR, HIGH);
>          else
>              digitalWrite(LedR, LOW);
>          LedR_time = Millis();
>      }
>   }
> }

Wow jetz hast du es ja noch schlechter gemacht.



Dieter Frohnapfel schrieb:
> Da ich mich beruflich damit beschäftige ist mir das EVA-Prinzip durchaus
> geläufig. Trotzdem erlaube ich mir eine eigene Denkweise :-) (nicht böse
> gemeint ...).
 Hoffentlich bekomme ich nie ein Produkt das du erdacht hast.

Dieter Frohnapfel schrieb:
> Es geht hier um ein Led an / Led aus Spielchen eines vermeintlichen
> Anfängers, der sich ja nicht weiter äußert
 Das offensichtlich viel zu kompliziert für Deine Denkweise ist.
 Er hat genau geschrieben das er das Blinken mit einem Tastendruck an 
bzw abgeschaltet haben möchte.
 Du bietest ihm dagegen einen Code der wie wild das Blinken an und 
abschaltet solange eine Taste gedrückt ist oder nicht.

Dieter Frohnapfel schrieb:
> Meine Aussage bezog sich auf den von mir angegeben Link zur Nutzung >boolscher 
Variablen.
  Wenn du schon ein Beispiel bringst, sollte die Variable auch irgendwo 
herkommen, und beinhalten wo die Variable herkommt. Auf jeden Fall ein 
miserables Beispiel, oder soll es ein Zufallergebniss bringen?

Dieter Frohnapfel schrieb:
> Wenn er das übernimmt und den Code wie angegeben anpasst
> sollte das Ganze schonmal für eine LED und einen Taster funktionieren.
 Ebend genau nicht, weil dein Code der Tastenerkennung absoluter Schrot 
ist und absolut gar nichts mit der Aufgabenstellung zu tun hat. Du 
toggelst deine undefinierte "boolsche Variable",  nur einfach dumm rum, 
solange eine Taste gedrückt ist oder nicht gedrückt ist(ka welche Logik 
seine Tasten haben).
 Den Code wie man blinken lässt hatte er ja schon selber.
 Vielleicht solltest du die das Posting des TO einfach mal durchlesen 
und versuchen seine Aufgabe die er lösen möchte zu verstehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dieter Frohnapfel schrieb:
> Wir können jetzt auch über Multitasking, Multithreading und andere
> interessante Ansätze debattieren
Das ist doch hier keinesfalls das Thema. Und auch der Einsatz eines 
komplexen Schedulers macht eine Aufgabe nicht automatisch einfach. Es 
ist nur so, dass viele Anfänger (auch ich damals!) die delay() 
Geschichte noch kapieren, EVA dann aber als "Eingabe, Verarbeitung, 
Ausgabe" verstehen, und gleich mal auf die Eingabe warten.
Siehe das da: 
http://www.inf-schule.de/programmierung/imperativeprogrammierung/konzepteimp/programme/konzept_eva
EVA auf dem uC bedeutet aber "Einlesen, Verarbeiten, Ausgeben" oder 
markanter "Eingänge, Verarbeitung, Ausgänge". Dann ist klar, wann was zu 
passieren hat. Und EVA passiert auch nicht nur einmal, sondern ständig 
in einer Schleife. Pro Sekunde mindestens 1000 mal.

Auf jeden Fall ist mir ein Programm, in dem wertvoll gekaufte und 
versorgte Rechenzeit mit einem delay() vernichtet wird, von vorn herein 
suspekt. Denn evtl. brauche ich diese Rechenzeit später mal dringend für 
eine Erweiterung. Und dann geht es los: Ist dieses delay() hier wichtig, 
oder darf ich es rausmachen?

Dieter Frohnapfel schrieb:
> Es geht hier um ein Led an / Led aus Spielchen eines vermeintlichen
> Anfängers, der sich ja nicht weiter äußert
Es ist egal ob er sich äussert. Andere werden diesen Thread finden...

Und es sind doch genau diese einfachen LED Spielchen, an denen man das 
saubere Programmieren lernen sollte/müsste/könnte. Oder darf man so 
"simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe 
Sachen dann aber bitteschön schon sauber?

: Bearbeitet durch Moderator
von Dieter F. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Oder darf man so
> "simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe
> Sachen dann aber bitteschön schon sauber?

Dann hast Du Dein erstes Led an/aus wahrscheinlich mit Multitasking oder 
Zustandsautomat etc. programmiert? Kann ich nicht glauben ... aber 
nichts ist unmöglich ...

Lothar Miller schrieb:
> in dem wertvoll gekaufte und
> versorgte Rechenzeit

häh - auf einem Arduino? Leben wir im gleichen Universum?

Lothar Miller schrieb:
> Und EVA passiert auch nicht nur einmal, sondern ständig
> in einer Schleife. Pro Sekunde mindestens 1000 mal.

Und wo steht das geschrieben? Interessant, muss ich mir merken, als 
feste Größe.

Wenn ich Dir auf den Schlips getreten habe - sorry, wollte ich nicht. 
Brauchst Dich auch gar nicht über mich aufzuregen - schon eher über die 
unsachlichen Beiträge, die hier sonst noch so auftauchen. Da wir die 
beiden einzigen Namentlichen (außer  Winfried J.) in diesem anonymen 
Gewurschtel sind ist es sowieso lächerlich.

Ist für mich jetzt erledigt, da der TO sowieso unsichtbar ist. Habe auch 
nicht gerade eine Privat-Fehde mit Dir am laufen ...

von Dieter F. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Oder darf man so
> "simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe
> Sachen dann aber bitteschön schon sauber?

Oh, da fällt mir noch eine hübsche Analogie ein, die ich noch loswerden 
möchte.

Du hast den Schlosser angesprochen. Der feilt im ersten Lehrjahr 
ordentlich an irgendwelchen Werkstücken rum - mit ganz primitiven 
Mitteln (einer Feile) - um das Handwerk zu erlernen. Später nutzt er 
auch Maschinen - auch Computer-gesteuert (hier kommt der Hilfs-Schlosser 
mit der SPS-Programmierung ins Spiel).

Aber ohne die Grundlagen - in diesem Fall Feilen - läuft da nichts. Man 
muss erstmal ein Gefühl für ein "Werkstück" bekommen ...

Die Spielerei mit Leds etc. sehe ich ähnlich.

Jetzt bin ich ruhig :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dieter Frohnapfel schrieb:
> Lothar Miller schrieb:
>> Oder darf man so
>> "simple" Sachen als Anfänger ruhig schlampig machen, richtig komplexe
>> Sachen dann aber bitteschön schon sauber?
> Dann hast Du Dein erstes Led an/aus wahrscheinlich mit Multitasking oder
> Zustandsautomat etc. programmiert? Kann ich nicht glauben ... aber
> nichts ist unmöglich ...
Wie schon Lothar Miller schrieb:
>> dass viele Anfänger ( *auch ich damals!* ) die delay() Geschichte noch
>> kapieren, EVA dann aber als "Eingabe, Verarbeitung, Ausgabe" verstehen,
>> und gleich mal auf die Eingabe warten.
Das bedeutet, dass auch ich erst mal lernen musste, ohne 
Millisekunden-lange Delays auszukommen.

> Lothar Miller schrieb:
>> in dem wertvoll gekaufte und versorgte Rechenzeit
> häh - auf einem Arduino?
Auch dort. Kann ja gut sein, dass ein Arduino-Programmierer später mal 
was anderes macht...
> Leben wir im gleichen Universum?
Ja, ein Arduino besteht aus einem AVR und wird mit einem C Derivat 
programmiert. Genau das selbe machen "Profis" auch. Nur evtl. mit einer 
anderen IDE...

> Lothar Miller schrieb:
>> Und EVA passiert auch nicht nur einmal, sondern ständig
>> in einer Schleife. Pro Sekunde mindestens 1000 mal.
> Und wo steht das geschrieben?
In der Zeile vor deiner Frage... ;-)
Im Ernst: wenn ich eine Hauptschleife programmiere, dann kommt dort ein 
Performance-Zähler rein (kein Aufwand: nur ein Funktionsaufruf), der die 
durchschnittliche und die maximale Schleifenzeit ermittelt. Und wenn die 
Schleifenzeit über eine ms ansteigt, ist das für mich ein Warnsignal und 
ich sehe mir die Ursache schon mal genauer an.

> Wenn ich Dir auf den Schlips getreten habe
Keine Sorge, die Diskussion ist sehr sachlich (mal von ein paar verbalen 
Fouls [omg] abgesehen).

> Übrigens wollte ich mal Schreiner werden (nach Astronaut, Chemiker und
> ...) hat sich aber im Laufe meines Lebens anders ergeben :-)
Da hatte ich es leicht: ich wollte schon mit 10 Jahren Ingenieur werden. 
Weil nämlich dieser dämliche Detektorempfänger aus dem "Werkbuch für 
Jungen" ums Verrecken nicht funktioniert hat. Wobei, da fällt mir ein: 
auch andere Dinge daraus haben nicht so richtig funktioniert...  :-/

Dieter Frohnapfel schrieb:
> Aber ohne die Grundlagen - in diesem Fall Feilen - läuft da nichts.
Richtig, man muss am Code herumfeilen. Man darf schon mal ein delay() 
reinprogrammieren, dann muss aber die Frage kommen: Brauche ich das 
wirklich? Möchte ich Rechenzeit vernichten? Wie kann ich das umgehen?

Was meinst du, wie schnell ein PC wäre, wenn alle delay() sauber 
herausprogrammiert worden wären?
(Klar kann da bei einem delay() ein Taskwechsel kommen, wenn das OS es 
kann, aber den gibts auch nicht für lau...)
Ich denke: wir würden uns wundern...

: Bearbeitet durch Moderator
von Dieter F. (Gast)


Lesenswert?

Lothar Miller schrieb:
> "Werkbuch für
> Jungen"

Hanni Thöne (oder so ähnlich) - auch für mich "Zukunftsweisend" :-)

Falsch - jetzt fällt es mir ein "Was Jungen basteln" kommt von "Hanni 
Thöne" oder so ähnlich ... Scheinst in etwa mein Jahrgang (ü50) zu sein.

Ich (wie wahrscheinlich viele Andere) bin hier nur Hobby-mässig 
unterwegs. Ich verdiene mein Geld weder mit Arduino- noch mit anderer 
Programmierung (omg - wer auch immer das sein mag - kann aufatmen :-))

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dieter Frohnapfel schrieb:
> Scheinst in etwa mein Jahrgang (ü50) zu sein.
Nein, noch u50...  :-P

> Lothar Miller schrieb:
>> "Werkbuch für Jungen"
Rudolf Wollmann
Gabs in einigen Auflagen (ich habe 2 davon) bis 1991:
http://www.amazon.de/Werkbuch-Jungen-Bastelbuch-Einf%C3%BChrungen-Grundlagen/dp/3473423521

von Dieter F. (Gast)


Lesenswert?

Lothar Miller schrieb:
> Nein, noch u50...  :-P

Jungfuchs :-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Dieter Frohnapfel schrieb:
> Jungfuchs :-)
Grufti... ;-)

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

na da wären ja nun die alten Säcke (darf mich dazu zählen, Jg 60)unter 
sich und der Jungspunt von TO auf und davon.
;) geschafft.

Namaste

von if-gott (Gast)


Lesenswert?

https://if-abfrage.de

Wenn es richtig sein soll.

von if-gott (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.