Hallo,
ich habe ein Problem wenn ich einen Bootloader und den Interrupts.
Starte ich das Programm ausserhalb des Bootloaders funktioniert es
einwandfrei.
Sobald ich das aber in den Bootloader verschiebe werden die Interrupts
nicht mehr ausgeführt. Zum Testen habe ich
mir ein kleines PRogramm geschrieben, dass bei Einsprung in die
Interruptroutine die Leds einschaltet.
Das Programm beinhaltet die Verschiebung in den Bootloaderbereich mit
1 | GICR = (1<<IVCE)
|
2 | GICR = (1<<IVSEL)
|
Den Interrupt habe ich folgendermaßen aktiviert:
1 | SIGNAL(SIG_INTERRUPT0)
|
2 | /* signal handler for external interrupt int0 */
|
3 | {
|
4 | led++;
|
5 | PORTB = 0xAA;
|
6 | }
|
7 |
|
8 |
|
9 | DDRD = 0x00;
|
10 | PORTD = 0xFF;
|
11 |
|
12 | GICR |= (1<<INT0)
|
Ausserdem wird es compiliert mit der Option
"-Wl,--section-start=.text=3800".
Ebenfalls habe ich das Programm dann noch so compiliert:
"-Wl,--section-start=.text=3800 -nostartfiles -nodefaultlibs"
Dabei habe ich dann folgende Routine aus Peter Fleurys Bootloader
verwendet:
1 | /*
|
2 | * since this bootloader is not linked against the avr-gcc crt1 functions,
|
3 | * to reduce the code size, we need to provide our own initialization
|
4 | */
|
5 | void __jumpMain (void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
|
6 |
|
7 | void __jumpMain(void)
|
8 | {
|
9 | asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );
|
10 | asm volatile ( "clr __zero_reg__" ); // GCC depends on register r1 set to 0
|
11 | asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) ); // set SREG to 0
|
12 | asm volatile ( "rjmp main"); // jump to main()
|
13 | }
|
Alles erfolglos.
Ich glaube aber, daß ich irgendwelche Parameter bei WinAvr noch setzen
muss.
Aber welche?
Der Controller ist ein Atmega16.
Danke im Voraus für jeden Hinweis.
Andreas