mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Interrupt im Bootloader


Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe eine Problem mit dem Interrupt im selbst geschriebenen 
Bootloader...

Es sieht so aus, also ob der ATMega640 resetet sobald ein interrupt 
auslösst...

Wenn ich den Bootloader auf Startadresse 0 ins Flash schreibe 
funktioniert alles mit den interrupts. Schreibe ich den Bootloader aber 
in den defür vorgehenen Bereich im Flash (mit 
-Wl,--section-start=.text=0x7000) auf die adresse 0x7000, resetet er 
sich immer...

gemäss Datanblatt hab ich die rücksprungadresse der interrupts in den 
Bootloaderbereich verschoben mit:
MCUCR = SpeichereMCUCRL |(1<<IVCE);
MCUCR = SpeichereMCUCRL |(1<<IVSEL);

Um timingfehler beim setzen von IVSEL Auszuschliessen habe ich die 
Optimierung im Compiler ausgeschaltet...


wenn ich versuchsweise eine endlosschleife im interrupt mache, resetet 
der ATMega trotzdem... sprich es sieht so aus, als ob dieser die ISR nie 
durchläuft... (BOOTRST Bit ist entsrpchende gesetzt)


Jemand eine Idee was ich falsch mache?

Autor: nicht "Gast" (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
liegen die Interruptsprungbefehle auch wirklich im richtigen Bereich?

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich mich erinnere, ist der Boot Loader immer auf Null. Die 
Interrupts muessen natuerlich auch auf Null sein. Der andere Bereich ist 
ja ueberschreibbar.

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>nicht "Gast" (Gast)
>>liegen die Interruptsprungbefehle auch wirklich im richtigen Bereich?

Wie kann ich das überprüfen? meine das legt ja der compiler fest nicht 
ich selbst...

@Dürrer Zitterknilch
ne stimmt nicht, bei 0 begint die application selection, die 
bootloaderselection beginnt nach fuse einstellungen an einer 
entsprechende Adresse...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erich schrieb:
> Wie kann ich das überprüfen?

Ins Assembler-Listing schauen (*.lss).


Peter

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe mal das *.lss file angeschaut und meine abscheu gegen simulatoren 
überwunden und das ganze kurz simuliert...

ganz klar ist mir das ganze jedoch trotzdem noch nicht...

meine vorherige feststellung, dass der interrupt gar nicht druflaufen 
wird hat sich als richtig erwiesen. sobald ein interrupt ausgelöst wird, 
spricht das programm auf die adresse 0x7000.

Der Simulator gibt die Warnung: "invalide oppcode at adress 0x007002" 
heraus.

Im Simulator ist mir aufgefallen, dass mein Code zwar im *.hex file wie 
gewünscht bei der startadresse 0x7000 beginnt, im dissasmbler file im 
simulator jedoch bei der adresse 0x0000...

wenn ich im *.lss file schaue steht da
00007000 <__vectors>:
    7000:  0c 94 72 38   jmp  0x70e4  ; 0x70e4 <__ctors_end>
    7004:  0c 94 a3 39   jmp  0x7346  ; 0x7346 <__vector_1>
    7008:  0c 94 8f 38   jmp  0x711e  ; 0x711e <__bad_interrupt>
    700c:  0c 94 8f 38   jmp  0x711e  ; 0x711e <__bad_interrupt>
    7010:  0c 94 8f 38   jmp  0x711e  ; 0x711e <__bad_interrupt>

wenn ich mit dem datenblatt vergleiche, fällt mir auf, dass der INT0 den 
ich verwende hier oben auf adresse 0x7004 ist, im datenblatt aber auf 
0x7002 (Ausschnitt aus dem Datenblatt Seite 105) "2 $0002 INT0 External 
Interrupt Request 0")

Hat jemand eine idee was genau ich falsch mache?

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
woran liegt dass, dass mein programm im simulator bei 0x3800 beginnnt, 
obwohl es laut *.lss und *.hex bei 0x7000 beginnt (wie gewollt). 0x3800 
wäre genau die hälfte... bei einem interrupt der siulator jedoch auf die 
eigentilch richtige adresse von über 0x7000 hmmm

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
im .lss und .hex File steht die Byteadresse, da der Speicher aber zu 
16Bit organisiert ist, zeigt der Dissassembler des Simulators die 
entsprechende Wordadresse an. Damit erklärt sich auch die 'verschiebung' 
des INT0 0x0002(Word)=0x0004(Byte)

Sascha

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha Weber schrieb:
> ... da der Speicher aber zu
> 16Bit organisiert ist, zeigt der Dissassembler des Simulators die
> entsprechende Wordadresse an.

Das ist die richtige Fährte. Der Bootloader muss bei BOOTSZ1 = 0 und 
BOOTSZ0 = 0 an die "Wordadresse" 0x7000.
frank

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie man den Wald vor lauter Bäumen manchmal nicht sehen kann...
das wars natürlich, besten dank Erich

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.