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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.