mikrocontroller.net

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


Autor: Stefan S. (stefanst)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
while(1){      
                  
  var0 = OWFindAll();

  while(PINSB==0xC0)OUTC=PINSB;
}
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):
while(1){      
                  
  var0 = OWFindAll();

  while(PINSB==0xC0)OUTC=PINSB;

    var1=FoundROM[0][0];
    var2=FoundROM[0][1];
    var3=FoundROM[0][2];
    var4=FoundROM[0][3];
    var5=FoundROM[0][4];
    var6=FoundROM[0][5];
}

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

Autor: Andreas K. (derandi)
Datum:

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

Autor: Uhu Uhuhu (uhu)
Datum:

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

Geiz ist geil!

Autor: Stefan S. (stefanst)
Datum:

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

Autor: Harry (Gast)
Datum:

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

if (rslt) rslt = OWVerify();

Autor: ozo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Stefan S. (stefanst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (derandi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stürzt es schon bei var0 ab oder erst später?

Autor: Stefan S. (stefanst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe nochmals ausprobiert:
Dieser Codeausschnitt läuft:
while(1){      
                  
  var0 = OWFindAll();

  while(PINSB==0xC0)OUTC=PINSB;
    var0=FoundROM[0][0];
    var1=FoundROM[0][0];
    var2=FoundROM[0][1];
    var3=FoundROM[0][2];
    var4=FoundROM[0][3];
} 

Und dieser Codeausschnitt läuft nicht:
while(1){      
                  
  var0 = OWFindAll();

  while(PINSB==0xC0)OUTC=PINSB;
    var0=FoundROM[0][0];
    var1=FoundROM[0][0];
    var2=FoundROM[0][1];
    var3=FoundROM[0][2];
    var4=FoundROM[0][3];
    var5=FoundROM[0][4];
    var6=FoundROM[0][5];
} 

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.