Loop kein richtiges Loop finde den Fehler

Gast #5581387
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
}
Angehängte Dateien:
Gast #5581398
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
Gast #5581417
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
}
#5581453
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
}
#5581481
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
Gast #5581560
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.
Gast #5581572
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.
Gast #5581573
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren