Forum: Mikrocontroller und Digitale Elektronik while(1) Laufbedinung bricht ab


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hobbyflieger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Die Laufbedingung  bricht ab und das Programm startet von beginn (Wie 
RESET). Wenn Variablen fahrt_counter = 0;  counter_endwert = 0 in 
PrintData() gelöscht werden, wiederholt die    while (fahrt_counter > 3) 
problemlos. wenn ich Variable fahrt_counter = 0;  counter_endwert = 0 
dazu schreibe, bricht die Laufbedingung der while (fahrt_counter > 3) 
aber auch while(1) !!!! warum ? kann jemand mir das erklären warum mein 
Code so läuft. Danke

1
int main ()  {
2
Konf_GPIO();
3
Konf_Timer();
4
Konf_SPI_MASTER(); 
5
Konf_ADC();
6
sei();
7
Dummy_Readout_ADC();
8
Konf_Motor();
9
10
 while (1) {
11
12
    if (counter_Umax > counter_Umax_alt && counter_Umax < 10) {
13
      E_Umax += 10;
14
      counter_Umax_alt = counter_Umax;
15
    }
16
17
   ...
18
   ...Funktionen(); 
19
20
    PrintData();
21
    while ((micros() - timer_ms[0]) < 1000 * dt);
22
  }
23
24
}
25
26
27
28
void PrintData() {
29
30
  if (sollwert == endwert) {
31
    if (counter_endwert % slope == 0) {
32
      fahrt_counter++;
33
      zeitrampe = 0;
34
      while (fahrt_counter > 3) {
35
        if (fahrt_counter < 5) {
36
          print_Data_speicher();
37
        }
38
        counter++;
39
        _delay_ms(20);
40
        ADC_einzelmessungen();
41
        standby(1);
42
        if (counter % 100 == 0) {
43
          printFile();
44
          fahrt_counter = 0;
45
          counter_endwert = 0;
46
          counter_Umax++;
47
          _delay_ms(1000);
48
        }
49
        fahrt_counter++;
50
      }
51
    }
52
    counter_endwert++;
53
  }
54
}

von hp-freund (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Hobbyflieger schrieb:
> if (counter_Umax > counter_Umax_alt && counter_Umax < 10)

Sieht nach zu wenig Klammern aus.

von Hobbyprogrammierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hobbyflieger schrieb:
> warum ?

Weil du einen Fehler in deinem Code hast.

Und weil du uns den Fehler nicht zeigst .......

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
Der Fehler dürfte im nicht geposteten Code zu finden sein.
Ein while (1){...} wird regulär nur durch break oder goto verlassen.

Du könntest aber auch Fehler wie Stack Overflows im Code drin haben, das 
gibt dann gar lustige Folgen. Oder der Controller geht in den Reset und 
das Programm startet dadurch neu.

von Jan H. (j_hansen)


Bewertung
0 lesenswert
nicht lesenswert
Kopiere deinen Code von oben mal da rein: 
http://esprima.org/demo/validate.html

Und dann versuch mal gültiges C zu bekommen.

Dann noch ein lauffähiges Minimalbeispiel für uns, aber ich denke wenn 
du oberen Punkt erledigt hast ist das Problem schon weg.

von Mampf F. (mampf) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Das bringt garnichts, unvollständigen Code zu posten ... Es gibt viele 
Möglichkeiten ... Könnte ein Interrupt sein, der spinnt oder oder oder, 
aber man sieht ja keinen Code.

Kann gut sein, dass in dem Teil, den du gepostest hast, kein solcher 
Fehler vorliegt, weshalb deine Verwunderung zurecht ist.

Poste mal den Rest bitte :)

von Hobbyflieger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das hat auf jeden Fall keinen Einfluss. Das Problem wo anderes. warum 
wird die Laufbedingung der While(1) abgebrochen.
1
 
2
    if ((counter_Umax > counter_Umax_alt) && (counter_Umax < 10)) {
3
      E_Umax += 10;
4
      counter_Umax_alt = counter_Umax;
5
    }

von Volle (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nach meiner langjährigen Erfahrung kann Code ohne Kommentare, bei dem 
sich die Sprach mitten im Wort ändert nie fehlerfrei funktionieren.

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Hobbyflieger schrieb:
> Das hat auf jeden Fall keinen Einfluss.

Derartige Fehler liegen immer da, wo sie garantiert nicht liegen.

von hp-freund (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Was machen denn die Variablen die Du 0 setzt?
Division durch Null in einer Funktion?

Prima Gelegenheit den Debugger zu bemühen, bzw. Debug Nachrichten zu 
senden.

von Hobbyprogrammierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Thomas E. schrieb:
> Derartige Fehler liegen immer da, wo sie garantiert nicht liegen.

Derartige Fehler liegen garantiert immer da, wo sie garantiert
nicht liegen.

von Hobbyprogrammierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
hp-freund schrieb:
> Prima Gelegenheit den Debugger zu bemühen

Derjenige der weiss dass der Fehler garantiert nicht "da" ist,
braucht auch keinen Debugger.

von Rufus Τ. F. (rufus) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Hobbyflieger schrieb:
> Das hat auf jeden Fall keinen Einfluss.

Wenn da z.B. ein Stacküberlauf geschieht, dann hat das sehr wohl einen 
Einfluss.

von fop (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hast Du einen Watchdog aktiv ?

von Jörg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dann schreib' Dir doch mal hinter die while-Schleife in main einen 
Debugmarker (gib' was aus, lass eine LED angehen...) und mach danach 
eine leere while(1) Schleife.

Damit solltest Du sehen können, ob die Schleife sauber abgebrochen wird 
oder doch etwas anderes (wie andere schon geschrieben haben) der Grund 
ist.

von Michael A. (micha54)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

einer der häufigsten Fehler, bei dem scheinbar die while(1) unterbrochen 
wird, ist ein fehlender Interrupt-Handler.

Aber mal im Ernst: über welchen Prozessor unterhalten wir uns eigentlich 
?

Gruß,
Micha

von Nop (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hobbyflieger schrieb:
> Das Problem wo anderes.

Aha. Wo denn?

> warum wird die Laufbedingung der While(1) abgebrochen.

Wird sie nicht. Das sieht nur so aus. Der Controller bootet vermutlich 
neu, weil irgendwas in dem Code passiert, den Du uns nicht zeigst.

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich denke auch, das Teil bootet neu.
Ähnliche Dinge hatte ich auch schon mal. Jetzt toggle ich da immer einen 
Ausgang. Dann kann man ein Oszi drauf ansetzen.

von Di P. (drpepper) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Kann es sein, dass dir VCC des controllers wegknickt (z.B. weil 
irgendetwas eingeschaltet wird)?

Wenn möglich, wäre ein Oszi an der Versorgungsspannung ggf. 
aufschlussreich.

von Hobbyflieger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
du hast gewonnen. war stackoverflow

von Nop (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Gegen stack overflow compiliert man z.B. bei GCC mit der Option 
-fstack-usage. Dann sucht man sich den Codepfad mit der schlimmsten 
Stackbenutzung anhand der .su-Dateien raus, addiert noch die Interrupts 
drauf, plus ein wenig Sicherheitsreserve (etwa 512-1024 Bytes) und schon 
weiß man, was man braucht.

Sonst hast Du das Problem, daß es scheinbar läuft, aber sobald die 
Interrupts ausgerechnet im Moment maximaler Stackbenutzung kommen, 
knallt es gelegentlich trotzdem. Sehr schwer zu debuggen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.