universelle Tasterabfrage von Peter Dannegger

Gast #780211
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
Angehängte Dateien:
Gast #780260
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
#780275
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.
Gast #782656
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
Angehängte Dateien:

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