Forum: Mikrocontroller und Digitale Elektronik MPLAB IPE + Snap + AVR-Asm, wie Fuses setzen?


von Johannes Fe (jofe)


Lesenswert?

Hallo allerseits,

ich verzweifle gerade an der (selbst gestellten) Aufgabe, mein MPLAB 
Snap mittels der MPLAB IPE und einer per avrasm2 erzeugten Hex-Datei 
dazu zu bringen, Fuse-Bytes auf einem angeschlossenen ATtiny3227 zu 
schreiben.

Was ich bisher versucht habe:
1
.dseg
2
.org FUSE_BODCFG
3
.db 0x40 ; 2.6 V
4
.org FUSE_OSCCFG
5
.db 0x7D ; 16 MHz
6
.cseg
am Anfang der Assembler-Quelldatei; avrasm2 warnte, die Adressen seien 
außerhalb des SRAM-Bereichs; das erzeugte Hex habe ich mittels MPLAB IPE 
in den tiny3227 geladen, allerdings ohne Erfolg, die Taktfrequenz 
(mittels aktiviertem CLKOUT gemessen) liegt immer noch bei 3,33 MHz (= 
factory-default 20 MHz mit factory-default 1/6-Prescaling).

Nach Informationen der Microchip-Website
https://developerhelp.microchip.com/xwiki/bin/view/software-tools/ides/x/debugging/view-set-configuration-bits/
lassen sich die Fuses in der MPLAB X IDE im Fenster "Configuration Bits" 
einstellen und daraus C-Code generieren (#pragma config ...), allerdings 
eben nur in C-Projekten und nicht mit (von MPLAB X scheinbar nicht mehr 
unterstütztem) Assembler.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Johannes Fe schrieb:

> ich verzweifle gerade an der (selbst gestellten) Aufgabe, mein MPLAB
> Snap mittels der MPLAB IPE und einer per avrasm2 erzeugten Hex-Datei
> dazu zu bringen, Fuse-Bytes auf einem angeschlossenen ATtiny3227 zu
> schreiben.

Das geht auch schlicht und einfach nicht. Du kannst in einer Hex-Datei 
keine Fuses unterbringen. Das kannst du nur in Elf-Dateien. Und die kann 
avrasm2 nicht erzeugen. Naja, jedenfalls nicht von Hause aus. Man kann 
es ihm beibringen, aber das ist doch eher mühsam und alleine kann er es 
dann immer noch nicht, man braucht mindestens ein zusätzliches Tool, um 
das erzeugte Hexfile dann nachträglich in ein binäres File zu 
verwandeln. Das darf dann allerdings strohdumm sein, braucht wirklich 
nur 1:1 umzuwandeln.

Der Witz bei der ganzen Sache ist: auch das Elf-Format verwendet im 
Prinzip nur einen Trick, um sowas wie Fuses (oder Sigrow oder...) zu 
ermöglichen. Dieser Trick funktioniert nur per Konvention. Einen echten 
physikalischen Hintergrund hat die Sache nicht. Der Trick ist: Es wird 
einfach völlig willkürlich ein Speicherbereich (weit außerhalb des 
Flashbereichs) zum Träger der Fuse-Informationen bestimmt. Der 
Generator (also der Linker) kennt den, die Brenntools kennen den und so 
kann das funktionieren. Das Brenntool trifft halt auf diesen 
Speicherbereich und weiß: Aha, das sind jetzt Fuses, die muß ich dem 
Target auf andere Weise verklickern als den Flashinhalt.

Dasselbe Grundprinzip hätte man auch für Hexfiles verwenden können. Aber 
es gab halt hierfür nie eine ensprechende Konvention. Deswegen kann's 
der avrasm2 nicht erzeugen und kein Brenntool könnte es brennen.

von Johannes Fe (jofe)


Lesenswert?

Ob S. schrieb:
> Du kannst in einer Hex-Datei
> keine Fuses unterbringen.

Ja stimmt, in der Hex-Datei ist ja wohl nur der Code-Space enthalten, 
nicht der gesamte Data-Space ... Denkfehler meinerseits. Kenne mich mit 
diesen Dingen auch zugegebenermaßen noch nicht besonders aus.

Dann muss ich mich wohl nun erstmal damit beschäftigen, wie ich dem XC8 
meine Assembler-Quellen füttern kann ...

: Bearbeitet durch User
von Dirk F. (dirkf)


Lesenswert?

Ob S. schrieb:
> Das geht auch schlicht und einfach nicht. Du kannst in einer Hex-Datei
> keine Fuses unterbringen.

Falsch. In von MPLABX erzeugten HEX files sind fuse bit setting drin.
https://microchip.my.site.com/s/article/Creating-production-file-for-AVR-devices-using-MPLAB-X-IDE

: Bearbeitet durch User
von Johannes Fe (jofe)


Angehängte Dateien:

Lesenswert?

Es sieht so aus, als ob die zu schreibenden Fuse Bytes von MPLABX am 
Ende der Hex-Datei abgelegt werden; siehe dazu die angehängten Dateien 
eines Minimal-C-Projekts (in Zeile 23 der *.hex finden sich die 
Fuse-Werte wieder). Scheint aber nicht offiziell dokumentiert zu sein, 
wie genau das codiert ist, zumindest habe ich nichts dazu gefunden.

Also: Work-around für mich wird erstmal sein, pro Device ein 
"Dummy"-C-Projekt (Main-Funktion mit Endlosschleife) zu erstellen, darin 
die gewünschten Fuse-Werte zu deklarieren, das ganze zu compilieren und 
die resultierende Hex in die IPE zu laden, um die Fuses zu schreiben. 
Beim anschließenden Flashen einer nicht-inhaltsleeren Firmware sollten 
die vorher geschriebenen Fuses ja erhalten bleiben.

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Das sind diese beiden Zeilen hier:
(der besseren Lesbarkeit wegen habe ich Leerzeichen eingefügt

:02 0000 04 0082 78

Das ist der "record type" 'Extended linear Address', für folgende Bytes 
wird als MSW der Adresse 0x0082 verwendet

:09 0000 00 00547E0000F6FF0000 30

Die Werte kommen einem bekannt vor:
1
FUSES = {
2
  .WDTCFG = 0x00, // WDTCFG {PERIOD=OFF, WINDOW=OFF}
3
  .BODCFG = 0x54, // BODCFG {SLEEP=DIS, ACTIVE=ENABLED, SAMPFREQ=125HZ, LVL=BODLEVEL2}
4
  .OSCCFG = 0x7E, // OSCCFG {FREQSEL=20MHZ, OSCLOCK=CLEAR}
5
  .SYSCFG0 = 0xF6, // SYSCFG0 {EESAVE=CLEAR, RSTPINCFG=UPDI, TOUTDIS=SET, CRCSRC=NOCRC}
6
  .SYSCFG1 = 0xFF, // SYSCFG1 {SUT=64MS}
7
  .APPEND = 0x00, // APPEND {APPEND=User range:  0x0 - 0xFF}
8
  .BOOTEND = 0x00, // BOOTEND {BOOTEND=User range:  0x0 - 0xFF}
9
};

Den Aufbau dieser Struktur hat hier 
https://www.avrfreaks.net/s/topic/a5C3l000000UctsEAC/t163324 schon mal 
wer beschrieben.

Also ergibt sich
1
Adresse
2
3
0x0082 0000  WDTCFG
4
       0001  BODCFG
5
       0002  OSCCFG
6
       0003  --
7
       0004  --
8
       0005  SYSCFG0
9
       0006  SYSCFG1
10
       0007  APPEND
11
       0008  BOOTEND

Und danach kommen noch die Lockbits:
1
LOCKBITS = 0xC5; // {LB=NOLOCK}

Die stehen in den folgenden zwei Zeilen drin:

:02 0000 04 0083 77

"Extended Address" 0x0083

:01 0000 00 C5 3A

Adresse 0x0083 0000 bekommt also das Byte C5 verpasst.

Ich denke, daß damit der Aufbau hinreichend klar ist.

Wenn der eigene Assembler/Compiler das nicht erzeugen kann, ist es recht 
leicht, das von Hand an das Hex-File anzuhängen. Vor die letzte Zeile 
(End of file record) werden die vier Zeilen eingefügt, fertig.

von Ob S. (Firma: 1984now) (observer)


Angehängte Dateien:

Lesenswert?

Harald K. schrieb:

> Den Aufbau dieser Struktur hat hier
> https://www.avrfreaks.net/s/topic/a5C3l000000UctsEAC/t163324 schon mal
> wer beschrieben.

Die steht auch immer im DB drin. Siehe Anhang für den konkreten 
Tiny3227.

Allerdings: Wenn man den Kram selber erzeugt, heißt es bei etlichen 
Typen aufpassen bezüglich der reservierten Bereiche. Die sind als 
reserviert markiert. Das bedeutet nicht, dass da nicht u.U. etwas ist, 
was etwas bewirkt...

Es ist dringend empfehlenswert, ein reales Exemplar des Targets 
auszulesen, um an die Default-Werte der reservierten Bereiche zu kommen.

Ob der konkrete Tiny3227 diesbezüglich kritisch ist, entzieht sich 
allerdings meiner Kenntnis.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Dirk F. schrieb:

> Falsch. In von MPLABX erzeugten HEX files sind fuse bit setting drin.
> 
https://microchip.my.site.com/s/article/Creating-production-file-for-AVR-devices-using-MPLAB-X-IDE

Interessant. Hoffen wir, dass sich das analog zur Situation beim 
Elf-Format zur allgemein anerkannten und unterstützten Konvention 
entwickelt.

Ich habe allerdings ganz erhebliche Zweifel daran, dass MC das dem 
avrasm2 noch beibiegen wollen würde. Obwohl es ja ziemlich sicher sehr 
einfach umzusetzen wäre.
Nö, sieht eher so aus, als wäre der genauso auf dem sterbenden Ast wie 
das MC-Studio insgesamt auch.

von Harald K. (kirnbichler)


Lesenswert?

Im vorliegenden Beispiel werden zwei reservierte Bereiche mit 0 
beschrieben; man könnte aber bei etwaigen Unsicherheiten reservierte 
Bereiche auch ausschließen:

:03 0000 00 00547E pp
:04 0005 00 F6FF0000 pp

(die Prüfsumme zu berechnen war ich jetzt zu faul und hab' stattdessen 
"pp" hingeschrieben)

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Harald K. schrieb:

> man könnte aber bei etwaigen Unsicherheiten reservierte
> Bereiche auch ausschließen:
>
> :03 0000 00 00547E pp
> :04 0005 00 F6FF0000 pp

Das klappt aber leider nur mit ganzen reservierten Bytes. Bei vielen 
Typen gibt es aber auch reservierte Bits innerhalb von Bytes mit 
dokumentierten Bits. So auch im konkreten Beispiel bei OSCCFG, SYSCFG0 
und SYSCFG1.

von Harald K. (kirnbichler)


Lesenswert?

Ob S. schrieb:
> Bei vielen
> Typen gibt es aber auch reservierte Bits innerhalb von Bytes mit
> dokumentierten Bits.

Dann wird im Datenblatt drinstehen, welcher Wert da 'reinzuschreiben 
ist.

Oder man kann bei Unsicherheit mit dem "offiziellen" Compiler ein 
Hexfile erzeugen lassen und nachsehen.

Für die beiden im vorliegenden Fall reservierten Bytes nimmt der 
Compiler z.B. 0 an.

Obendrein enthält die im Codebeispiel verwendete Struktur komplette 
Bytes.

Das scheint also kein relevantes Problem zu sein.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ob S. schrieb:

> Das klappt aber leider nur mit ganzen reservierten Bytes. Bei vielen
> Typen gibt es aber auch reservierte Bits innerhalb von Bytes mit
> dokumentierten Bits. So auch im konkreten Beispiel bei OSCCFG, SYSCFG0
> und SYSCFG1.

Allerdings: dafür stehen wiederum die Default-Werte im DB.

von Harald K. (kirnbichler)


Lesenswert?

Ob S. schrieb:
> Allerdings: dafür stehen wiederum die Default-Werte im DB.

Na dann ist der Drops ja gelutscht und das Verfahren ist anwendbar.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Harald K. schrieb:
> Ob S. schrieb:
>> Allerdings: dafür stehen wiederum die Default-Werte im DB.
>
> Na dann ist der Drops ja gelutscht und das Verfahren ist anwendbar.

Jepp.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Ob S. schrieb:

> Harald K. schrieb:
>> Ob S. schrieb:
>>> Allerdings: dafür stehen wiederum die Default-Werte im DB.
>>
>> Na dann ist der Drops ja gelutscht und das Verfahren ist anwendbar.
>
> Jepp.

Das war vielleicht voreilig. Kommt dann noch darauf an, ob das Brenntool 
mit fragmentierten Fuse-Bereichen klarkommt. Darauf wetten würde ich 
nicht unbedingt.

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.