Hallo!
Ich versuche zurzeit den UsbAsp Bootloader
(http://www.obdev.at/products/avrusb/usbasploader.html) auf einem
Mega128 zum laufen zu kriegen.
Nach längerer Fehlersuche habe ich nun festgestellt, dass mein Problem
mit dem Verschieben der Interrupts zusammenhängt. Ich hab das Problem
auf folgenden Code reduziert:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | int main(void)
|
5 | {
|
6 | MCUCR = (1<<IVCE);
|
7 | MCUCR = (1<<IVSEL); //move interrupt vectors to bootloader section
|
8 |
|
9 | EICRA = (1<<ISC00)|(1<<ISC01);
|
10 | EIMSK = (1<<INT0); //enable int0
|
11 |
|
12 | PORTD = 0b11001100;
|
13 | DDRD = 0b11111100;
|
14 | sei();
|
15 |
|
16 | for(;;){}
|
17 | return 0;
|
18 | }
|
19 |
|
20 | ISR(INT0_vect)
|
21 | {
|
22 | PORTD+=1;
|
23 | }
|
Int0 wird vom Usb host getriggert, dass der Interrupt auch angesprungen
wird soll mir über LEDs die an PortD angeschlossen sind, angezeigt
werden.
Die fuses sind so gesetzt:
1 | BOOTSZ1 = 0
|
2 | BOOTSZ0 = 1
|
Damit habe ich ja einen 2k Bootbereich am Ende des Programmspeichers,
die Einsprungadresse wäre also laut Datenblatt 0xF800. So habe ich das
Programm auch linken lassen. Also mit der Option:
1 | -Wl,--section-start=.text=0xF800
|
Schau ich mir das Listing an, stehen dort auch die Interruptvektoren an
der korrekten Adresse:
1 | Disassembly of section .text:
|
2 |
|
3 | 0000f800 <__vectors>:
|
4 | f800: 0c 94 46 7c jmp 0xf88c ; 0xf88c <__ctors_end>
|
5 | f804: 0c 94 72 7c jmp 0xf8e4 ; 0xf8e4 <__vector_1>
|
6 | f808: 0c 94 65 7c jmp 0xf8ca ; 0xf8ca <__bad_interrupt>
|
7 | ...
|
Leider wird der Interrupt nicht angesprungen und ich habe langsam echt
keine Ideen mehr an was es liegen könnte.
Auch noch wichtig:
Linke ich das Programm ab der Adresse 0x0000 und Kommentiere die ersten
beiden Befehle (die den Interrupt verschieben) aus, funktioniert alles
wie erwartet.
Vielleicht kann mir jemand weiterhelfen.
Viele Grüsse
Michael