Forum: Mikrocontroller und Digitale Elektronik Speicher Organisation -


von Thomas B. (briddl)


Lesenswert?

Hallo zusammen,
könnte mir bitte einer erklären wie das programmieren des internen 
Flashes bei einem ATmega88 über ISP funktioniert. Ich versteh nicht ganz 
wie das mit den Pages funktioniert und aus dem Datenblatt werd ich nicht 
ganz schlau. Sitz gerade vermutlich gewaltig auf dem Schlauch...

Ich versteh nicht ganz wie ich die Serial Programming Befehle anwenden 
muss:

Also es gibt ja die Load Instructions:
Load Extended Address Byte              0x4D 0x00 [EXTENDED ADR] 0x00
Load Programm Memory Page High Byte     0x48 0x00 [adr LSB] [high data 
byte in]

Load Programm Memory Page Low Byte      0x40 0x00 [adr LSB] [low data 
byte in]

und es gibt die Write Instructions:
Write Program Memory page               0x4C [adr MSB] [adr LSB] 0x00

Bzw. wie der Ablauf sein müsste? Könnte mir das vielleicht anhand der 
ersten Page erklären? Und wie lauten  eigentlich die Page adressen bzw? 
Wie finde ich die raus?

Danke schon mal
Gruß Thomas

von Düsendieb (Gast)


Lesenswert?

Gegenfrage:
wozu musst Du das wissen?

Wenn du einen gekauften USB Programmer benutzt, macht der schon alles 
richtig.

von (prx) A. K. (prx)


Lesenswert?

Sollte es deine Intention sein, selbst einen ISP-Programmer zu 
schreiben? Ich denke nicht, dass sich das lohnt, da gibts schon recht 
viele.

von Thomas B. (briddl)


Lesenswert?

Einfache Antwort: Weils ichs für mein Projekt in meinem Praxissemester 
brauche mehr darf ich dazu leider nicht sagen sry.

Naja und selbst ohne Grund is es nicht immer gut bzw. nie schlecht so 
was zu wissen?

von Thomas B. (briddl)


Lesenswert?

A. K. schrieb:
> Sollte es deine Intention sein, selbst einen ISP-Programmer zu
> schreiben? Ich denke nicht, dass sich das lohnt, da gibts schon recht
> viele.

Weis ich hab ich mich schon informiert leider nicht so wie ichs brauch. 
bzw. nein es wird kein ISP-Programmer im eigetnlichen Sin.

Könntet ihr nicht einfach die Frage beantworten :P Bitte

von (prx) A. K. (prx)


Lesenswert?

Thomas Britzelmeier schrieb:

> Könntet ihr nicht einfach die Frage beantworten :P Bitte

Da müsstest du hier im Forum jemanden finden, der schon mal einen 
ISP-Programmer geschrieben hat. Das sind wohl nicht so viele und ob da 
grad einer mitliest und es beim dem gewählten Betreff klingelt...

von Thomas B. (briddl)


Lesenswert?

Mh Schade.
Aber trotzdem danke.

von Miška (Gast)


Lesenswert?

Ich finde schon, daß es sich lohnt, seinen eigenen ISP-Programmer zu 
schreiben, es kann ja nicht schaden, so etwas (und die dazugehörigen 
Fehler ;-) auch einmal selbst gemacht zu haben. Hat ja immerhin einen 
gewissen Lerneffekt zur Folge. Aus diesem Grund hab ich das auch schon 
getan (schon ne Weile her), auch wenn ich trotzdem AVRDUDE benutze.

Das ATmega88-Datenblatt schreibt:
> The Flash is programmed one page at a time.
> The memory page is loaded one byte at a time by supplying the 6 LSB
> of the address and data together with the Load Program Memory Page
> instruction.
> To ensure correct loading of the page, the data low byte must
> be loaded before data high byte is applied for a given address.
> The Program Memory Page is stored by loading the Write Program
> Memory Page instruction with the 7 MSB of the address.

Das bedeutet also:
Der FLASH-Speicher wird seitenweise programmiert, hierfür existiert ein 
separater (sicherlich RAM-)Puffer der Größe einer FLASH-Page (ATmega88: 
32 WORDs bzw. 64 BYTEs), welcher zuerst gefüllt und dann 'gebrannt' 
wird.
Der Page-Puffer ist also zunächst mit "Load Program memory Page" zu 
füllen, und danach ist die ganze Page mit "Write Program memory Page" zu 
schreiben.
Zusätzlich existiert noch das "Extended-Address"-Register. Da die 
SPI-Befehle nur 16 Bit Adressbereich hergeben, ist dieses Zusatzregister 
nötig, um die obersten Adress-Bits (Nr. 16 und aufwärts) der aktuell zu 
schreibenden Page-Adresse zu 'puffern'. Somit kann auch über die 
16-Bit-Grenze von 64k WORDs hinaus adressiert werden (beim ATmega88 
eigentlich sinnlos, aber wenn es vorhanden ist, dann besser auch mit 
korrekten Werten laden).
Außerdem: Per SPI-Befehl können nur 8 Bit an Daten übertragen werden, 
deshalb muß ein Daten-WORD demzufolge durch zwei BYTE-Lade-Befehle 
übertragen werden (Low-BYTE zuerst, dann das High-BYTE).

Beispiel (ATmega88; 4kWORD FLASH, 32 WORDs/Page):

Wir wollen den FLASH von 0x1a43 bis 0x2010 beschreiben.
Aufgrund der Page-Größe von 32 (0x20) WORDs, müssen die Start- und 
Endadresse zunächst angepaßt werden:
 Erste zu schreibende WORD-Adresse = 0x1a40
 Letzte zu schreibende WORD-Adresse = 0x21f

Es folgt Aus-dem-Kopf-Pseudocode (ohne Gewähr):
1
WORD* data = <Zeiger>;
2
Address = 0x1a40      (cccc cccc aaaa aaaa bbbb bbbb)
3
Do
4
   If (firstLoop or 64kBoundaryCrossed) then
5
      LOAD_EXT_ADDRESS(Address >> 16)    (4D 00000000 cccccccc 00000000)
6
   End_if
7
   For i=[0..31]  (pagesize)
8
      LOAD_PM_PAGE_LOW(i, *data & 0xff)  (48 00000000 --bbbbbb <LSB>)
9
      LOAD_PM_PAGE_HIGH(i, *data >> 8)   (40 00000000 --bbbbbb <MSB>)
10
      data++
11
   Next i
12
   WRITE_PM_PAGE(Address)                (4C ---aaaaa bb------ 00000000)
13
   Address += 32  (pagesize)
14
While Address < 0x2020

('-' = "don't care")

Da im Beispiel nur 4kWORDs FLASH zur Verfügung stehen, wird 
LOAD_EXT_ADDRESS auch nur einmal an den AVR gesendet (Mit Null
als ext. Adresse).

Hoffe, etwas geholfen zu haben...

von Axel S. (a-za-z0-9)


Lesenswert?

Thomas Britzelmeier schrieb:

> Einfache Antwort: Weils ichs für mein Projekt in meinem Praxissemester
> brauche mehr darf ich dazu leider nicht sagen sry.

Dann lern halt Datenblätter zu lesen. Das haben andere Leute vor dir 
auch hinbekommen (sonst gäbe es z.B. avrdude nicht). Vielleicht hilft es 
dir ja, wenn du den Code eines real funktionierenden Programmers und das 
Datenblatt wechselweise anschaust.


XL

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.