mikrocontroller.net

Forum: Compiler & IDEs Winavr + Bootloader + Interrupt


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem wenn ich einen Bootloader und den Interrupts. 
Starte ich das Programm ausserhalb des Bootloaders funktioniert es 
einwandfrei.
Sobald ich das aber in den Bootloader verschiebe werden die Interrupts 
nicht mehr ausgeführt. Zum Testen habe ich
mir ein kleines PRogramm geschrieben, dass bei Einsprung in die 
Interruptroutine die Leds einschaltet.

Das Programm beinhaltet die Verschiebung in den Bootloaderbereich mit
GICR = (1<<IVCE)
GICR = (1<<IVSEL)

Den Interrupt habe ich folgendermaßen aktiviert:
SIGNAL(SIG_INTERRUPT0)     
/* signal handler for external interrupt int0 */
{
    led++;
    PORTB = 0xAA;
}


DDRD  = 0x00;                
PORTD = 0xFF;            

GICR |= (1<<INT0)

Ausserdem wird es compiliert mit der Option 
"-Wl,--section-start=.text=3800".

Ebenfalls habe ich das Programm dann noch so compiliert:
"-Wl,--section-start=.text=3800 -nostartfiles -nodefaultlibs"

Dabei habe ich dann folgende Routine aus Peter Fleurys Bootloader 
verwendet:
/*
 * since this bootloader is not linked against the avr-gcc crt1 functions,
 * to reduce the code size, we need to provide our own initialization
 */
void __jumpMain     (void) __attribute__ ((naked)) __attribute__ ((section (".init9")));

void __jumpMain(void)
{    
    asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );
    asm volatile ( "clr __zero_reg__" );                       // GCC depends on register r1 set to 0
    asm volatile ( "out %0, __zero_reg__" :: "I" (_SFR_IO_ADDR(SREG)) );  // set SREG to 0
    asm volatile ( "rjmp main");                               // jump to main()
}

Alles erfolglos.

Ich glaube aber, daß ich irgendwelche Parameter bei WinAvr noch setzen 
muss.
Aber welche?

Der Controller ist ein Atmega16.

Danke im Voraus für jeden Hinweis.


Andreas

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt. Den entscheidenden Hinweis habe ich im avrfreaksforum 
erhalten. Dort hatte jemand dasselbe Problem.

Es lag an der Optimierung. Ich hatte eingestellt "-O0". Damit ging es 
nicht. Habe es jetzt mit "-O1" und "-Os" getestet. Damit läuft es jetzt.

Wäre nett wenn mir jemand mal den Unterschied erklären könnte.

Danke

Andreas

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas wrote:

> Wäre nett wenn mir jemand mal den Unterschied erklären könnte.

Naja, ohne Optimierung ist der Code halt sauumständlich.  Wenn du
jetzt irgendwelche Timing-Sachen da drin hast (zweimal hintereinander
auf ein Register schreiben zum Beispiel), dann hat der nicht
optimierte Code noch einen Haufen anderer Befehle dazwischen.  Guck's
dir doch einfach an.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.

Ich ahne schon das es hieran liegen wird.
GICR = (1<<IVCE)
GICR = (1<<IVSEL)

Da wird wohl irgendwas passiert sein. Werde es mir bei gelegenheit mal 
ansehen.

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.