Forum: Mikrocontroller und Digitale Elektronik Atmega128: Externer Interupt funktioniert nicht


von Bernd (Gast)


Lesenswert?

Hallo,

ich möchte bei einem Atmega128 in C (WINAVR) den Externen Interrupt 7
auslösen. Nur leider funktioniert das nicht; der Controler macht bei
Logikwechsel an dem enstrechenden Pin einen Restart!

Ich hab den Interrupt wie folgt initialisiert:

***********************************************
// External Interrupt(s) initialization
EICRA=0x00;
EICRB=0x40;
EIMSK=0x80;
// Global enable interrupts
sei ();

***********************************************



Die Interruptmethode sieht wie folgt aus:

***********************************************
SIGNAL (SIG_INTERRUPT7)
{
//Code für den Interrupt
}
***********************************************



Beim Überprüfen der List-Datei nach dem übersetzen ist mir aufgefallen,
dass nur bei der Adresse 0x20 ein Sprung zum Interruptprogramm vorhanden
ist.
Der Interuptadresse für den Externen Interrupt 7 müsste doch eigentlich
bei 0x10 sein, oder?:

**********************************************

00000000 <__vectors>:
   0:  0c 94 46 00   jmp  0x8c
   4:  0c 94 63 00   jmp  0xc6
   8:  0c 94 63 00   jmp  0xc6
   c:  0c 94 63 00   jmp  0xc6
  10:  0c 94 63 00   jmp  0xc6
  14:  0c 94 63 00   jmp  0xc6
  18:  0c 94 63 00   jmp  0xc6
  1c:  0c 94 63 00   jmp  0xc6
  20:  0c 94 52 01   jmp  0x2a4
  24:  0c 94 63 00   jmp  0xc6
  28:  0c 94 63 00   jmp  0xc6
  2c:  0c 94 63 00   jmp  0xc6
  30:  0c 94 63 00   jmp  0xc6
  34:  0c 94 63 00   jmp  0xc6
  38:  0c 94 63 00   jmp  0xc6
  3c:  0c 94 63 00   jmp  0xc6
  40:  0c 94 63 00   jmp  0xc6
  44:  0c 94 63 00   jmp  0xc6
  48:  0c 94 63 00   jmp  0xc6
  4c:  0c 94 63 00   jmp  0xc6
  50:  0c 94 63 00   jmp  0xc6
  54:  0c 94 63 00   jmp  0xc6
  58:  0c 94 63 00   jmp  0xc6
  5c:  0c 94 63 00   jmp  0xc6
  60:  0c 94 63 00   jmp  0xc6
  64:  0c 94 63 00   jmp  0xc6
  68:  0c 94 63 00   jmp  0xc6
  6c:  0c 94 63 00   jmp  0xc6
  70:  0c 94 63 00   jmp  0xc6
  74:  0c 94 63 00   jmp  0xc6
  78:  0c 94 63 00   jmp  0xc6
  7c:  0c 94 63 00   jmp  0xc6
  80:  0c 94 63 00   jmp  0xc6
  84:  0c 94 63 00   jmp  0xc6
  88:  0c 94 63 00   jmp  0xc6

000000c6 <__bad_interrupt>:
  c6:  0c 94 00 00   jmp  0x0
**********************************************


Was hab ich falsch gemacht?

von mmerten (Gast)


Lesenswert?

0x20 ist schon richtig da bei allen AVR mit >8k FLASH die Einträge in
der Interrupttabelle 4 Byte lang sind, damit`s für nen jmp Befehl
reicht. Bei den "kleinen" reicht ja nen rjmp mit 2 Byte aus.

von peter dannegger (Gast)


Lesenswert?

"der Controler macht bei
Logikwechsel an dem enstrechenden Pin einen Restart!"


Typischer Falll für die M103-Fuse.


Peter

von Bernd (Gast)


Lesenswert?

Also das M103-Fuse-Bit hatte ich schon zurückgesetzt. Wenn ich das setze
funktioniert ja überhaupt nichts mehr...

Das gleiche Programm hab ich ja schonmal im Assembler geschrieben. Da
funktioniert es einwandfrei. Dort habe ich allerdings die
Interruptadresse 0x10 verwendet.

Muss ich vielleicht am Controller noch irgendetwas einstellen (zb.
Fuse-Bits oder irgendwelche Register)?

von Bernd (Gast)


Lesenswert?

Hey, es funktioniert.

Ich weiß zwar nicht, woran es lag. Aber es funktioniert jetzt.

Eigentlich hab nich nur nochmal spaßeshalber das M103-Fuse-Bit gesetzt.
Dann hat, wie zu erwarten war, gar nichts mehr funktioniert.

Nachdem ich es aber wieder zurückgesetzt hab, hat der Interrupt
plötzlich richtig ausgelöst...

Warum weiß ich nicht. An den anderen Fuse-Bits hab ich eigentlich
nichts verändert. Es sei den ich hab es nicht bemerkt, was ich mir aber
nicht vorstellen kann.

Trotzdem danke für eure Tips.

von DADA (Gast)


Lesenswert?

möchte eine EICRA programiieren nur bei fallender Flanke...Kann jemand 
bitte helfen?

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.