Forum: Mikrocontroller und Digitale Elektronik Tiny1 Serie Bootloader Segmentierung Flash geht nicht?


von Markus M. (atmelfreak100)


Lesenswert?

Guten Tag,

ich versuche mich gerade am Bootloader für die "neuen" Tiny1 Serie (hier 
Tiny3217).

Ich habe das Programm fertig und es funktioniert. Jetzt wollte ich es 
über flash segmentierung auf .text=0x100 setzen. Technisch geht das 
auch, Flash fängt jetzt mit dem Programm entsprechend an, aber das 
Programm funktioniert nicht mehr richtig.

Interrupts gehen gar nicht mehr
Inputs von Tastern geht auch nicht mehr
Das einzige was noch geht ist ADC und DAC Ausgabe (hier ist ADC geht auf 
den Dac mit Umrechnung).

Kann mir jmd sagen was ich falsch mache?

von S. L. (sldt)


Lesenswert?

Verstehe ich es richtig: da sitzt der (recht kompakte) Bootloader von 
0x0000 bis 0x00FF, das Anwenderprogramm (mit seinen Interrupts) beginnt 
bei 0x0100, und die Fuse BOOTEND steht auf 0x01?

PS:
Das sind Byte-Adressen; ich hätte 0x0000...0x007F resp. 0x0080 schreiben 
sollen.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Markus M. schrieb:
> Interrupts gehen gar nicht mehr

Dann ist was falsch konfiguriert.
Der Linker muß wissen, wo die Applikation beginnt.
Und natürlich muß auch FUSE.BOOTEND entsprechend gesetzt werden.

von Markus M. (atmelfreak100)


Lesenswert?

S. L. schrieb:
> Verstehe ich es richtig: da sitzt der (recht kompakte) Bootloader
> von
> 0x0000 bis 0x00FF, das Anwenderprogramm (mit seinen Interrupts) beginnt
> bei 0x0100, und die Fuse BOOTEND steht auf 0x01?
>
> PS:
> Das sind Byte-Adressen; ich hätte 0x0000...0x007F resp. 0x0080 schreiben
> sollen.

Danke für die Antwort.

es ist 0x100 nicht 0x0100!
Der Tiny3217 hat keine BOOTEND Fuses. Oder habe ich die übersehen?!

von Markus M. (atmelfreak100)


Lesenswert?

Peter D. schrieb:
> Markus M. schrieb:
>> Interrupts gehen gar nicht mehr
>
> Dann ist was falsch konfiguriert.
> Der Linker muß wissen, wo die Applikation beginnt.
> Und natürlich muß auch FUSE.BOOTEND entsprechend gesetzt werden.

Danke für die Antwort.

Der Tiny3217 hat keine BOOTEND Fuses. Oder habe ich die übersehen?!
Können Sie mir sagen was ich noch einstellen muss? Linker ?!
Also in den Settings vom Atmel Studio

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Markus M. schrieb:
> Der Tiny3217 hat keine BOOTEND Fuses.

von Peter D. (peda)


Lesenswert?


von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> es ist 0x100 nicht 0x0100!
?
  Was stört an der führenden Null?

> Der Tiny3217 hat keine BOOTEND Fuses.
Au contraire!
  Von deren Einstellung hängt nämlich ab, wo im Flash der 
Interruptvektoren-Bereich liegt (s.a. 'Memory Map'):
> Interrupts gehen gar nicht mehr

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

Markus M. schrieb:
> Also in den Settings vom Atmel Studio

APPEND
BOOTEND

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> Der Tiny3217 hat keine BOOTEND Fuses.

Wenn ich noch nachtragen darf - ein CTRL-F im Datenblatt mit 'BOOTEND' 
bringt u.a. dieses Bild.

von Georg M. (g_m)


Lesenswert?


von Markus M. (atmelfreak100)


Lesenswert?

Danke für die Infos. Bootend habe ich in der Tat übersehen, verrückt.

Dennoch verstehe ich es noch nicht so ganz.
Mein Bootloader ist 2048 byte groß. Im .text gibt man ja Byteadressen 
an.

Jetzt die Fragen:

1. Flash muss bei .text=0x0800 sein muss oder? Sprich Appdata fängt bei 
0x800 an.

2. Bootend ist auf 8 zu setzen (2048/256 = 8)

=> An diesem Punkt geht erstmal noch genauso wenig wie vorher.
(Aktuell ist kein Bootloader drauf, sondern nur das Programm, heißt es 
startet bei 0x0800. Das sollte ja nicht stören da die Zellen davor FF 
haben und er da einfach "durchrutscht" bis er beim Programm landet).

=> Zu den IVSEL, das müsste dann auf 1 gesetzt werden? Verstehe ich 
nicht wirklich, m.E. muss das auf 0 bleiben, da der Bootloader ein 
separates Atmel Studio Projekt ist was dann ab 0 den Speicherplatz 
belegt.

Später setze ich die 2 generierten .hex Files einfach zusammen. So mache 
ich es aktuell bei den Xmega/Mega die aber eine richtige Bootsection (am 
ende des flashes) haben und das funktioniert gut.

Ich habe in das Programm folgendes gemacht am Start (nach dem CLKCTRL 
Settings)
1
CPU_CCP = 0xD8;
2
  CPUINT_CTRLA = CPUINT_IVSEL_bm;

Wirklich ändern tut sich nichts. ?!
Irgendwas mache ich falsch

von S. L. (sldt)


Lesenswert?

> IVSEL ... m.E. muss das auf 0 bleiben

Dem schließe ich mich an, denn:
"0: Interrupt vectors are placed at the start of the application section 
of the Flash".
Und weil dies der Reset-Wert ist, CPUINT_CTRLA gar nicht anfassen.
(Dass ich die entsprechende Seite anhängte, sollte nur den Einfluss von 
FUSE.BOOTEND zeigen)

> ... da die Zellen davor FF haben ...

Da wäre ich nicht so sicher - vorher vielleicht ein Chip-Erase 
durchführen.

von Markus M. (atmelfreak100)


Lesenswert?

S. L. schrieb:
>> IVSEL ... m.E. muss das auf 0 bleiben
>
> Dem schließe ich mich an, denn:
> "0: Interrupt vectors are placed at the start of the application section
> of the Flash".
> Und weil dies der Reset-Wert ist, CPUINT_CTRLA gar nicht anfassen.
> (Dass ich die entsprechende Seite anhängte, sollte nur den Einfluss von
> FUSE.BOOTEND zeigen)
>
>> ... da die Zellen davor FF haben ...
>
> Da wäre ich nicht so sicher - vorher vielleicht ein Chip-Erase
> durchführen.

Ich verstehe das leider nicht und hoffe wirklich auf Hilfe. Der rest ist 
leer (FF), erase passiert immer vor dem neu flashen.

Ich habe jetzt folgendes gemacht:
1. .text section angelegt unter Toolchain/Memory Settings
2. Toolchain/General "Do not use standard start files" aktiviert.

Jetzt passiert was richtig verrücktes. Mein Programm (20kb) besteht nur 
noch aus 4 HEX Zeilen. ?! Warum generiert er das denn jetzt so?!

Bootend so gesetzt wie beschrieben
Append 0 gelassen

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

> ... Toolchain ...

Da kann ich leider nicht weiterhelfen - ich programmiere in Assembler 
und verwende (ausschließlich) ein Eigenbauprogrammiergerät.

Bei mir läuft (auf einem ATtiny1614): ein Einfachstblinkprogramm (per 
TCB0_INT_vect) ab 0x0400 (Wortadresse), FUSE.BOOTEND=8.

> Der rest ist leer (FF), erase passiert immer vor dem neu flashen.

Da sind Sie sicher? Ist nämlich bei den 'neueren' nicht zwingend, im 
Gegensatz zu den 'alten' AVR8.

PS:
Ich würde in dieser Anfangsphase auch nicht mit einem 20 kB-Programm 
arbeiten - vielleicht finden Sie im Anhang eine Anregung für etwas 
Einfaches.

: Bearbeitet durch User
von Markus M. (atmelfreak100)


Lesenswert?

S. L. schrieb:
>> ... Toolchain ...
>
> Da kann ich leider nicht weiterhelfen - ich programmiere in Assembler
> und verwende (ausschließlich) ein Eigenbauprogrammiergerät.
>
> Bei mir läuft (auf einem ATtiny1614): ein Einfachstblinkprogramm (per
> TCB0_INT_vect) ab 0x0400 (Wortadresse), FUSE.BOOTEND=8.
>
>> Der rest ist leer (FF), erase passiert immer vor dem neu flashen.
>
> Da sind Sie sicher? Ist nämlich bei den 'neueren' nicht zwingend, im
> Gegensatz zu den 'alten' AVR8.
>
> PS:
> Ich würde in dieser Anfangsphase auch nicht mit einem 20 kB-Programm
> arbeiten - vielleicht finden Sie im Anhang eine Anregung für etwas
> Einfaches.

Danke für die Hilfe. Ich habe den Fehler gefunden, was ein Quark 
meinerseits.
Bootloader ist 2048 bytes / 256 (scale of bootend) = 8. Also BOOTEND 
fuse auf 8 (boot section startet bei 0x800.

Bei .text im Atmel Studio muss man aber Wordadresse angeben (also 0x800 
/ 2 = 0x400) und schon geht alles!


Machen Sie auch große Programmer in Assembler? Ich finde das wird sehr 
sehr schnell super unübersichtlich, oder?

von S. L. (sldt)


Lesenswert?

> Fehler gefunden
Das freut mich.

> ... Assembler ...
Ist vielleicht in erster Linie eine Frage der Gewöhnung.
  Das Programm für besagtes Programmiergerät zum Beispiel hat knapp 10 
kB (ohne die Tabellen).

von Peter D. (peda)


Lesenswert?

Markus M. schrieb:
> Machen Sie auch große Programmer in Assembler? Ich finde das wird sehr
> sehr schnell super unübersichtlich, oder?

Ich hatte mit dem 8051 (AT89S8253) erst in Assembler angefangen. Ich war 
bei fast 8kB Flash, aber es war noch nicht fertig. Ich habe es dann 6 
Monate liegen lassen und als ich weiter machen wollte, merkte ich, ich 
hab den Durchblick völlig verloren.
In der Firma war aber eine Lizenz des Keil C51 verfügbar und so habe ich 
damit gearbeitet. Es ist mir sprichwörtlich die Kinnlade runtergefallen, 
so kompakt und effizient hat der Herr Keil programmiert. Ich konnte das 
Projekt nun problemlos beenden und es war weiterhin wartbar. Viele 
Funktionen waren kleiner und schneller, als mein altes 
Assemblergebastel. Durch die Overlaytechnik wurde auch der SRAM deutlich 
sparsamer genutzt.

: Bearbeitet durch User
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.