Forum: Mikrocontroller und Digitale Elektronik C Programm break vergessen ?


von Patrick E. (f4550tim)


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
        {
        }


      }
         }
}

von André A. (nummer5) Benutzerseite


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.

von Fabian (Gast)


Lesenswert?

Das ist mal ein lustiges Programm. :-)

von Ben j. (scarab)


Lesenswert?

for-Schleifen würden dem Programm gut tun, ich habe selten so ein 
"interessanten" Quellcode gesehen ;)

von Patrick E. (f4550tim)


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

von Patrick E. (f4550tim)


Lesenswert?

Benjamin F. schrieb:
> for-Schleifen würden dem Programm gut tun, ich habe selten so ein
> "interessanten" Quellcode gesehen ;)


Ich weis, erst einmal testen, und dann verschachteln. Ich wollte nurmal 
Schritt für Schritt logisch durchschauen. Und sobald es klappt, wird das 
Teil geschrumpft und Vermakrot ;)

LG

von Karl H. (kbuchegg)


Lesenswert?

Machs gleich.

Du siehst ja, dass du so nichts hinkriegst. Was deine Theorie vonwegen 
"erst mal schreiben, dann mach ichs richtig" somit zu Fall bringt.
Knapp vorbei ist nun mal auch daneben.

von Patrick E. (f4550tim)


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

von Karl H. (kbuchegg)


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!

von Uwe (de0508)


Angehängte Dateien:

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.

von Ben j. (scarab)


Lesenswert?

die else kannst du weg lassen wenn du eh nichts rein schreibst

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Ein prima Beweis dafür, dass auch eine "tolle" Programmiersprache wie C 
nichts gegenüber BASIC bringt !!

von Patrick E. (f4550tim)


Lesenswert?

So wunderbar, nun funktioniert es, es war ein Verständiss Fehler. Nun 
ist alles gegessen ;) So doof. C ist Prima, nun hat das Programm auch 
ein paar For schleifen :)

LG Tim

von Thomas E. (thomase)


Lesenswert?

Bernd Rüter schrieb:
> Ein prima Beweis dafür, dass auch eine "tolle" Programmiersprache wie C
> nichts gegenüber BASIC bringt !!
Schwachsinn. Das Problem sitzt eindeutig vor dem PC.

@Tim: Nichts für ungut.

mfg.

von Johannes G. (gutenberg)


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.

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.