Flash beschreiben (bootloader)

snoopy

Neues Mitglied
27. Aug. 2007
2
0
0
Sprachen
Hallo,

ich versuche beim ATMega128 einen Bootloader zu programmieren,hänge aber
jetzt schon bei den ersten Schritten. Ich versuche eine komplette page mit
konstanten Werten zu programmieren und lese die page dann wieder, was aber
unterschiedliche Ergebnisse bringt.

Hier mal mein Listing, wie ich die page schreibe:
Code:
schreibe_page:
   ldi xl, 255     ; anzahl der bytes
   ldi xh, 0

   r16, 0x20       ; hier die Adresse 
   r17, 0x50


schreibe_pageloop:

   ldi r0, 0x10               ; hier die daten low und high
   ldi r1, 0x55               

   mov zl, r16                ; hier die adresse nach z
   mov zh, r17

   ldi r19, 1<<SPMEN         ; SPMCR = 0x01
   sts SPMCSR, r19           ; page speichern
   spm       

   ldi r19, 1                ; nächste adresse
   ldi r20, 0
   add r16, r19              ; r16 und r17 ist die adresse
   adc r17, r20

   sbiw xl, 1
   brne schreibe_pageloop

Lesen erfolgt mit lpm-Befehl, ich lese aber nicht abwechselnd 0x10 und 0x55. Kann mir jemand helfen?

Danke
snoopy
 
Hallo snoopy,

wenn du nur das Bit SPMEN im Register SPMCSR setzt und SPM ausführst,
werden die Daten in einem temporären Buffer (PageBuffer) und nicht im Flash direkt gespeichert.
Zudem ist es notwendig sicherzustellen, dass der Flash-Speicher für Schreibvorgänge bereit ist.

Die Startadresse (bei dir r16, r17) mußt du auf die Anfangsadresse einer Page setzen. Die Länge der zu schreibenden Daten (bei dir xl, xh) ist die Pagesize (im Definitionsfile definiert).
Mit SPM schreibt man gleich ein Word, also zwei Byte in den PageBuffer, du musst die Adresse im Z-Register um ein ganzes Word erhöhen.

Code:
   ldi r19, [B][COLOR=DarkRed]2[/COLOR][/B]                ; nächste adresse
   ldi r20, 0
   add r16, r19              ; r16 und r17 ist die adresse
   adc r17, r20
So schreibt man nach dem Füllen des PageBuffers die FlashPage:
Code:
   ldi zl, ADRESSE_L    ; Pageadresse
   ldi zh, ADRESSE_H

   rcall WaitEEPROM
   rcall WaitSPM

   ldi r16, (1<<PGWRT) | (1<<SPMEN)  ; SPMCR = 0x05 Write page
   sts SPMCSR, r16
   spm                                  ; Store program memory
                        
   rcall WaitEEPROM  
   rcall WaitSPM

   ldi r16, (1<<RWWSRE) | (1<<SPMEN)     ; reenable rrw
   sts SPMCSR, r16
   spm

   ; ....


WaitEEPROM:

   sbic EECR, EEWE
   rjmp waiteeprom

ret


WaitSPM:

   lds r16, SPMCSR
   sbrc r16, SPMEN
   rjmp waitspm

ret
Ich hoffe, ich konnte dir weiterhelfen.

Gruß
Dirk
 
Hallo Dirk
dann kann das bei mir ja nicht funktionieren.

Die Länge der zu schreibenden Daten (bei dir xl, xh) ist die Pagesize (im Definitionsfile definiert).

Also wenn ich das jetzt richtig verstehe muß die länge die Anzahl der Worte sein, also die Anzahl der Bytepaare, ok ich werde das nochmal ausprobieren und wenn ich doch noch Probleme mit meinem Programm habe dann darf ich doch nochmal fragen ;)

Besten Dank
snoopy
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)