Forum: Mikrocontroller und Digitale Elektronik Attiny2313 Interrupt Tabelle ändern


von BesorgterBürger (Gast)


Lesenswert?

Hallo,

ich möchte mit dem Attiny einen Bootloader erstellen. Liegt der 
Bootloader am ende des Flash, hätte ich theoretisch keine Probleme mit 
dem Interrupt aber dafür startet der Bootloader nicht als erstes. Was 
für mich ein Problem ist.

Sitzt der Bootloader am Anfang des Flash sind natürlich die Interrupts 
für anschließendes Main Programm ungünstig da dann beim Bootloader 
wieder gestartet wird.

Um dem aus dem weg zu gehen, müsste ich die Interrupt Tabelle so 
anpassen, dass von dem jeweiligem Aufruf direkt zu der Interrupt Tabelle 
des Main Projektes gesprungen wird. Nun ist meine Frage, kann ich die 
Tabelle überhaupt anpassen oder gibt es dafür in Atmel Studio 7 eine 
option?

Auf folgende Adressen müssten gesprungen werden:
1
00000460 <__vectors>:
2
 460:  14 c0         rjmp  .+40       ; 0x48a <__ctors_end>
3
 462:  24 c0         rjmp  .+72       ; 0x4ac <__bad_interrupt>
4
usw..

Ich stelle mir den Aufruf so vor, dass von der Aufrufadresse des 
Interuppts in die Adresse der Interrupt Tabelle des Main Projekt 
gesprungen wird(oben):
1
0:    rjmp  0x460       ; <__ctors_end>
2
2:    rjmp  0x462       ; <__bad_interrupt>
3
usw..

BG
Bürger

von Falk B. (falk)


Lesenswert?

Dein Problem haben andere Leute sicher schon gelöst. Danach muss man 
suchen.

von H.Joachim S. (crazyhorse)


Lesenswert?

Machs wie alle anderen auch: Bootlader an's Ende, Reset-Vektor 
verbiegen.

von BesorgterBürger (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Machs wie alle anderen auch: Bootlader an's Ende, Reset-Vektor
> verbiegen.

Sowas hier?
1
temp = GICR;
2
GICR = temp | (1<<IVCE);
3
GICR = temp | (1<<IVSEL);

Gibts beim Attiny nicht. Ich habe auch keine andere "Verbieg" 
Möglichkeit gefunden.

von Dyson (Gast)


Lesenswert?

BesorgterBürger schrieb:
> Sowas hier?

Nein, du sollst den Reset Vektor verbiegen. Wie man das macht, steht in 
irgendeinem Tutorial über Bootloader.

von Peter D. (peda)


Lesenswert?

Wenn man ein Programm für den ATTiny compiliert, steht an 0x0000 ein 
RJMP zum Initcode der App. Diesen berechnet der Bootloader neu, damit er 
direkt vor dem Bootloader steht und schreibt einen RJMP zu sich selbst 
an 0x0000.
Will dann der Bootloader die App starten, springt er zu Bootloader-1.

von EAF (Gast)


Lesenswert?


von Peter D. (peda)


Lesenswert?

Der Bootloader kann keine Interrupts verwenden, hat ja in der Regel auch 
nichts super komplexes zu tun. Eigentlich dreht er nur Däumchen, bis 
irgendein Interface ihm das neue Hex der App schickt, d.h. kommt mit 
Polling bequem aus.

von Falk B. (falk)


Lesenswert?

Peter D. schrieb:
> Der Bootloader kann keine Interrupts verwenden,

Das will der OP gar nicht, es geht nur um den Reset.

von Stefan F. (Gast)


Lesenswert?

Einige AVR haben dafür die BOOTSZ Fuse. mann kann sie so einstellen, 
dass nach einem reset direkt der Bootloader am Ende des FLASH 
angesprungen wird.

Der ATtiny2313 kann das aber leider nicht.

von Falk B. (falk)


Lesenswert?

Stefan ⛄ F. schrieb:
> Der ATtiny2313 kann das aber leider nicht.

Wobei sich die Frage nach dem Sinn eines Bootloaders bei so einem 
kleinen Controller stellt. Mit 2kB Flash? Ein ATtiny85 hat immerhin 8kB 
und 128B RAM.

von BesorgterBürger (Gast)


Lesenswert?

Falk B. schrieb:
> Wobei sich die Frage nach dem Sinn eines Bootloaders bei so einem
> kleinen Controller stellt. Mit 2kB Flash? Ein ATtiny85 hat immerhin 8kB
> und 128B RAM.

Das ist richtig, viel ist nicht mehr frei. Theoretisch ist er aber 
kompatibel mit Attiny4313.

EAF schrieb:
> 
https://www.mikrocontroller.net/articles/Konzept_für_einen_ATtiny-Bootloader_in_C

Danke für den Link, mit dem ist meine frage Beantwortet (:

BG

von Sebastian W. (wangnick)


Lesenswert?

Vielleicht noch als Nachtrag: Um Platz zu sparen und die volle Kontrolle 
zu haben kann man auch noch die C-Variableninitialisierung 
(_do_copy_data, _do_clear_bss, -nostartfiles) entfernen. HTH.

LG, Sebastian

von Rainer V. (a_zip)


Lesenswert?

Peter D. schrieb:
> Wenn man ein Programm für den ATTiny compiliert, steht an 0x0000 ein
> RJMP zum Initcode der App. Diesen berechnet der Bootloader neu, damit er
> direkt vor dem Bootloader steht und schreibt einen RJMP zu sich selbst
> an 0x0000.
> Will dann der Bootloader die App starten, springt er zu Bootloader-1.

Auch wenn ich jetzt wieder geschlagen werde...wie kann man mit 
Bootloader (selbst geschrieben??) arbeiten, wenn man d a s nicht kapiert 
hat? Trotzdem danke ich dafür, dass das Szenario direkt umfassend in der 
Frage beschrieben wurde. Stelle mir gerade eine (katastrophale) Variante 
der Frage vor:
Hilfe, ich muß bei einem Attiny die Interrupttabelle verschieben. Ich 
weiß aber nicht wie...bin absoluter Anfänger :-)
Gruß Rainer

von H.Joachim S. (crazyhorse)


Lesenswert?

Wenn du das nicht kapierst wirst du auch keinen eigenen Bootlader 
zustande bringen. Zumindest nicht für die AVR-Typen die nicht von Hause 
aus dafür vorgesehen sind.
Warum willst du es überhaupt nochmal selbst machen? Hier gibts irgendwo 
einen langen trööt (fastload). Das funktioniert, ist kompakt und lässt 
sich leicht auf alle möglichen Typen und benutzte Pins einstellen.

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.