Forum: Mikrocontroller und Digitale Elektronik Mega128: Verschobene Interrupts werden nicht angesprungen


von Michael Betz (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

BOOTRST?

von Michael Betz (Gast)


Lesenswert?

Ups hab ich vergessen:
BOOTRST = 0
also das Program läuft schon, ich seh auch das Bitmuster von PORTD = 
0b11001100;
Nur eben der Interrupt wird nicht ausgelöst.

von Andreas K. (a-k)


Lesenswert?

Und woher weisst du, dass INT0 ausgelöst werden sollte? Was hängt da 
dran? Immerhin programmierst du den auf die steigende Flanke, was bei 
IRQs eher selten ist.

von Michael B. (betz)


Lesenswert?

An Int0 hängt die D+ Leitung vom USB dran, also von meinem PC.
Beim Aus- und wieder Einstecken sollte auf jedenfall mehrmals ein 
Interrupt ausgelöst werden.
Da bin ich mir sicher, weil:

Wenn ich das Programm ganz normal ab Adresse 0x0000 linken lasse
&
die Interrupts nicht verschiebe, also die ersten beiden Zeilen des main 
Programms auskommentiere

Blinken meine Leds die an PortD angeschlossen sind.

von Michael B. (betz)


Lesenswert?

Jemand eine Idee?

Finde das Verhalten vom Avr echt nicht Plausibel, mir gehen aber langsam 
auch die Ideen aus wo der Fehler liegen könnte.

Viele Grüsse!

von Michael B. (betz)


Lesenswert?

Simulieren mit AVRStudio 4 geht leider auch nicht.

Ich weis leider nicht wo ich die Fusebits im Simulator einstellen kann, 
deshalb startet er die Simulation bei 0x0000 und liefert dann 
entsprechend unsinnige Ergebnisse bzw. den Fehler "invalid opcode at 
0x0000".

Bin für jede Idee, wie ich dem Interrupt Problem auf die Schliche kommen 
könnte dankbar.

von Michael B. (betz)


Lesenswert?

Okay, hab das Problem gefunden und das USBaspLoader Projekt nun 
erfolgreich auf einem mega128 laufen.

Für alle die ähnliches vorhaben:

Der Fehler mit den Interrupts trat auf weil Atmel die Einsprungadresse 
im Datenblatt in words angegeben hat, der Linker erwartet diese Adresse 
allerdings in Byte, deshalb muss die Angabe im Datenblatt *2 genommen 
werden.

Ich habe auch rausgefunden, dass man in AvrStudio einen Bootloader 
simulieren kann, unter dem Punkt Simulatoreinstellungen lässt sich die 
Einsprungadresse einstellen.

Damit das UsbBaspLoader Projekt läuft musste ich auserdem noch Avr-Usb 
anpassen, da der Treiber nicht mehr in der Lage war die Usb descriptor 
strings zu Adressieren (die befinden sich alle im oberen 64k Teil des 
Programmspeichers). Also es wurde pgm_read_byte(...) durch 
pgm_read_byte_far(...) ersetzt.

Vielleicht hilfts ja jemand
Schönen Sonntag noch!

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.