Forum: Mikrocontroller und Digitale Elektronik AVR Daten aus Bootloader Adresse lesen


von Flash Prog (Gast)


Lesenswert?

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?

von Oliver S. (oliverso)


Lesenswert?

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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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
von Flash Prog (Gast)


Lesenswert?

- 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

von S. Landolt (Gast)


Lesenswert?

Das Lesen des Bootloaderbereichs aus dem Anwendungsbereich heraus ist 
zugelassen? Anders gefragt: wie sieht das Lock-Bit-Byte aus?

von Flash Prog (Gast)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Messwert (Gast)


Lesenswert?

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?

von Mario M. (thelonging)


Lesenswert?

Gelockte Adressen lesen gibt die unteren 8 Bit der Adresse, deshalb 
kommt beim Lesen von 7f60h eine 60h.

von S. Landolt (Gast)


Lesenswert?

> LB 0XCF

BLB12 & BLB11 programmed: ... LPM executing from the Application section 
is not allowed to read from the Boot Loader section.

von S. Landolt (Gast)


Lesenswert?

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

von Gcc (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> ... Was auch immer zuvor in R0 stand ...

Tatsächlich, so ist es. Prima, wieder etwas gelernt.

von EAF (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.