Hallo Jungs Ich habe einen Interrupt-Problem, was ich allein nicht lösen kann. Ich habe einen C-Code, was ich mit AVR 4.13 Problemlos kompiliere. Wenn ich den erzeugten Hex-File auf meinen Atmega 168 raufspiele, funktioniert alles einwandfrei. Nun kompiliere ich den gleichen C-File mit AVR 4.19 dann kreige ich die Warnung, dass die Anweisung SIGNAL alt ist. Ich habe danach die folgende Ändeung durchgeführt: -#include <avr/signal.h> durch #include <avr/interrupt.h> ersetzt. - SIGNAL(SIG_ADC) durch ISR(ADC_vect ) ersetzt. -SIGNAL(SIG_OUTPUT_COMPARE2A) durch ISR(TIMER2_COMPA_vect ) ersetzt. Diese Änderungen haben nichts gebracht, mein Hex file ist falsch bzw das Programm bringt nur misst. habe ich hier was falsch verstanden oder muss ich noch was ändern?? Ich bitte um euren Hilfe, bitte nur konstruktive Antworten Danke im Voraus
Skusa schrieb: > Nun kompiliere ich den gleichen C-File mit AVR 4.19 dann kreige ich die > Warnung, dass die Anweisung SIGNAL alt ist. Gut. Das ist zwar richtig und sollte auch angepasst werden, aber die Warnung kann fürs erste mal ignoriert werden. Da gehts nur um Schreibweisen. Die viel wichtigere Frage lautet nämlich: trotz der Warnungen - funktioniert das Programm noch? > Diese Änderungen haben nichts gebracht, mein Hex file ist falsch bzw das > Programm bringt nur misst. In deinem Programm ist auch einiges ziemlicher Mist. Zum einen ist es so geschrieben, dass eine Analyse recht schweirig ist. Zum anderen stechen mir solche Dinge unsigned int j; for (j = 0; j < 200; j++){};// wait for transistor sofort ins Auge. Sorry, aber das ist keine vernünftige Methode um etwas zuzuwarten. Denn: der Compiler wird diese Warteschleife restlos wegoptimieren, da sie nichts macht ausser Zeit zu verbrauchen und genau das ist die Aufgabe des Optimizers, Code so umzuschreiben, dass er weniger Zeit verbraucht. Daher fliegt dieser Teil ganz einfach ersatzlos raus. Ob das in deiner Anwendung einen UNterschied macht, kann ich nicht sagen. Aber so über alles gesehen, wäre ein Redesign des ganzen Programms sowieso angebracht.
Hallo Buchegger Karl Heinz Buchegger schrieb: > Die viel wichtigere Frage lautet nämlich: trotz der Warnungen - > funktioniert das Programm noch? Das Programm funktioniert leider nicht mehr, dass ist was mich fertig macht und was ich nicht verstehen kann woran das liegt. Karl Heinz Buchegger schrieb: > n deinem Programm ist auch einiges ziemlicher Mist. > Zum einen ist es so geschrieben, dass eine Analyse recht schweirig ist. > Zum anderen stechen mir solche Dinge > > unsigned int j; > for (j = 0; j < 200; j++){};// wait for transistor Bei dieser Funktion wird einen Transistor eingeschaltet und ich warte sozusagen bis der eingeschwungener Zustand erreicht ist. Was würden Sie noch mir empfeheln zu ändern, ich bin leider kein Profi, deswegen bin ich noch am üben Danke
Skusa schrieb: > Hallo Buchegger > > Karl Heinz Buchegger schrieb: >> Die viel wichtigere Frage lautet nämlich: trotz der Warnungen - >> funktioniert das Programm noch? > > Das Programm funktioniert leider nicht mehr, dass ist was mich fertig > macht und was ich nicht verstehen kann woran das liegt. Neuer Compiler, der aggressiver deine Programmierfehler ausnutzt.
Skusa schrieb: > Das Programm funktioniert leider nicht mehr, dass ist was mich fertig > macht dann verwende den alten Compiler weiter. Aber da jetzt den ganzen Code durchzusehen ist eine Sysiphusarbeit, zumal er auch so geschrieben ist, dass man ständig am Scrollen bzw. Bits_im_Datenblatt suchen ist. Wenn ich den Code kriege, würde ich danach fragen was das alles machen soll, würde den Code wegschmeissen und neu schreiben. Geht auf lange Sicht schneller, als einen Halbtoten soweit aufzupäppeln, dass er noch eine Runde durchsteht. Sorry. Klingt vielleicht hart, ist aber ungeschminkt.
Du könntest vielleicht noch versuchen, den Code Schritt für Schritt in Betrieb zu nehmen. D.h. Im Grunde erst mal im Code so ziemlich alles stilllegen und dann sukzessive einen Teil nach dem anderen wieder mit dazunehmen und dir überlegen, wie du die Dinge testen kannst. Dann wird dieser Teil ausführlich gestestet und wenn alles passt wird der nächste Teil aktiviert.
Karl Heinz Buchegger schrieb: > Du könntest vielleicht noch versuchen, den Code Schritt für Schritt in > Betrieb zu nehmen. > > D.h. Im Grunde erst mal im Code so ziemlich alles stilllegen und dann > sukzessive einen Teil nach dem anderen wieder mit dazunehmen und dir > überlegen, wie du die Dinge testen kannst. Dann wird dieser Teil > ausführlich gestestet und wenn alles passt wird der nächste Teil > aktiviert. Ich danke, ich werde es mal versuchen
Komplilier das Ding mal OHNE Optimierung, also Stufo -O0 (O Null). Die Einstellung findet man unter den Projektoptionen.
Falk Brunner schrieb: > omplilier das Ding mal OHNE Optimierung, also Stufo -O0 (O Null). > Die Einstellung findet man unter den Projektoptionen. na hoffentlich passt es da noch rein. Bei den ganzen floats und long ints im code.
> n deinem Programm ist auch einiges ziemlicher Mist. > Zum einen ist es so geschrieben, dass eine Analyse recht schweirig ist. > Zum anderen stechen mir solche Dinge > > unsigned int j; > for (j = 0; j < 200; j++){};// wait for transistor >Bei dieser Funktion wird einen Transistor eingeschaltet und ich warte >sozusagen bis der eingeschwungener Zustand erreicht ist. >Was würden Sie noch mir empfeheln zu ändern, ich bin leider kein Profi, >deswegen bin ich noch am üben Das problem hier ist das der Compiler die Zeile wegschmeidt, wenn Du mit der Option -O2 übersetzt, und sie bei -O0 stehen lässt; Um sicher zu gehen kannst Du hier für die deklaration von j ein volatile benutzen, dann bleibt der Code auf jeden Fall erhalten. volatile unsigned int j; for(j=0;j<200;j++) {}
Hallo Jungs Auf -O0 umzusetzen hat geholfen, jetzt geht alles ich bin euch wirklich unendlich dankbar. für den erstes Test reicht die Änderung aber ich werde aufjedenfall die Software umschreiben. Ich wünsche euch ein schönes Wochenenede MfG
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.