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
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
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