mikrocontroller.net

Forum: Compiler & IDEs universelle Tasterabfrage von Peter Dannegger


Autor: Dirk Seidel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schalte mal die Optimierung aus.

Gruß
Fabian

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Controller ist das?

Autor: Dirk Seidel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.