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 { } } } }
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.
for-Schleifen würden dem Programm gut tun, ich habe selten so ein "interessanten" Quellcode gesehen ;)
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
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
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.
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
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!
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.
Ein prima Beweis dafür, dass auch eine "tolle" Programmiersprache wie C nichts gegenüber BASIC bringt !!
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.