MPLAB XC16-Compiler, der 8-Bit-HEX-Dateien für PIC24 ausgibt?

Ich versuche, eine HEX-Datei zu verstehen, die ich mit Microchip MPLAB X IDE mit dem Microchip MPLAB XC16 Compiler kompiliert habe .

In Bezug auf die MCU ziele ich auf den PIC24EP512GU814. Der Geltungsbereich dieser Frage sollte jedoch zumindest für alle PIC24-MCUs gelten.

Um das Beispiel-HEX unten zu kompilieren, habe ich während des Assistenten „Neues Projekt“ Samples > Microchip Embedded > PIC24 C Template ausgewählt und die XC16_24EP512GU814 -Konfiguration ausgewählt.

Gemäß dem PIC24EP / dsPIC33-Datenblatt, Abschnitt 4.1.1, Seite 48, ist der Speicher in 16-Bit-Wörter segmentiert, sodass jede Position (0x0000, 0x0001, ...) 16 Bit enthält. Auf derselben Seite des Datenblatts werden Programmbefehle als 24-Bit bezeichnet und erstrecken sich über 2 Wörter, sodass das höchstwertige Byte des höchstwertigen Worts Null ist (00000000b).

Dies scheint nicht mit der kompilierten HEX-Datei übereinzustimmen. Hier sind die ersten 5 Zeilen der Datei, nummeriert und mit den verschiedenen Teilen, die gemäß den Intel HEX-Spezifikationen verteilt sind .

1. :02 0000 04 0000                             fa
2. :08 0000 00 0002040000000000                 f2
3. :02 0000 04 0000                             fa
4. :10 0008 00 c8020000ce020000e4020000d4020000 92
5. :10 0018 00 da020000e8020000ec020000e0020000 42

Betrachten Sie die Zeilen 4 und 5. Das erste Feld zählt korrekt 0x10 (16) Bytes im Datenfeld. Das zweite Feld, das die Position im Speicher bezeichnet, springt jedoch von 0x0008 auf 0x0018 oder 0x0010 (16) Positionen.

Nach meiner Interpretation bedeutet dies, dass diese bestimmte HEX-Datei 8-Bit statt 16-Bit ist, da jede Position mit einem Byte belegt ist.

  • Gibt es eine Möglichkeit, den Compiler dazu zu bringen, eine 16-Bit-Datei auszugeben?
  • Ist diese Datei noch gültig für eine 16-Bit-MCU? Wie kann ich die HEX-Datei interpretieren, damit ich die MCU manuell flashen kann?

Antworten (3)

Intel HEX-Dateien sind immer Byte-adressiert. Das bedeutet nicht, dass sie keine Informationen für andere Wortgrößen verarbeiten können, nur dass es eine Konvention darüber geben muss, wie diese Wörter den Bytes der HEX-Datei zugeordnet werden.

Wie bei allen anderen nicht byteadressierten PICs (PIC 10, 12 und 16) werden die Adressen in der HEX-Datei verdoppelt. Die PIC-Programmiersoftware weiß dies und interpretiert die HEX-Dateiadressen entsprechend. Dies ist natürlich alles in der Programmierspezifikation für das Teil, das Sie programmieren möchten, gut dokumentiert.

Sie sagen, Sie wollen Ihren eigenen Programmierer machen. Das ist in Ordnung, solange Sie verstehen, dass dies viel mehr Zeit und Frustration in Anspruch nehmen wird, als nur ein bekanntermaßen funktionierendes zu bekommen. Wenn es um die Erfahrung und das Lernen bei der Herstellung Ihrer eigenen geht, dann ist das in Ordnung, aber ansonsten kaufen Sie eine.

Wenn Sie wirklich Ihre eigenen machen wollen, sollten Sie sich den Code für meine PIC-Programmierer ansehen. Der gesamte Host-Code und die gesamte Firmware sind offen und in der Version der Entwicklungssoftware unter http://www.embedinc.com/picprg/sw.htm verfügbar . Wenn Sie den Host-Quellcode durchsehen, können Sie sehen, dass es Flags gibt, die angeben, ob HEX-Dateiadressen für verschiedene Teile des PIC-Speichers verdoppelt werden.

Wenn Sie Ihren Programmierer mit meinem PIC-Programmiererprotokoll kompatibel machen , können Sie alle meine hostseitigen Tools verwenden. Dies könnte beim Hochfahren Ihres Systems sehr hilfreich sein, da Sie auf der anderen Seite funktionierenden Code kennen. Die Protokollspezifikation mag auf den ersten Blick einschüchternd wirken, aber wenn Sie genau hinsehen, werden Sie feststellen, dass vieles davon optional ist, insbesondere wenn Sie vorhaben, nur einen einzigen PIC zu unterstützen.

Ich war kurz davor, den Pickit zu kaufen. Allerdings möchte ich mich nicht auf einen Hersteller festlegen. Ich habe andere Projekte in der Reihe, die möglicherweise Atmel-Chips verwenden oder nicht. Anstatt für jeden Hersteller einen neuen Programmierer zu kaufen, kann ich es genauso gut selbst lernen. Ich empfinde es auch als eine bereichernde Erfahrung.

Intel HEX-Dateien geben immer Bytes an, und Adressen in der Datei werden in Bytes gemessen. Es ist nur ein bequemes Format, das zum Übertragen von Binärdaten zwischen Ihrem Linker und Ihrer Programmiersoftware verwendet wird. Es liegt an der Programmiersoftware, die Sie verwenden, um die Daten und ihre Adressen zu interpretieren und sie korrekt in den PIC zu flashen.

Ich verstehe, dass die Programmiersoftware die HEX-Datei interpretieren soll, aber mein aktuelles Projekt ist es, meine eigene Programmiersoftware zu erstellen. Ich verwende ein Arduino als Schnittstelle zur MCU. Bisher habe ich die Arduino-Firmware codiert und die GUI-Shell. Jetzt fehlt mir nur noch die HEX-Datei zu interpretieren, damit ich die richtigen Informationen an den Arduino senden kann. Mir sind andere Arduino->PIC-Programmiererprojekte bekannt, aber keines davon ist mit dem PIC24 kompatibel.

Obwohl Olin Lathrop die Frage beantwortet hat, ergänze ich seine Antwort mit einem Beispiel dafür, wie sie auf die Vorlage angewendet werden würde, die ich in meinen ursprünglichen Beitrag eingefügt habe.

Nach weiterer Untersuchung der IDE fand ich den Memory Viewer, indem ich auf Window > PIC Memory Views > Program Memory zugegriffen habe .

Geben Sie hier die Bildbeschreibung ein

Wenn wir die in diesem Fenster angezeigte Tabelle mit der HEX-Datei vergleichen, können wir feststellen, wie die Anweisungen strukturiert sind. Für das folgende Beispiel teile ich jedes Adressfeld durch zwei und platziere die Anweisungen:

1. :02 0000 04 0000                                fa
2. :08 0000 00 00020400 00000000                   f2
3. :02 0000 04 0000                                fa
4. :10 0004 00 c8020000 ce020000 e4020000 d4020000 92
5. :10 000C 00 da020000 e8020000 ec020000 e0020000 42

Da die Daten im Big-Endian-Format vorliegen, erscheinen die Bytes in umgekehrter Reihenfolge zu einem hexadezimalen Literal. Das Ändern der Daten in hexadezimale Literale ergibt also Folgendes:

1. :02 0000 04 0000                                        fa
2. :08 0000 00 0x00040200 0x00000000                       f2
3. :02 0000 04 0000                                        fa
4. :10 0004 00 0x000002c8 0x000002ce 0x000002e4 0x000002d4 92
5. :10 000C 00 0x000002da 0x000002e8 0x000002ec 0x000002e0 42
Die einzige Änderung, die ich an den konvertierten Hex-Zeilen vornehmen würde, ist die Änderung der Adresse in pic24 24-Bit-Adressen.
1. :02 0000 04 0000                                                                                                                                                         Fa 2. :08 0000 00 0x00040200 0x00000000                                                                                       f2 3. :02 0000 04 0000                                                                                                                                                         Fa 4. :10 0002 00 0x000002c8 0x000002ce 0x000002e4 0x000002d4 92 5. :10 0006 00 0x000002da 0x000002e8 0x000002ec 0x000002e0 42