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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.