MPLAB IPE + Snap + AVR-Asm, wie Fuses setzen?

OP #7732271
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.

(Firma: 1984now) #7732278
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.

OP #7732279
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 ...

OP #7732340
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.

Angehängte Dateien:
#7732545
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.

(Firma: 1984now) #7732719
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.

Angehängte Dateien:
(Firma: 1984now) #7732735
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.

#7732736
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)

(Firma: 1984now) #7732742
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.

#7732752
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.

OP #7771657
Lesenswert?

Für den Fall, dass in Zukunft noch jemand mit derselben Frage diesen Thread findet, nachfolgend eine Anleitung, wie es wohl am einfachsten geht:

Snap + MCU anschließen, in MPLABX /IDE/ (also nicht IPE) ein (Wegwerf-) Application Project mit der entsprechenden Ziel-MCU und dem angeschlossenen Snap als Tool erstellen (C oder Assembler, ist egal) und auf /Production/ → /Set Configuration Bits/ klicken. Dann öffnet sich unten ein Fenster wie im angehängten Screenshot; dort zuerst links oben auf /Read Configuration Bits/ klicken, danach kann man rechts in der Tabelle die gewünschten Änderungen vornehmen und schließlich mit Klick auf den linken grünen nach unten zeigenden Pfeil /Program Configuration Bits/ die geänderten Fuses zurückschreiben.

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren