Hallo zusammen, vermutlich ist die Frage für die AVR Spezialisten hier einfach zu beantworten. Ich versuche gerade per pgm_read_byte(); aus einer Speziellen Speicheradresse im Bereich des Bootloaders zu lesen. Die Adresse kenne ich aus dem .hex File des Bootloaders. Hintergrund: Eine Bootloader ID ist fest im Bootloader hinterlegt, diese möchte ich gerne auslesen um sie im Hauptprogramm nicht zusätzlich abspeichern zu müssen. Leider konnte ich bisher keine Daten auslesen die mit dem .hex übereinstimmen. Ich habe auch versucht die Adresse/2 zu teilen. Zeile aus dem Hex: :107F600020938D01D1DF833779F4CEDF382FCCDF3A Was ich versucht habe: BootID = pgm_read_byte(32608); und BootID = pgm_read_byte(16304); Habt ihr einen Tipp für mich?
Flash Prog schrieb: > Zeile aus dem Hex: > :107F600020938D01D1DF833779F4CEDF382FCCDF3A Welches Byte davon ist denn deine ID? Flash Prog schrieb: > Ich habe auch versucht die Adresse/2 zu teilen. pgm_read_byte() nimmt eine Byteadresse, daher ohne /2. Oliver
Flash Prog schrieb: > Zeile aus dem Hex: > :107F600020938D01D1DF833779F4CEDF382FCCDF3A Damit beginnt die Zeile mit der Adresse 0x7F60, also 32608. Wie kommst Du auf die Idee, dass die ID in der Hex-Datei genau direkt nach 7F60 folgt und nicht erst ein paar Bytes weiter rechts in der Zeile? Du hast folgende Infos leider weggelassen: - Welcher AVR? - Welchen Byte-Wert erwartest Du? - Welchen Byte-Wert bekommst Du?
:
Bearbeitet durch Moderator
- Welcher AVR? -> Atmega328p - Welchen Byte-Wert erwartest Du? Zum testen erstmal 0x20, also die ersten beiden Bytes. - Welchen Byte-Wert bekommst Du? Keinen der in dieser Zeile steht, 0x6F :10 7F60 00 20938D01D1DF833779F4CEDF382FCCDF 3A
Das Lesen des Bootloaderbereichs aus dem Anwendungsbereich heraus ist zugelassen? Anders gefragt: wie sieht das Lock-Bit-Byte aus?
Die Fuses & LockBits sind wie folgt: L 0xFF H 0xDA E 0xFD LB 0XCF Da muss ich jetzt auch kurz nachlesen, bewusst habe ich aber kein LockBit gesetzt.
Flash Prog schrieb: > Die Fuses & LockBits sind wie folgt: > L 0xFF > H 0xDA > E 0xFD > LB 0XCF > Da muss ich jetzt auch kurz nachlesen, bewusst habe ich aber kein > LockBit gesetzt. Ich habe die Werte mal in Fusecalc eingegeben, hier der Link: https://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p&LOW=FF&HIGH=DA&EXTENDED=FD&LOCKBIT=CF Der Standardwert für die Lockbits ist 0xFF, Dein Wert 0xCF aktiviert die Lockbits 4 und 5.
Boot Loader Protection Mode 3: LPM and SPM prohibited in Boot Loader Section Klingt fast danach. Aber sicher bin ich mir nicht. Wie verhält sich ein Atmegs328p wenn das lesen im Bootloader Bereich gesperrt wurde? Was gibt er dann aus? Zufallswerte?
Gelockte Adressen lesen gibt die unteren 8 Bit der Adresse, deshalb kommt beim Lesen von 7f60h eine 60h.
> LB 0XCF
BLB12 & BLB11 programmed: ... LPM executing from the Application section
is not allowed to read from the Boot Loader section.
> Gelockte Adressen lesen gibt die unteren 8 Bit der Adresse
Ob das generell, also auch in diesem Fall, gilt? Also ich erhalte hier
unabhängig von der Adresse immer 0, bei einem ATmega328P-PU von 1426.
S. Landolt schrieb: >> Gelockte Adressen lesen gibt die unteren 8 Bit der Adresse > > Ob das generell, also auch in diesem Fall, gilt? Also ich erhalte hier > unabhängig von der Adresse immer 0, bei einem ATmega328P-PU von 1426. Vermutlich „liest“ LPM gar nichts, d.h. überschreibt nicht sein Zielregister R0, was pmg_read_byte() dann als Ergebnis liefert. Was auch immer zuvor in R0 stand, z.B. das Low-Byte der Adresse.
> ... Was auch immer zuvor in R0 stand ...
Tatsächlich, so ist es. Prima, wieder etwas gelernt.
S. Landolt schrieb: > Ob das generell, also auch in diesem Fall, gilt? Ich bin naiv! Wenn ich ein Verhalten nicht im Datenblatt vorfinden kann, dann halte ich es für "undefined". Ob da ein Zähler hoch läuft, oder Zufallsdaten geliefert werden, ist aus meiner naiven Sicht völlig irrelevant. Zudem kann/darf sich das von AVR zu AVR unterscheiden. Es gibt keine Zusicherung für eine Reproduzierbarkeit. Im Datenblatt ist beschrieben, unter welchen Bedingungen man den Bootloader Bereich erfolgreich auslesen kann. Damit ist das Thema eigentlich fertig.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.