Gast
#77215
Hallo, ich bin gerade über einen Bootloader für einen Mega16. Soweit funktioniert alles. Der Bootloader (primitiv, ohne Interrupts) funktioniert und startet auch die normale Applikation. Jetzt will ich aber im Bootloader Interrupts verwenden (Timer, Usart). Die Interrupt-Vektortabelle hab ich in den Bootloader Bereich verschoben, kann ich auch aus dem Map-File lesen. Ohne die globale Interruptfreigabe läuft der Bootloader ganz normal. Das kan nich an einer blinkenden LED erkennen. Wenn ich aber die Interrupts freigebe, scheint es, als ob er beim ersten Timer-Interrupt ins Nirvana läuft (LED-blinkt nicht mehr). Ich habe mich schon durch verschieden Threads hier gelesen, doch leider bekomme ich es dadurch auch nicht zum Laufen. #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include "main.h" #define FCPU 14745600 #define TIMER_LOAD ((unsigned char) (256 - ((FCPU / 64) * 0.001))) // 1ms-Timer void main(void) { static volatile unsigned int i, j, k; cli(); // Interrupts sperren GICR = 0x01; // Interrupt Vektoren in den Bootloader bereich verschieben GICR = 0x02; TIMSK = (1<<TOIE0); //Timer 0 Overflow Interrupt aktivieren TCNT0 = TIMER_LOAD; //Timer 0 Startwert setzen TCCR0 = 3; //Timer 0 Prescaler = 64 -> Timer Taktfrequenz = FCPU / 64 DDRB = 0x07; PORTB |= 0x07; // sei(); // Interrupts freigeben PORTB &= ~0x02; // LED 2 einschalten while(1) { for(j=0; j<10; j++) // 10 Mal { k = 0; // warten for(i=0; i<50000; i++) k++; if(PORTB & 0x01) // LED 1 toggeln PORTB &= ~0x01; else PORTB |= 0x01; } PORTB |= 0x02; // LED 2 ausschalten k = 0; // warten for(i=0; i<65000; i++) k++; StartApp(); // Applikation starten } } void StartApp(void) { GICR = 0x01; // Interrupt Vektoren ins Flash verschieben GICR = 0x00; asm volatile ("push r1" "\n\t" "push r1" "\n\t" "ret" "\n\t" ::); } SIGNAL(SIG_OVERFLOW0) { PORTB &= ~0x04; // LED 3 einschalten } Kann mir irgendwer Tipps geben? Gruß Manuel