Hallo,
ich habe ein hier bereits öfter beschriebenes Problem. Ich habe für
meinen Atmega169 einen Bootloader geschrieben. Der soll einen externen
Interrupt benutzen. wenn der Interrupt auslöst, wir nicht die ISR,
sondern ein RESET ausgelöst. ich vermute, dass bei der Adressierung
etwas schief läuft, finde jedoch nicht das Problem.
Zu meiner Configuration:
Fuses:
1 | BOOTSZ1 = 0
|
2 | BOOTSZ0 = 0
|
3 | BOOTRST = 0
|
Laut Tabelle 113 auf Seite 264 im Datenblatt habe ich so 1024 words,
also 2048 bytes oberhalb von addr 0x1C00. Deshalb gebe ich dem Linker
"-Ttext=0x1C00" mit (Ich benutze den avr-gcc).
Der Code ist kleiner als 2k und läuft auch an.
Das Umrouten der Interruptvektoren mache ich mit folgendem Code:
1 | uint8_t sreg = SREG;
|
2 | cli();
|
3 | uint8_t mcucr = MCUCR;
|
4 | MCUCR = mcucr | (1 << IVCE);
|
5 | MCUCR = mcucr | (1 << IVSEL);
|
6 | SREG = sreg;
|
7 | sei();
|
Der externe Interrupt wird mit
1 | DDRD &= ~(1 << DDD1);
|
2 | PORTD |= (1 << PD1);
|
3 | EICRA = 0;
|
4 | EICRA |= (1 << ISC01);
|
5 | EIMSK = 0;
|
6 | EIMSK |= (1 << INT0);
|
initialisiert, die ISR sieht folgendermaßen aus:
1 | ISR(INT0_vect) {
|
2 | switch (m_radio_mode) {
|
3 | case RADIO_MODE_RX:
|
4 | m_rx_active = true;
|
5 | break;
|
6 |
|
7 | case RADIO_MODE_TX:
|
8 | m_tx_active = false;
|
9 | break;
|
10 | }
|
11 | }
|
Wenn ich das als "normale" Application baue, dann läuft's, jedoch im
Bootloader mode schmiert's mit dem eintreffenden Interrupt ab. Jemand
'ne Ahnung, was ich da falsch mache?
Gr.