Forum: Compiler & IDEs universelle Tasterabfrage von Peter Dannegger


von Dirk Seidel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

in meinem nächsten Projekt verwende ich auch einige Taster, die 
entprellt werden müssen und auf langen und kurzen Druck reagieren 
sollten. Also habe ich diese Entprellroutine gefunden.

Ich habe diese durch den AVRStudio(4.12) gejakt, um mir die ganze Sache 
zu gemüte zu ziehen. Das Problem ist, dass er bei dem Timer-Overflow 
immer an diese Stelle springt: int main( void ). Er müsste doch 
eigentlich an diese Stelle springen ISR( TIMER0_OVF_vect ), oder ?

Kann mir jemand helfen?

Gruß Dirk

von Fabian B. (fabs)


Lesenswert?

Schalte mal die Optimierung aus.

Gruß
Fabian

von OliverSo (Gast)


Lesenswert?

Auch mit eingeschalteter Optimiernung sollte die Simulation in die ISR 
springen, und nie wieder main neu starten.

Ein Neustart nach einem Interrupt passiert u.a. bei einem nicht 
definierten Interruptvektor. Hast du wirklich das oben angehängte 
Original kompiliert, oder eine abgeänderte Version? Richtiger Mikro 
eingestellt?

Oliver

von Fabian B. (fabs)


Lesenswert?

Doch, das Problem kenne ich vom AVR-Studio mit GCC auch. Wenn die 
Optimierung zu aggressiv ist, dann kann der Debugger (via JTAG-ICE2) die 
Sprünge nicht mehr korrekt anzeigen.
Bisher hatte ich solche Probleme mit Os oder O3. Mit O2 gehts im 
Allgemeinen.
Einfach mal probieren...

Gruß
Fabian

von Karl H. (kbuchegg)


Lesenswert?

Ist aber in dem Fall eher unwahrscheinlich.
Bei eingeschalteter Optimierung ordnet zwar der Compiler
den Code um, aber am Einsprungspunkt einer ISR kann auch
der beste Optimizer nichts drehen.

Wenn bei einem Interrupt die Programmausführung wieder am
Anfang von main() landet, dann ist die häufigste Ursache
dafür, dass irgendetwas in der Definition der ISR nicht
stimmt. Dadurch erkennt der Compiler die Funktion nicht mehr
als ISR an, es wird der Default Interrupt Handler installiert
und der sorgt dafür, dass das Programm wieder von vorne gestartet
wird.

Mögliche Ursachen für eine fehlerhafte ISR wurden schon
genannt. Zumindest früher gabs auch noch das Problem, dass eine
ISR nicht eingebaut wurde, wenn der Header <avr/interrupt.h>
nicht inkludiert war.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Welcher Controller ist das?

von Dirk Seidel (Gast)


Angehängte Dateien:

Lesenswert?

Ja ich habe das selbe Programm benutzt, wie ich hier reingestellt habe.
getestetmit:  ATMega32
    auf =o2 gestellt
                  --> keine Veränderung



Wenn ich aber die Version benutzte, die ich jetzt im Anhang zur 
Verfügung gestellt habe, funktioniert das Program.

Funktionierte allerdings auch nicht auf anhieb, weil er zu erst diese 
Sachen nicht finden konnt:

#include <io.h>
#include <interrupt.h>
#include <signal.h>

--> dann habe ich "avr/" davorgeschrieben und auf ausführen geklickt:

Loaded plugin STK500
Loaded plugin AVR GCC
Loaded partfile: C:\Programme\Atmel\AVR 
Tools\PartDescriptionFiles\ATmega8535.xml
Object file does not exist:

--> dann nochmal ausführen:

und er startete das Program ohne zu meckern(springt auch da hin, wo er 
sollte)

wenn ich folgende Zeile umschreibe in: //#include <signal.h>

--> er springt wieder zu main(void)

wenn ich bei der version, die ich am Anfang rein gestellt habe noch 
<avr/signal.h> ergänze, funktioniert es trotzdem nicht.

Gruß Dirk

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.