Forum: Mikrocontroller und Digitale Elektronik atmega 169 bootloader int problem


von blackfinn (Gast)


Lesenswert?

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.
von Krapao (Gast)


Lesenswert?

Auffällig:

> MCUCR = mcucr | (1 << IVCE);
> MCUCR = mcucr | (1 << IVSEL);

/* Enable change of interrupt vectors */
MCUCR = (1<<IVCE);
/* Move interrupts to boot flash section */
MCUCR = (1<<IVSEL);

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=69720&start=0
Dave Raymond 2008
von Mario G. (mario)


Lesenswert?

von Max (Gast)


Lesenswert?

kuk halt ma des hexfile, den lss output an und schau wo dein vektor is. 
könnte sein, dass der extra verschoben werden muss
von Mario G. (mario)


Lesenswert?

Tip: Falsche Bootloader-Adresse: Statt "-Ttext=0x1C00" versuche mal 
"-Ttext=0x3800"

Erklärung: 0x1C00 ist die Word-Adresse, der Linker braucht aber die 
Byte-Adresse, also 2 x 0x1C00 = 0x3800

habe ich alles im Artikel beschrieben.
alles klar?
Viel Spaß :)
von blackfinn (Gast)


Lesenswert?

Hallo,

's scheint die Adresse gewesen zu sein, wenn ich auf 0x3800 umstelle, 
dann gibt's keinen reset mehr (allerdings löst der interrupt auch nicht 
aus...)
ich schau halt noch 'n bisschen weiter...

Gr.
von blackfinn (Gast)


Lesenswert?

nee, ich hab' wohl noch 'n anderes Problem , der Interrupt löst aus, die 
Verdoppelung der Adresse hat's gebracht.

Vielen Dank,

Gr.
von Mario G. (mario)


Lesenswert?

Na also :)
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
Noch kein Account? Hier anmelden.