www.mikrocontroller.net

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


Autor: Michael Betz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
  MCUCR = (1<<IVCE);
  MCUCR = (1<<IVSEL);  //move interrupt vectors to bootloader section

  EICRA = (1<<ISC00)|(1<<ISC01);
  EIMSK = (1<<INT0);    //enable int0

    PORTD = 0b11001100;
    DDRD = 0b11111100;
    sei();

    for(;;){}
    return 0;
}

ISR(INT0_vect)
{
  PORTD+=1;
}

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:
BOOTSZ1 = 0
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:
-Wl,--section-start=.text=0xF800

Schau ich mir das Listing an, stehen dort auch die Interruptvektoren an 
der korrekten Adresse:
Disassembly of section .text:

0000f800 <__vectors>:
    f800:  0c 94 46 7c   jmp  0xf88c  ; 0xf88c <__ctors_end>
    f804:  0c 94 72 7c   jmp  0xf8e4  ; 0xf8e4 <__vector_1>
    f808:  0c 94 65 7c   jmp  0xf8ca  ; 0xf8ca <__bad_interrupt>
...

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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BOOTRST?

Autor: Michael Betz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Betz (betz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Betz (betz)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael Betz (betz)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Betz (betz)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.