Hallo, habe das Problem das ein extern ausgelöster Interrupt an Port D2(INT0) zu einem Reset führt. Ein Auschnitt vom Code ist angehängt. Eigentlich möchte ich durch den Interrupt in meine Endlosschleife zurückspringen. Habe per Suchfunktion zwar schon was zum Thema gefunden, allerdings war da der Fehler eine falsche Schreibweise des (INT0_vect), oder ein Stacküberlauf, was ich bei mir für unwahrscheinlich halte.
Hi, > habe das Problem das ein extern ausgelöster Interrupt an Port D2(INT0) > zu einem Reset führt. Woraus schließt Du das? Wird "Schreibe „Programm Anfang“;" nach dem Interrupt ausgeführt? Andere RESET-Quellen: Wie ist der RESET Pin beschaltet? Betriebsspannung; BODLEVEL/BODEN Fuses? Bitte poste Deinen Code als *.c, denn nicht jeder ist gewillt, WORD Dateien zu öffnen. Ich nehme an, Du verwendest ein aktuelles GCC. Hast Du mal mit dem Disassembler im AVR Studio nachgesehen, wie die Interrupt Vektoren aussehen? Gruß Fred
Hi, ja richtig, es kommt "Programm Anfang" im Display. Reset Pin ist mit 33µF gegen Masse und 10K gegen 5V geschaltet. BOD Fuses sind nicht gesetzt. Hier der Code: [c] #include <avr/io.h> //Einbinden der Standart I/O Library #include <avr/interrupt.h> //Einbinden der Library für Interruptfunktionen //PORTD: PD2 Taster für Interrupt // PD4 Taster für Testprogramm int Int=0; //Init der Interruptvariablen // zum Ausführen von Interrupts //********************************************************************** ** //Interruptroutine ISR(INT0_vect) { Int=1; //setzen der Interruptvariable } //********************************************************************** ** //Main int main (void) { DDRD = 0x03; //Init PD7 - PD2 als Eingang (Funktionstasten) PORTD= 0xFC; //Pull Up´s an PD7 - PD2 aktivieren (Tasten) //Initialisierung Interrupt MCUCR= (1<<ISC00) | (1<<ISC01); //Interrupt Int0 bei steigender //Flanke auslösen GICR = (1<<INT0); //Interrupt 0 Enable-Bit im Interupt //Control Register setzen (PD2 / Pin 16) SREG = (1<<7); //Global Interrupt Enable-Bit in //Statusregister setzen Schreibe „Programm Anfang“; //Info auf Display //Tastenabfrage while (1) //Endlosschleife { if (!(PIND & (1 << PIND4))) //PORTD4 auslesen -> //wenn low Programm "Test" ausführen { while (Int<1) { Test(); //Aufruf Programm Programm "Test" } } if (Int==1) //wenn Interruptvariable = 1 { Schreibe „hat geklappt“; //Info auf Display Int = 0; //rücksetzen der Interruptvar } } //endwhile } //endmain //********************************************************************** ** [c/]
Wie funktioniert der Disassembler, habe noch nie damit gearbeitet. Bei mir gibt es zwar in der Menüleiste unter "View" einen "Disassembler", aber der Menüpunkt ist grau hinterlegt, also nicht aktiv. Wie bekomm ich den zum laufen? Gruß Ulli
Hi,
> Wie funktioniert der Disassembler, habe noch nie damit gearbeitet.
gut, dass Du fragst! Du musst zunächst den Debugger starten (s. Anlage).
... s.u.
... dann kannst Du unter "View" den Disassembler aktivieren. Gleich am Anfang des Programm-Codes steht die Interrupt-Vektor-Tabelle (s. Anlage; in meinem Beispiel sind nur "0" {RESET-Vektor} und Vektor 18 gesetzt; die "default Vektoren" {im Beispiel 4F} führen zu einem Sprung zum RESET-Vektor!). Bei Dir müsste unter "2" die Adresse Deiner ISR angegeben sein. Ganz wichtig: Unter den Compiler-Optionen und unter den Assembler Optionen musst Du den korrekten Prozessor angegeben, auch die F_CPU, wenn es um zeitkritische Abläufe geht. Mach Dich mal mit dem Debugger vertraut - es lohnt sich! Nimm bei Deiner RESET-Beschaltung den Kondensator weg. Du verrätst nicht, wie Deine "Schreibe „hat geklappt“;" usw. Anzeige-Routinen aussehen. Der INT0 wird beim Loslassen des Tasters getriggert, dann kommen noch ein paar weitere Interrupts vom Prellen; da sehe ich aber eher keine Komplikationen, es sei denn, die "Schreibe" Routine kann damit nicht fertig werden. Bin jetzt ein wenig zu müde für mehr. Viele Grüße Fred
P.S.: Statt int Int=0; solltest Du volatile int Int=0; schreiben! Gruß Fred
Hi Fred, danke werd das gleich mal versuchen. Der Taster ist über einen 100nF Kondensator entprellt, aber ich schau mir mal an ob er evtl. trotzdem prellt. Die Programmteile zum schreiben auf dem Display und andere Funktionen habe ich extra weggelassen da diese das Ganze wohl nur unübersichtlicher gemacht hätten. Insgesamt besteht der Code aus 38 DINA4 Seiten. Es geht um ein Beschleunigungsmessgerät. Gruß Ulli.
Also, prellen tut er nicht. Zum Dissasembler: Wenn ich das richtig verstanden habe dann steht bei mir für einen Interrupt ein 6D, was weiter unten im Programm eine Zeile vor ISR ist. Die Screenshots sind angehängt. Das klingt doch dann eigentlich vernünftig oder? Nochwas: Habe eine Warnung zum ISR: "control reaches end of non-void function" Auch als Sceenshot im Anhang. Hat das viell. was mit meinem Problem zu tun? Gruß Ulli
Hallo Ulli, ich weiß nicht, was Du in den Word-Dateien versteckst. Wenn Du ein geeigneteres Dateiformat benutzt (für Screenshots *.png), wirst Du hier mehr Resonanz bekommen! Hier ist der Wurm: Die Fehlermeldung darf nicht bei einer ISR erscheinen; der Compiler scheint diese nicht als ISR (die ja keinen Wert liefern soll) zu erkennen. Suche im Detail nach Tippfehlern und sieh nach, dass Deine "iom16.h" in Ordnung ist! Welche Winavr Version verwendest Du? Gruß Fred
Hallo Ulli, hast Du diese Version von WinAVR Beitrag "[WinAVR 20080402rc1] Bug" ? Schon mal mit einer anderen Optimierungsoption probiert? Gruß Fred
Hi Fred, Ja sorry mit den Anhängen, bin halt nicht so der Freak. Weis auch nicht was ne .png ist. Verstehe aber auch nicht was an Word so tragisch ist. Ich verwende diese Version: WinAVR-20050214 Ist wohl wesentlich älter. Wo kann ich die Optimierungsoption ändern? Ich verwende keine "iom16.h", zumindest nicht bewusst. Ich verwende die "avr/io.h", das dürfte das selbe sein oder? Wieso sollte da was nicht in Ordnung sein, da fummel ich nicht drin rum :) ((zumindest nicht bewusst)) ;)
Hi Ulli, > Ja sorry mit den Anhängen, bin halt nicht so der Freak. > Weis auch nicht was ne .png ist. Verstehe aber auch nicht was an Word so > tragisch ist. *.png Dateien kannst Du mit den meisten Bildbearbeitungsprogrammen erstellen; auf jeden Fall mit den kostenlosen wie IrfanView und GIMP. Du erhältst dadurch kleinere Dateien, die bei Text und bestimmten Grafiken deutlich weniger Artefarkte von der Kompression bekommen als JPGs und trotzdem viel kleiner sind als BMPs. Na ja, Word kann Macros enthalten, die nicht jeder auf seinem Rechner laufen sehen möchte! > Ich verwende diese Version: WinAVR-20050214 Genau da könnte das Problem liegen! Irgendwann vor 1-2 Jahren (?) ist von SIGNAL() auf ISR() übergegangen worden. Von den feinen Unterschieden der verschidenenen Versionen der toolchain verstehe ich nicht sehr viel; also Feld frei für die Experten! > Wo kann ich die Optimierungsoption ändern? Aus dem AVRStudio mit "Project|Configuration Options|Optimization". > Ich verwende keine "iom16.h", zumindest nicht bewusst. Du hast im Studio ja mal eingegeben, dass Du den ATmega16 zugrunde legst. Aus der "io.h" wird die "iom16.h" so eingebunden: ... #elif defined (_AVR_ATmega16_) # include <avr/iom16.h> ... > Wieso sollte da was nicht in Ordnung sein, da fummel ich nicht drin rum > :) Versionsprobleme o.ä.! Ich bin mir recht sicher, dass ein Update auf eine der 2007 WinAVR Versionen das Problem beseitigen wird. Viele Grüße Fred
Hab was... im Totorial habe ich gesehen das es noch eine altertümliche Schreibweise gibt "SIGNAL(SIG_INTERRUPT)" usw. Damit funktioniert es... Tzzz Und hab grad noch dein Post gelesen vorm Abschicken... Japp, dann werd ich mal updaten. Vielen Dank!!!!!!! Gruß Ulli
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.