Coding erlernen

Hallo Experten, ich bin gerade dabei mich mit dem Ardulino zu beschäftigen bzw. das programmieren eines solchen zu erlernen. Dabei gehe ich Schritt für Schritt ein Handbuch mit Code Beispielen durch.
Jetzt bin ich gerade bei der If Verzweigung und verstehe nicht ganz warum der Ardulino so reagiert.

Hier der Code:

// if

int x;

void setup()
{
Serial.begin(9600);
Serial.println(“If Anweisung”);
Serial.println();
}

void loop()
{
Serial.println(x);
if(x==10)
{
Serial.println(" x ist jetzt 10");
while (1);
}
x++;
}

Meine Frage:
Warum bleibt das Programm stehen nachdem ausgegeben wurde, dass x den Wert 10 erreicht hat.

Ich habe das so verstanden, dass das Programm in “void loop” eine Endlosschleife ist und dann müsste, zumindest meiner Ansicht nach, x um 1 erhöht werden und in der nächsten Zeile “11” ausgeben.
Tut es aber nicht. Im Anhang findet Ihr die tatsächliche Ausgabe.

2018-12-01 14_50_13-COM3 (Arduino_Genuino Uno).jpg

while (1); ist eine Endlosschleife. Aus der kommt das Programm nicht mehr raus.

wow, das ging ja schnell, danke erstmal für die rasche Antwort.

Ja, aber weil es eine Endlosschleife ist müsste das Programm jetzt wieder zum Anfang dieser Schleife springen und das ist "Serial.println(x);"...

was versteh ich da falsch?

Jetzt bin ich gerade bei der If Verzweigung

warst du schon bei der while - Schleife ?

Deine sagt: solange 1 ungleich 0 ist, mach dies:

 ; // eine leere Anweisung

Lernen geht selten gerade aus, meist kreuz und quer.

aber weil es eine Endlosschleife ist müsste das Programm jetzt wieder zum Anfang dieser Schleife springen

while(1); ist für sich alleine schon eine Endlosschleife.

Ohne jeden Ausgang.

Super, danke für Eure Hilfe, hab's verstanden :slight_smile:

Ich hätte noch eine Frage, ich kann (ein bisschen) VB und da gibt es so Funktionen wie Haltepunkt setzen und Schritt für Schritt weiter springen mit Variablenüberwachung, gibt es so etwas auch in der Ardulino IDE?
Das würde sowohl das Debugen als auch das Erlernen um vieles erleichtern.

nur mit Schuss durchs knie.
du müsstest an die Serielle jeweils alles ausgeben das dich interessiert und anschließend auf ein Zeichen an der Seriellen Schnittstelle warten (Serial.available).

… ist noch etwas zu früh für dich :wink:

Auf einem µC ist das alles komplizierter, da das Programm auf einem anderen Prozessor läuft. Es gibt Hardware Debugger. Aber nicht mit der Arduino IDE

Hier ist (kostenpflichter) Software Debugger, der allerdings das Laufzeit-Verhalten ändert:
https://www.visualmicro.com/
https://www.visualmicro.com/page/User-Guide.aspx?doc=Debugging-Walkthrough-Start.html
(die Grundversion mit der man Visual Studio nutzen kann ist kostenlos. Der Debugger kostet dann Geld)

Auf einem µC ist das alles komplizierter

Sehe ich auch so.

Stand der Technik hier:
Serial.print Testausgaben, um zu sehen, was wie abläuft.

Nächste Frage: Arduino - Simulation auf PC
Ähnliche Antwort: Gibt was, aber vergiss es.

Falls du noch den Ausdruck "Arduino - Sprache" im Kopf hast:
Du schreibst deinen Sketch in C++. Bist also nicht auf die Arduino - Referenzen beschränkt.

Danke für Eure Antworten, falls ich mal wieder Fragen habe… und das wird sicher passieren :wink: weiß ich wohin ich mich wenden kann. Hier in diesem Forum wird einen wirklich und vor allem rasch geholfen.

Für größere Projekte setze ich immer eine boolesche Variable , z.B. "_debug" auf true/false. Zusätzlich schreibe ich einige Funktionen in mein Projekt, die sich bezüglich des Types von wert unterscheiden (int, String, bool usw.). Beispiel:

void int_debug(String bez, int wert)
{
     if (_debug)
     {
        Serial.print(bez+": ");
        Serial.prinln(wert);
     }
}

Im Programmcode dann der Aufruf an geeigneter Stelle. Ist das Projekt fertig, wird nur die Variable _debug im Kopf auf false gesetzt, die nunmehr unwirksamen Ausgaben bleiben drin.

Ich mach das so:

#define DEBUG



#ifdef DEBUG
  Alles was hier steht wird nur compiliert, wenn DEBUG definiert ist.  
#endif
#define DEBUG   //Uncomment for Debug.

#ifdef DEBUG    //Macros are usually in all capital letters.
  #define DBGPRINT(...)    Serial.print(__VA_ARGS__)     //DBGPRINT is a macro, debug print
  #define DBGPRINTLN(...)  Serial.println(__VA_ARGS__)   //DBGPRINTLN is a macro, debug print with new line
#else
  #define DBGPRINT(...)     //now defines a blank line
  #define DBGPRINTLN(...)   //now defines a blank line
#endif

Das hab ich mir mal von einer anderen quelle kopiert. Weiß nicht mehr von wo. Finde es am einfachsten, weil man nicht so viel tippen muss.

Das kann man auch noch ein wenig tunen, um die Ausgaben flexibler zu machen:

//#define DEBUG
#ifdef DEBUG
    #define DB_PRINT( x, ... ) { sprintf_P( dbgbuf, (const char*) F( x ), ##__VA_ARGS__ ) ; Serial.print( dbgbuf ); }
    char dbgbuf[80];
#else
    #define DB_PRINT( x, ... ) ;

#endif

Im Code steht dann z.B.:

DB_PRINT("JustagEnde, Tor %d, Auf-Pos=%d\n\r", torNr, TorS[torNr] );

Durch den Text kann man die Ausgabe bei mehreren Debug-Prints auch besser identifizieren.

harryberlin:
Finde es am einfachsten, weil man nicht so viel tippen muss.

Für wenig zu tippen sollte man auch die Defines kürzen :wink:

#define DEBUG 0

#if (DEBUG == 0)
  #define sp(...)
  #define spn(...)
  #define sbeg(...)
#else
  #define sp(...) Serial.print(__VA_ARGS__)
  #define spn(...) Serial.println(__VA_ARGS__)
  #define sbeg(...) Serial.begin(__VA_ARGS__)
#endif

Das ist hier aus dem Forum, ich weiß nur nicht mehr von wem.

Gruß Tommy

bin hin und wieder ein freund, wenn man als fremder auch auf dem ersten blick versteht, was der code beschreibt.
sp und spn sind da schon wirklich schwer.

sp=Serial.print, spn=Serial.println - Das steht ja oben bei den Defines und ich bin der Meinung, dass man sich das ganz gut merken kann.

Gruß Tommy

Das ist die Kurzschreibweise für die Befehle serial....
Kannste auch anders benennen

Hi

Wenn man selber diese Definitionen kreiert hat, muß man ja nicht umdenken.
So schlimm finde ich die ‘Tipp-Arbeit’ nun aber auch nicht - viel schlimmer wird Es, wenn man mehrere Varianten, wie Oben Die mit dem formatierten Text, verwenden will.
Und: Man muß statt Serial.print DebugPrint (oder sonst was) tippen - DA habe ich die meisten ‘Aussetzer’ :wink:

@harryberlin
Ich bin ein Freund von großen Buchstaben und Interpunktion - so verschieden kann’s sein.
(das Argument der Zeitersparnis hatten wir schon - wurde aber als Ausrede interpretiert, da Shift drücken nun wirklich nicht sooo lange braucht - fehlende Bildung würde ich aber gelten lassen ;))

MfG

@postmaster-ino
wir kommen vom thema ab. bildungsaustausch bitte per pn.