Forum: Mikrocontroller und Digitale Elektronik Arduino - Loop Zähler


von Asdf A. (eizi)


Lesenswert?

Hallo :)

Kaum hab ich das erste Problem überwunden ist auch schon das nächste 
da..:P
Hoffe mir kann wieder jemand so gut helfen.


Ich möchte dass eine LED genau einmal blinkt, egal wie oft der Loop 
durchläuft. Da dachte ich mir ich realisiere das einfach mit einem 
Zähler..klappt aber nicht und ich kann mir nicht erklären warum nicht.

Hier der Code
1
int ledoutput =9;
2
int var=0;
3
4
5
void setup() {
6
 
7
  pinMode(ledoutput, OUTPUT);
8
  
9
}
10
11
12
void loop() {
13
  
14
  var++;
15
  if(var <2) {
16
  digitalWrite(ledoutput, HIGH);
17
  delay(1000);
18
  digitalWrite(ledoutput, LOW);
19
  delay(1000); }
20
 
21
  }

Was ist falsch? ;)

von holger (Gast)


Lesenswert?

void setup() {

  pinMode(ledoutput, OUTPUT);
  digitalWrite(ledoutput, HIGH);
  delay(1000);
  digitalWrite(ledoutput, LOW);
  delay(1000); }

}


void loop() {

  }

von Wolfgang (Gast)


Lesenswert?

Max E. schrieb:
> Was ist falsch? ;)

var ist alle 256 loop-Durchläufe wieder 0

von Asdf A. (eizi)


Lesenswert?

Okey das hätte ich wahrscheinlich noch erwähnen müssen, Setup ist keine 
Lösung.. ;)

Um das zu erläutern.

Ich plane meine Stereoanlage automatisch synchron zu meinem TV ein & 
auszuschalten. Wenn der Arduino also einen HIGH-Pegel bekommt soll 
dieser einfach einmal den IR-Code "einschalten" senden. Geht aber nur im 
Loop da der Arduino schon läuft.

Wenn der Arduino ein LOW vom TV bekommt soll dieser den IR-Befehl zum 
Ausschalten senden und den Zähler zurücksetzen :)

: Bearbeitet durch User
von Asdf A. (eizi)


Lesenswert?

Wolfgang schrieb:
> Max E. schrieb:
>> Was ist falsch? ;)
>
> var ist alle 256 loop-Durchläufe wieder 0


Danke für die Info das wusste ich nicht, erklärt aber trotzdem nicht 
warum es nicht klappt. :P

von holger (Gast)


Lesenswert?

>Okey das hätte ich wahrscheinlich noch erwähnen müssen, Setup ist keine
>Lösung.. ;)

void loop() {

  if(var == 0) {
  var = 1;
  digitalWrite(ledoutput, HIGH);
  delay(1000);
  digitalWrite(ledoutput, LOW);
  delay(1000); }

  }

von Wolfgang (Gast)


Lesenswert?

Max E. schrieb:
> Danke für die Info das wusste ich nicht, erklärt aber trotzdem nicht
> warum es nicht klappt. :P

Doch, dein Zähler zählt
0, 1, 2, ..., 127, -128, -127, ... , -1, 0, 1, ...
und immer so weiter.

von Asdf A. (eizi)


Lesenswert?

Klappt, vielen Dank :)


Trotzdem würde mich interessieren warum mein COde nicht funktioniert?
1
var++; 
2
  if(var <2) {
3
  digitalWrite(ledoutput, HIGH);
4
  delay(1000);
5
  digitalWrite(ledoutput, LOW);
6
  delay(1000); }
7
 
8
  }


Ich meine var wird auf eins erhöht, ist < als 2 & läuft durch und wird 
wieder erhöht. 2 = 2 also wird übersprungen

Wo ist der Denkfehler?

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> 0, 1, 2, ..., 127, -128, -127, ... , -1, 0, 1, ...

Sorry, da du für var den Typ int verwendest (und nicht int8), läuft dein 
Zähler über 16 bit, also
> 0, 1, 2, ..., 32767, -32768, -32767, ... , -1, 0, 1, ...
und wiederholt sich erst nach 65536 Durchläufen.

von holger (Gast)


Lesenswert?

>Trotzdem würde mich interessieren warum mein COde nicht funktioniert?

Ganz einfach:

var zählt so schnell durch das es nach einigen tausend CPU Zyklen
überläuft. Wurde oben ja schon beschrieben. Diese paar tausend
CPU Zyklen sind aber so schnell um das es für dich aussieht
als würde der Zähler nicht wirken und deine LED blinkt dauernd.

Mach mal das

void loop() {

  if(var == 0) {
  var = 1;
  digitalWrite(ledoutput, HIGH);
  delay(1000);
  digitalWrite(ledoutput, LOW);
  delay(1000); }

  delay(1000); }
  }

Dann wird es etwas dauern bis wieder geblinkt wird, aber
es wird wieder geblinkt;)

von holger (Gast)


Lesenswert?

Verdammt zu früh abgesendet:(

So sollte das sein.

void loop() {
  var++;
  if(var <2) {
  digitalWrite(ledoutput, HIGH);
  delay(1000);
  digitalWrite(ledoutput, LOW);
  delay(1000); }

  delay(1000); }
  }

von holger (Gast)


Lesenswert?

Und jetzt ne Klammer zu viel:(

Jetzt aber:

void loop() {
  var++;
  if(var <2) {
  digitalWrite(ledoutput, HIGH);
  delay(1000);
  digitalWrite(ledoutput, LOW);
  delay(1000); }

  delay(1000);
  }

von Amateur (Gast)


Lesenswert?

>void loop() {
>  var++;
>  if(var <2) {
>  digitalWrite(ledoutput, HIGH);
>  delay(1000);
>  digitalWrite(ledoutput, LOW);
>  delay(1000); }
>
>  delay(1000);
>  }

Auch nicht!

Das ständige inkrementieren von var bewirkt, das diese irgendwann mal 
Kopeister schlägt. Dann geht‘s bei 0 wieder los.

einfacher: nix inkrement
void loop() {
  if (var == 0) {        // Nur einmal am Anfang zutreffend
    var = 1;
    ... an
    ... warte
    ... aus
    ... gut erhaltenes delay (1000) zu verkaufen
  }
}

von holger (Gast)


Lesenswert?

>Auch nicht!

Ja, war schlecht das Beispiel weil der gesamte Kontext
im Post stehen sollte.

>Das ständige inkrementieren von var bewirkt, das diese irgendwann mal
>Kopeister schlägt. Dann geht‘s bei 0 wieder los.

Auch das wurde oben ja schon gesagt.

So, noch ein Beispiel damit er das ausprobieren kann
1
void loop() {
2
  var++;
3
  if(var <2) {
4
  digitalWrite(ledoutput, HIGH);
5
  delay(1000);
6
  digitalWrite(ledoutput, LOW);
7
  delay(1000); }
8
9
  delay(1);
10
  }


Wenn ich davon ausgehe das delay(1) eine Millisekunde dauert
wird in diesem Beispiel nach vermutlich 32s wieder dauernd geblinkt
weil der Zähler überläuft.

von Asdf A. (eizi)


Lesenswert?

Okey, danke für deine Hilfe meine Stereosteuerung funktioniert & das mit 
der Deklarierung nicht geklappt hat hab ich auch verstanden:)

Ich zeig dir mal den Code :)

1
#include <IRremote.h>
2
3
int usbinput = 8;
4
int ledoutput =9;
5
int zaehler=0;
6
int zaehler1=0;
7
8
IRsend irsend;
9
10
11
void setup() {
12
 
13
  pinMode(usbinput, INPUT);
14
  pinMode(ledoutput, OUTPUT);
15
  
16
 }
17
18
19
void loop() {
20
  
21
  
22
  
23
   
24
  if (digitalRead(usbinput)==HIGH) {
25
      digitalWrite(ledoutput, HIGH); 
26
    
27
       if(zaehler == 0) {
28
        zaehler = 1;    
29
        zaehler1 = 0;    
30
      irsend.sendRC5(0x50C, 12); //Einschalten
31
      delay(6000); //Wartet bis Stero gestartet ist
32
      for(int i=0; i<=12; i++) { //Dreht Lautstärke auf Maximum
33
      irsend.sendRC5(0x410, 12);
34
      delay(400);  }
35
 
36
      }
37
  }
38
  
39
      
40
      if (digitalRead(usbinput)==LOW) {
41
      digitalWrite(ledoutput, LOW);
42
      zaehler=0;
43
      
44
      if(zaehler1 == 0) {
45
      zaehler1 = 1;
46
      irsend.sendRC5(0x50C, 12); //Ausschalten 
47
      delay(2000);
48
49
      }
50
    }
51
}

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.