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


von Hobbyflieger (Gast)


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)


Lesenswert?

Hobbyflieger schrieb:
> if (counter_Umax > counter_Umax_alt && counter_Umax < 10)

Sieht nach zu wenig Klammern aus.

von Hobbyprogrammierer (Gast)


Lesenswert?

Hobbyflieger schrieb:
> warum ?

Weil du einen Fehler in deinem Code hast.

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

von Jim M. (turboj)


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)


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


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)


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)


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. (thomase)


Lesenswert?

Hobbyflieger schrieb:
> Das hat auf jeden Fall keinen Einfluss.

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

von hp-freund (Gast)


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)


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)


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) Benutzerseite


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)


Lesenswert?

Hast Du einen Watchdog aktiv ?

von Jörg (Gast)


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)


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)


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)


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


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)


Lesenswert?

du hast gewonnen. war stackoverflow

von Nop (Gast)


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.

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.