Forum: Mikrocontroller und Digitale Elektronik Interrupt-Problem


von Skusa (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Skusa (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Skusa (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

Komplilier das Ding mal OHNE Optimierung, also Stufo -O0 (O Null).
Die Einstellung findet man unter den Projektoptionen.

von Peter II (Gast)


Lesenswert?

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.

von nobi (Gast)


Lesenswert?

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

von Skusa (Gast)


Lesenswert?

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

von Sepp (Gast)


Lesenswert?

Ob er das wilklich macht?

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.