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.