C Programm break vergessen ?

OP #2520685
Lesenswert?

Hallo, habe ein Programm was mit fernbedienungssignale auslesen kann und 
diese mir am Laptop anzeigt (RS232).

Doch geht es immer einmal, und damm zweiten und Xten mal bekomme ich 
immer 0x00 zurück. Wenn ich meinen PIC resete, dann geht es wieder 
einmal.

Könntet Ihr mir sagen, warum mein Code nur einmal geht ? Beende ich die 
anweisungen nicht richtig ?

LG Tim


Hier mein Code

        while(1)
        {

      if(Signal == 0)
      {
        Delay100TCYx(10);

        if(Signal == 0)
        {

          Delay100TCYx(40);

          if(Signal == 1)
          {

            while(Signal); //Wenn null dann weiter
            Delay100TCYx(17);

            if(Signal == 1)
            {

              while(Signal); //Wenn null dann weiter
              Delay100TCYx(17);

              if(Signal == 1)
              {

                while(Signal); //Wenn null dann weiter
                Delay100TCYx(17);

                if(Signal == 1)
                {

                  while(Signal); //Wenn null dann weiter
                  Delay100TCYx(17);

                  if(Signal == 1)
                  {

                    while(Signal); //Wenn null dann weiter
                    Delay100TCYx(17);

                    if(Signal == 1)
                    {

                      while(Signal); //Wenn null dann weiter
                      Delay100TCYx(17);

                      if(Signal == 1)
                      {

                        while(Signal); //Wenn null dann weiter
                        Delay100TCYx(17);

                        if(Signal == 1)
                        {

                          while(Signal); //Wenn null dann weiter
                          Delay100TCYx(17);

                          if(Signal == 1)
                          {

                            while(Signal); //Wenn null dann weiter
                            Delay100TCYx(17);

                            if(Signal == 1)
                            {

                              while(Signal); //Wenn null dann weiter
                              Delay100TCYx(500); // mitten zwischen 
beiden Signalen

                              while(Signal); //Wenn null dann weiter
                              Delay100TCYx(40);

                              if(Signal == 1)
                              {

                                while(Signal); //Wenn null dann weiter

                                Delay100TCYx(5);
                                Daten |= (Signal << 0);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 1);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 2);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 3);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 4);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 5);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 6);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 7);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 8);
                                test();

                                Delay10TCYx(175);
                                Daten |= (Signal << 9);
                                test();

                                fprintf (stdout, "Hexwert des Codes: %#d 
\r\n", Daten);
                                Daten = 0x00;
                              }
                              else
                              {
                              }

                            }
                            else
                            {
                            }

                          }
                          else
                          {
                          }

                        }
                        else
                        {
                        }

                      }
                      else
                      {
                      }

                    }
                    else
                    {
                    }
                  }
                  else
                  {
                  }

                }
                else
                {
                }

              }
              else
              {
              }

            }
            else
            {
            }

          }
          else
          {
          }
        }
        else
        {
        }


      }
         }
}
Persönliche Seite #2520786
Lesenswert?

Das Programm sieht sehr nach Spagetti-Code aus und was bewirken die 
Delay100TCYx Funktionen?

So kann man dir leider nicht helfen. Erklär bitte was das Programm genau 
machen soll, wie der Fehler aussieht und was die genutzten Funktionen 
machen. Ich denke, dass man das ganze auch sauberer schreiben kann um 
besser einen Überblick zu haben. Wichtig ist auch mit welcher Software 
du die Daten auf dem PC empfängst.

Benutze für den Code die entsprechenden Tags (<eckige Klammer 
auf>c<eckige Klammer zu>) oder lade die C-Datei hoch.
OP #2520802
Lesenswert?

Der Code liest das Signal einer Fernbedienung ein. Ich weis das es 
umständlich ist. Aber ganz erlich. Es musst erstmal funktionieren, und 
dann taste ich mich stück für stück an kompakte schreibweise rann.

Darum geht es nun ja auch nicht, der Fehler ist, das nach dem Reset der 
erste Code über USART (HT) richtig ausgegeben wird (printf Funktion) und 
wenn ich dann mal wieder eine Taste drücke, dann bekomme ich immer den 
Wert 0 zurück. über HyperTerminal. Und das kann nicht sein. Erst nach 
dem Reset bekomme ich wieder einen sinnvollen Wert zurück. Kann ich in 
der innersten I Abfrage am Ende so etwas ähnliches wie break; machen, 
damit der aus allen Schleifen rausspringt, und dann einfach wieder auf 
das erste If wartet ?

LG
OP #2520811
Lesenswert?

Es geht ja, aber immer nur einmal, und ich würde gerne wissen warum.
Um etwas anderes geht es nicht. Und das ich mich rann setzte und dann 
das ganze mit Makros und co. durchziehe, mache ich dann. Weil sonnst ist 
es in Makros Schleifen und co geschrumpft, es geht nicht und ich blicke 
es nicht mehr, weil es immer nur vor zurück rauf runter geht.

LG
#2520816
Lesenswert?

Tim E. schrieb:
> Es geht ja, aber immer nur einmal,

also gehts nicht.
Zumindest nicht so wie du es haben willst.

> und ich würde gerne wissen warum.

Vielleicht findest du ja jemanden, der sich das antut.

> es in Makros Schleifen und co geschrumpft, es geht nicht und ich blicke
> es nicht mehr, weil es immer nur vor zurück rauf runter geht.

Du verstehst nicht:
Du blickst es auch jetzt schon nicht mehr, eben weil der Code so lang 
ist, dass man ständig scrollen muss um zughehörige Klammern zu finden 
und zu erkennen, wo auf etwas gewartet wird und wo nicht.

Schreibs ordentlich!
#2520835
Lesenswert?

mein Vorschlag, "male" uns bitte die Programmlogik in Mindmap (freemind) 
auf.

Das ist zwar kein Petrinetz, aber damit kann man auch einen 
deterministischen endlichen Automaten (einige schreiben immer von einer 
State Machine) realisieren.

Nach der Analyse kommt dann die Programmkodierung.

Hier ist ein Beispiel wie so etwas mit diesem Tool aussehen könnte.
Angehängte Dateien:
#2520954
Lesenswert?

Tim E. schrieb:
> Aber ganz erlich. Es musst erstmal funktionieren, und
> dann taste ich mich stück für stück an kompakte schreibweise rann.

Tuts aber nicht. Du scheinst so ein lernresistenter Fall zu sein, sonst 
würdest du dir die Tipps von Karl Heinz zu Herzen nehmen.

Die Vorstellung, dass du das später einfach kompakter machen kannst ist 
auch seltsam. Es wird dann auf ein komplettes Neuschreiben rauskommen, 
so wie du es schon von Anfang an hättest tun sollen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren