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