Forum: Mikrocontroller und Digitale Elektronik Loop kein richtiges Loop finde den Fehler


von Roth (Gast)


Angehängte Dateien:

Lesenswert?

Woher soll man das denn wissen? ...

Bei meinen ersten Gehversuchen mit dem Arduino gleich so eine Falle. 
Taster 1 soll den Wert inkrementieren, Taster 2 dekrementieren. Die 
beiden Taster funktionieren perfekt und sind einwandfrei entprellt, die 
Datrentypen sind auch ok. Trotzdem funktioniert es nicht.

Ihr sehr bestimmt auf Anhieb, warum es nicht geht?
Sonst liefere ich gleich die Lösung.
1
void loop() {
2
  int myVal;
3
  boolean t1, t2;
4
5
  t1 = Taster1();
6
  t2 = Taster2();
7
8
  if (t1) {myVal++;} // Wert um 1 erhöhen
9
  if (t2) {myVal--;} // Wert um 1 vermindern
10
11
  Serial.print(t1);
12
  Serial.print ("\t");  
13
  Serial.print(t2);
14
  Serial.print ("\t");  
15
  Serial.println(myVal);
16
17
  delay(1000);
18
}

von Thomas E. (thomase)


Lesenswert?

myval muß außerhalb der loop stehen.

von Michael U. (amiga)


Lesenswert?

Hallo,

 static int myVal;

Gruß aus Berlin
Michael

von Roth (Gast)


Lesenswert?

Ich wußte, dass ihr gut und schnell seid :-)

Die Bezeichnung 'Loop' suggeriert eine Schleife. Tatsächlich ist es aber 
natürlich eine Funktion. Mit 'static' ging's. Erstmal habe ich aber 
gerätselt :D

von A. S. (Gast)


Lesenswert?

Roth schrieb:
> Ihr sehr bestimmt auf Anhieb, warum es nicht geht?

Beliebter Anfängerfehler: Warnungen aus oder ignoriert.

von Jann S. (pycta)


Lesenswert?

Loop ist eine schleife.
Nur, dass du bei jedem Schleifendurchlauf myVal neu deklarierst, aber 
nicht initialisierst.

von Roth (Gast)


Lesenswert?

Jann S. schrieb:
> Loop ist eine schleife.

?

Das wäre eine Schleife . Natürlich nur exemplarisch, mein Gefühl rät 
mir davon ab ;)
1
void loop() {
2
  int myVal = 0;
3
  boolean t1, t2;
4
5
MyLoop:
6
  t1 = Taster1();
7
  t2 = Taster2();
8
9
  if (t1) {myVal++;} // Wert um 1 erhöhen
10
  if (t2) {myVal--;} // Wert um 1 vermindern
11
12
  Serial.print(t1);
13
  Serial.print ("\t");  
14
  Serial.print(t2);
15
  Serial.print ("\t");  
16
  Serial.println(myVal);
17
18
  delay(1000);
19
  goto MyLoop;
20
}

von Thomas E. (thomase)


Lesenswert?

Roth schrieb:
> Das wäre eine Schleife

Aus dir wird bestimmt nochmal ein großer Programmierer.

von Jann S. (pycta)


Lesenswert?

Roth schrieb:
> Das wäre eine Schleife .

void loop() macht in etwa das, was du da beschreibst. Nur weiß die arme 
Arduino-IDE nicht, wo deine Initialisierung aufhört und die main-loop 
anfängt. Daher gibt es für sowas void setup().
In deinem Fall also folgendermaßen:
1
void setup()
2
{
3
  int myVal = 0;
4
  boolean t1, t2;
5
}
6
7
8
void loop() {
9
  t1 = Taster1();
10
  t2 = Taster2();
11
12
  if (t1) {myVal++;} // Wert um 1 erhöhen
13
  if (t2) {myVal--;} // Wert um 1 vermindern
14
15
  Serial.print(t1);
16
  Serial.print ("\t");  
17
  Serial.print(t2);
18
  Serial.print ("\t");  
19
  Serial.println(myVal);
20
21
  delay(1000);
22
}

von Thomas E. (thomase)


Lesenswert?

Auch wenn ich mich mit Arduino nicht wirklich auskenne, eigentlich sogar 
überhaupt nicht. Aber, daß die in Setup() deklarierten lokalen Variablen 
in Loop() bekannt sind, kannst du deiner Oma erzählen.

von malsehen (Gast)


Lesenswert?

Thomas E. schrieb:
> Aus dir wird bestimmt nochmal ein großer Programmierer.

Ist er doch schon...

von Michael U. (amiga)


Lesenswert?

Hallo,

naja, fast. Prinzipiell sieht die Arduino main so aus:
1
int main(void)
2
{
3
  init();
4
5
  setup();
6
   
7
  for (;;)
8
   loop();
9
       
10
  return 0;
11
}

loop() wird in einer Endlosschleife als Funktion ständig aufgerufen.

int myVal = 0; innerhalb setup() gilt nur innerhalb setup...

Wenn, dann müßte sie global angelegt werden, also
1
int myVal = 0;
2
3
setup();
4
5
loop();

Es gibt aber keinen Grund, eine variable, die nur innerhalb der Funktion 
loop() benutzt wird, global anzulegen. Damit sie ihren Wert bei erneutem 
Aufruf von loop() behält gibt es static.

Gruß aus Berlin
Michael

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas E. schrieb:
> Auch wenn ich mich mit Arduino nicht wirklich auskenne, eigentlich
> sogar
> überhaupt nicht. Aber, daß die in Setup() deklarierten lokalen Variablen
> in Loop() bekannt sind, kannst du deiner Oma erzählen.

 Ich glaube, nicht mal die Oma frisst das.

von Mechanican (Gast)


Lesenswert?

Ist das hier jetzt ein Kindergarten?

von Theor (Gast)


Lesenswert?

@ Roth

Ich fürchte, diese "Entdeckung" hat lange nicht die Bedeutung, die Du 
ihr zumisst.


Der Funktionsheader void loop() ist "eindeutig" und ohne Rätselraten 
einfach ein Funktionsheader. Nicht mehr und nicht weniger.

C kennt keine Funktionen, die, falls sie "loop" heissen, ohne weiteres 
immer wieder aufgerufen werden.

An Deinen Fehlern aus Unkenntnis bin ich - und ich vermute die meisten 
hier -, nicht interessiert. Dazu haben wir schon genug eigene Fehler 
dieser Art gemacht.

Also übertreib mal nicht. Das Du diesen Fehler gemacht hast, ist absolut 
nichts Besonderes.

von Zeno (Gast)


Lesenswert?

Theor schrieb:
> Der Funktionsheader void loop() ist "eindeutig" und ohne Rätselraten
> einfach ein Funktionsheader. Nicht mehr und nicht weniger.

Das Entscheidende hier ist die Arduino IDE an dieser Stelle, denn die 
macht aus der Funktion loop() eine echte Schleife - Michael hat es 
beschrieben wie intern abläuft.
Bei Arduino ist die Reihenfolge so vorgesehen:
1. Variable definieren
2. setup() //alle Initialisierungen
3. loop() // das was immer wiederholt werden soll

Wer mag kann hier 
https://www.arduino.cc/reference/en/language/structure/sketch/setup/ 
nachlesen.

Ja nach außen hin ist loop() eine ganz normale Funktion. Intern wird es 
aber von der Arduino IDE anders gehandhabt. Man könnte das Ganze auch 
mit einem anderen Compiler kompilieren aber das Kompilat wird nicht wie 
gewünscht funktionieren. Aber sehr wahrscheinlich wird es nicht 
durchlaufen weil der Compiler die fehlende main() anmeckern wird.
Für einen anderen Compiler, z.B. GCC, müßte man es so implementieren wie 
Michael es beschrieben hat.

von Einer K. (Gast)


Lesenswert?

Zeno schrieb:
> Ja nach außen hin ist loop() eine ganz normale Funktion. Intern wird es
> aber von der Arduino IDE anders gehandhabt. Man könnte das Ganze auch
> mit einem anderen Compiler kompilieren aber das Kompilat wird nicht wie
> gewünscht funktionieren. Aber sehr wahrscheinlich wird es nicht
> durchlaufen weil der Compiler die fehlende main() anmeckern wird.
> Für einen anderen Compiler, z.B. GCC, müßte man es so implementieren wie
> Michael es beschrieben hat.
Ich glaube du bist etwas verwirrt.

1: Das ist alles ganz normales C++
2. loop() ist eine ganz normale Funktion
3. Arduino nutzt den gleichen Gcc, wie das Atmel Studio

von Alex G. (dragongamer)


Lesenswert?

Richtig. Denke er verwechselt Compiler mit IDE, denn die Arduino IDE ist 
es die besagte main Funktion welches loop() tatsächlich aks loop 
aufruft, im Hintergrund hinzufügt.

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.