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?
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.
"der Controler macht bei Logikwechsel an dem enstrechenden Pin einen Restart!" Typischer Falll für die M103-Fuse. Peter
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)?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.