Forum: Compiler & IDEs Externer Interrupt löst Reset aus


von Steilheckulli (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Steilheckulli (Gast)


Lesenswert?

Ach ja, vewende einen ATmega16 und AVR Studio 4.13

Gruß Ulli

von Fred S. (Gast)


Lesenswert?

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

von Steilheckulli (Gast)


Lesenswert?

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

von Steilheckulli (Gast)


Lesenswert?

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

von Fred S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Fred S. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

P.S.:
Statt
   int Int=0;
solltest Du
   volatile int Int=0;
schreiben!

Gruß

Fred

von Steilheckulli (Gast)


Lesenswert?

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.

von Steilheckulli (Gast)


Angehängte Dateien:

Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

Hallo Ulli,

hast Du diese Version von WinAVR 
Beitrag "[WinAVR 20080402rc1] Bug" ? Schon mal mit einer anderen 
Optimierungsoption probiert?

Gruß

Fred

von Steilheckulli (Gast)


Lesenswert?

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

von Fred S. (Gast)


Lesenswert?

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

von Steilheckulli (Gast)


Lesenswert?

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