Forum: Mikrocontroller und Digitale Elektronik Unterschiedliches Verhalten von Funktion, das sich eigentlich nicht ändern dürfte


von Stefan S. (stefanst)


Angehängte Dateien:

Lesenswert?

Hallihallo!
Ich bin mal wieder am Verzweifeln... nachdem ich meinen gesamten Code 
nun "gereinigt" habe und das Programm bis zu einem gewissen Punkt 
funktioniert hat, stehe ich wieder mal vor einem Rätsel:
Schaut euch mal diesen Codeausschnitt an:
1
while(1){      
2
                  
3
  var0 = OWFindAll();
4
5
  while(PINSB==0xC0)OUTC=PINSB;
6
}
Erläuterung:
OWFindAll() sucht nach angeschlossenen Bauteilen und liefert die 
gefundene Anzahl zurück.
PINSB ist bei meinem µC (AN2131) auf meiner Platine standardmäßig auf 
0xC0, wenn man einen Taster auf der Platine drückt, ändert sich dieser 
Wert.
FoundROM ist ein ganz normales zweidimensionales Array vom Typ char

Das das Programm müsste ja bei der while-Schleife anhalten (also auf 
einen Tastendruck "warten"). Das tut es hier auch.
Nun mein Problem (dazu folgender Code-Ausschnitt):
1
while(1){      
2
                  
3
  var0 = OWFindAll();
4
5
  while(PINSB==0xC0)OUTC=PINSB;
6
7
    var1=FoundROM[0][0];
8
    var2=FoundROM[0][1];
9
    var3=FoundROM[0][2];
10
    var4=FoundROM[0][3];
11
    var5=FoundROM[0][4];
12
    var6=FoundROM[0][5];
13
}

Hier müsste das Programm ebenfalls anhalten, um nach Tastendruck die 
Wertet des Array in var... zu kopieren. Doch ich musste feststellen, 
dass das Programm nicht wartet, sondern immer wieder von vorne startet 
(und somit die Schleife anscheinend nie erreicht...
Wie kann ein Array solche Auswirkungen haben?!?!
Für alle, denen der Ausschnitt nicht reicht, im Anhang ist der komplette 
Code... (sorry, 2 mal der gleiche...)

Viele Grüße,
Stefan

von Andreas K. (derandi)


Lesenswert?

"while(1)" bewirkt doch, das die Schleife nie verlassen werden kann, 
oder nicht?

von Uhu U. (uhu)


Lesenswert?

Wenn man so mit Leerzeichen spart, sieht man das nicht gleich ;-)

Geiz ist geil!

von Stefan S. (stefanst)


Lesenswert?

Das while(1) stellt das "Betriebssystem" dar. Mir geht es um die 
while-Schleife, die die PINSB abfragt.

von Harry (Gast)


Lesenswert?

ich kenn weder den Controller noch den Compiler deshalb entschuldige die 
Frage, was soll diese Zeile machen?

if (rslt) rslt = OWVerify();

von ozo (Gast)


Lesenswert?

Mach doch mal die Variablen var0 bis var7 zu lokalen Variablen, also nur 
innerhalb von main gültig.
Ich verstehe & misstraue daher deiner Definition von diesen Variablen 
(nicht).

von Stefan S. (stefanst)


Lesenswert?

Die Programmzeile

if (rslt) rslt = OWVerify();

soll nur verifizieren, dass ein Bauteil mit dem erkannten Romcode auch 
wirklich vorhanden ist (dazu wird das gleiche Bauteil einfach nochmals 
gesucht, bei Erfolg wird 1, bei Misserfolg wird 0 zurückgegeben).

Die Variablen var0 bis var7 habe ich nun mal zu lokalen Variablen 
gemacht, aber das Programm stürzt an der Stelle, an der das Array in die 
var1 bis var6 kopiert wird, immer noch ab (und startet danach neu).
Das ist sehr mysteriös...

Viele Grüße,
Stefan

von Andreas K. (derandi)


Lesenswert?

Stürzt es schon bei var0 ab oder erst später?

von Stefan S. (stefanst)


Lesenswert?

Also ich habe nochmals ausprobiert:
Dieser Codeausschnitt läuft:
1
while(1){      
2
                  
3
  var0 = OWFindAll();
4
5
  while(PINSB==0xC0)OUTC=PINSB;
6
    var0=FoundROM[0][0];
7
    var1=FoundROM[0][0];
8
    var2=FoundROM[0][1];
9
    var3=FoundROM[0][2];
10
    var4=FoundROM[0][3];
11
}

Und dieser Codeausschnitt läuft nicht:
1
while(1){      
2
                  
3
  var0 = OWFindAll();
4
5
  while(PINSB==0xC0)OUTC=PINSB;
6
    var0=FoundROM[0][0];
7
    var1=FoundROM[0][0];
8
    var2=FoundROM[0][1];
9
    var3=FoundROM[0][2];
10
    var4=FoundROM[0][3];
11
    var5=FoundROM[0][4];
12
    var6=FoundROM[0][5];
13
}

Obwohl nur zwei var... mehr beschrieben werden... Hilfe

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.