Interrupt-Problem

Gast #3097709
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
Angehängte Dateien:
#3097742
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.
Gast #3097761
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
#3097768
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.
#3097775
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.
Gast #3097787
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
Gast #3097868
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++)
{}
Gast #3097942
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren