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
Gegenfrage: wozu musst Du das wissen? Wenn du einen gekauften USB Programmer benutzt, macht der schon alles richtig.
Sollte es deine Intention sein, selbst einen ISP-Programmer zu schreiben? Ich denke nicht, dass sich das lohnt, da gibts schon recht viele.
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?
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
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...
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.