www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik For-Schleife funktioniert nur 3x


Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in meinem Main-Programm folgende for-Schleife:

int i;
for(i=0;i<5000;i++){
  if(FIFOP_SET && !FIFO_SET) {
    fputs("FIFO overflow: flushing RXFIFO\r\n", uart);
    ...
  }

  if(FIFOP_SET){
    fputs("FIFOP=1\n", uart);
  }

  if(!(FIFOP_SET)){
    fputs("FIFOP=0\n", uart);
  }

  if(i==4999){
    printf("i= %d ", i);
    i=0;
  }
}


diese Schleife wird immer genau 3x ausgeführt. Warum??

Autor: Andreas B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Antwort habe ich nicht, aber ein Vorschlag: Du kannst nach jeder
Funktion die aufgerufen wird eine Ausgabe machen (ich weiss jetzt nicht
wo dein printf angezeigt wird, ist ja auch nur ein Beispiel)

for(i=0;i<5000;i++){
  if(FIFOP_SET && !FIFO_SET) {
    fputs("FIFO overflow: flushing RXFIFO\r\n", uart);
    printf("#Zeile %i durchlaufen\n", _LINE_);
    ...
  }
  printf("#Zeile %i durchlaufen\n", _LINE_);

  if(FIFOP_SET){
    printf("#Zeile %i durchlaufen\n", _LINE_);
    fputs("FIFOP=1\n", uart);
  }
  printf("#Zeile %i durchlaufen\n", _LINE_);


usw. dann siest du wo das er hängen bleibt. Eventuell auch noch i
ausgeben.

mfg Andreas

Autor: Dirk Broßwick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mit den code den du hier gepostet hast sollte es eigentlich gehen. aber
leider sieht man nicht was noch passiert im Code oder was du geplant
hast, da du nicht alles gepostet hast. Zudem fällt auch auf das hier
einige Konstruktionen sind die nicht ganz so einleuchtend sind und auch
übersichtlicher gehen.  Vor allem stört die Kontruktion:

  if(i==4999){
    printf("i= %d ", i);
    i=0;
  }

Das in einer for-scheife zu finden ist nicht ganz okay, man sollte hier
lieber gleich ne while()-scheife nehmen. Aber nix des so trotz wäre der
fehlende Code noch sehr hilfreich.

CA

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe den Code jetzt so abgeändert:

while(i<5000){
 if(FIFOP_SET && !FIFO_SET) {
  fputs("FIFO overflow: flushing RXFIFO\r\n", uart);
  cc_strobe(CC2420_SFLUSHRX);
  cc_strobe(CC2420_SFLUSHRX);
  ENABLE_FIFOP_INT;
 }

 if(FIFOP_SET){
   fputs("FIFOP=1", uart);
   printf("   i= %d\n ", i);
  }

  if(!(FIFOP_SET)){
   fputs("FIFOP=0", uart);
   printf("   i= %d\n ", i);
   }

   i++;
   if(i==4999){
    printf("i= %d ", i);
    i=0;
   }
}

und erhalte immer folgende Ausgabe:

FIFOP=0  i=0
FIFOP=0  i=1
FIFOP=0  i=2
und dann geht es wieder von vorne los.


Der Rest des Codes ist nur eine Initialisierungsfunktion, die bis dahin
abgeschlossen ist.

Autor: Dirk Broßwick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm ... schauts schwer aus, jetzt ist die frage ob i noch woanders
benutzt wird, oder gar lobal definiert ist, und obs der richtige type
ist. Aber wenn das programm eh immer in einer schleife laufen soll geht
auch ein while( 1 ) ... dann wird while nie abgebochen. Benutzt du
intrrupts ? benutzt du da eine variable i ?

CA

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
i verwende ich nur intern in einer anderen Fkt als in einer
For-Schleife, habe das Programm aber auch mit der Variable u probiert,
die läuft dann erst bis 2 wie oben und nach ein paar automatischen
Resets nur noch bis 1!

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das oben ist ja nur ein Testauszug aus meinem Programm, da mein
komplettes Programm gar nicht funktioniert und ich wissen möchte/muss,
woran es liegt. Nun habe ich mein wirkliches Prog. mit AVR Studio
gedebugged und bin auf folgendes komisches gekommen. m
Der Code bleibt an dieser Zeile hier stehen:

if(FIFOP_SET && !FIFO_SET)
{...

in der H-Datei:
#define FIFOP_SET   bit_is_set(PORTE, PE4)
#define FIFO_SET  bit_is_set(PORTD, PD6)


und dass obwohl ich sehe (mit dem Oszi und bei den Pins im AVRStudio),
dass FIFOP auf 5V liegt und FIFO auf 0V, also ist die Bedingung doch
erfüllt?!
Was kann das nur sein?????

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du sicher, dass Du PORTE und PORTD abfragen willst, oder vielleicht
eher PIND und PINE?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...oder sind das Ausgänge? Siehst Du jetzt das Problem mit dem
unvollständigen Code? Man muss jedes Detail extra nachfragen...

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schaut doch einfach in den asm code........

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, wenn ich nun im AVR-Studio debuggen will, seh ich nicht mehr wo er
im Code ist, sondern nur noch das Disassembler-Fenster.

Wie kann ich es machen, dass er wieder im c-Code debuggt??
Sorry, wenn ich mich so blöd stell.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt würde es mich doch mal interessieren, wie Du das printf
eingebunden hast.

Dein Programm läuft ja mit voller Geschwindigkeit durch.

Wenn die "printf" und "puts" in einen Buffer für die Ausgabe über
die serielle Schnittstelle schreiben, dann kommt die serielle
Schnittstelle mit der Ausgabegeschwindigkeit da natürlich nicht mit.

Das Programm würde also viele Daten in den Ausgabepuffer schreiben -
bis der eventuell überläuft, den Stack kaputt schlägt und Dein Programm
abstürzt bzw. wieder von vorne beginnt.

Autor: Stefanie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,
ich bin totale Anfänderin und das was du schreibst klingt mir total
logisch! und ich glaube, dass das wahrscheinlich auch die ganze Zeit
mein Fehler ist.
Mein Programm bricht nämlich immer wieder ab bzw. bleibt irgendwo
stehen.
Ich versuche es jetzt ohne diese Ausgaben (printf und puts) und dafür
debugg ich mit dem AVR Studio.

Danke für den Hinweis!!!

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.. da bin ich mal gespannt, ob's ohne printf's usw. dann geht.
Viel Erfolg

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst immer noch zu PlanB wechseln:

Schmeiss mal alles aus deinem Pgm raus. Du beginnst
bei 0

int main()
{
  int i;
  for(i=0;i<5000;i++){

  }
}

Das muss klappen.
Dann beginnst du, sukzessive wieder die Funktionalitaet
von vorher einzubauen. Der erste Schritt könnte sein:

int main()
{
  int i;
  for(i=0;i<5000;i++){

   i++;
   if(i==4999){
    printf("i= %d ", i);
    i=0;
   }

  }
}

usw, usw.
Solange bis der Effekt wieder auftritt. Wenn du den Effekt
wieder siehst, analysierst du mal, was du als letztes
eingebunden hast, und wie das ganze mit dem Rest vom Pgm
interagiert.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja:
Wenn Variablen ohne ersichtlichen Grund ihre Werte
ändern, dann liegt das meist an irgendwelchen Array-
Überläufen.
Halt also die Augen nach solchen Dingen offen.

zb.

  int i;
  char Test[5];
  int j;

  i = j = 0;
  Buffer[5] = 'a';

Die Wahrscheinlichkeit ist hoch, dass jetzt entweder
i oder j nicht mehr den Wert 0 enthalten.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ins Blaue:
Watchdog-Timer an, der ständig ein Reset ausführt?

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.