Hallo; kann mir jemand ein kleines übersichtliches Beispielprogramm posten wie man den Flash-Speicher im ATTINY25 beschreiben kann ? Ich weiss dass man das Fusebit auf Null setzen muss um den SPM Befehl zuzulassen und dass man erst die Register beschreiben muss und dann ein Steuerbit setzen muss um dann inerhalb von 4 Taktzyklen den SPM Befehl abzusetzen sowie dass die Register R30 und R31 die Adresse beinhalten und das Register R0 den Wert aber ich kriegs nicht hin. Dann habe ich gelesen dass man erst einen Erase-Befehl absetzen muss und danach erst das Beschreiben. Ausserdem dass der Flash seitenweise beschrieben wird. Da verstehe ich nicht ganz wieso die beiden Z-Register (30 und 31) doch genau auf EIN Wort hinweisen und nicht auf 16. Oder ? Ach so: Bitte keine Fragen wieso und warum und was ist der Sinn. Es ist einfach ein Interesse von mir ohne praktischen Nutzen. Mich interessiert einfach nur wie das geht. Danke
Wie wäre es den Hersteller zu befragen: http://ww1.microchip.com/downloads/en/AppNotes/Atmel-2575-C-Functions-for-Reading-and-Writing-to-Flash-Memory_ApplicationNote_AVR106.pdf Zwar kein Beispielprogramm, aber die Programmiersprache hattest Du ja auch nicht genannt.
danke der Link ist schonmal gut. Ich programmiere in Assember.
Am besten mal einen Bootloader anschauen. Da wird ja ausgiebig davon Gebrauch gemacht, z.B. hier: Beitrag "Re: UART Bootloader ATtiny13 - ATmega644"
Im Gegensatz zu bekannten Bootloader-Projekten hat mir sehr geholfen: g-heinrichs.de/attiny/Bootloader.pdf Daraus entstand das ASM f.T45:
1 | ;avrdude -P /dev/ttyUSB0 -c stk500v2 -p t45 -V -Uflash:w:boot1.hex:i |
2 | ;avrdude -P /dev/ttyUSB0 -c stk500v2 -p t45 -F -V -Uefuse:w:0xfe:m |
3 | .include "tn45def.inc" |
4 | .def wert = r16 |
5 | .def seite = r17 |
6 | .def RWCount = r23 |
7 | .def spmcsrval = r22 |
8 | .def A = r27 |
9 | .org 32 |
10 | Anfang: |
11 | ldi seite,14; oder andere Testwerte |
12 | Testen: |
13 | inc seite |
14 | Rrcall WrPage |
15 | rjmp -1 ; oder bis ? Testen |
16 | WrPage: |
17 | ; rcall Zhl ;Berechnen Z |
18 | ldi ZH,1; 2 sind dann 32 word weiter |
19 | ldi ZL,0 ; oder 16 32 48 bei t45 |
20 | ldi RWCount, 32 |
21 | ; Puffer fuellen |
22 | Schreib_schleife: |
23 | ; rcall getByte |
24 | ldi wert,11 ; zum Test: Festwert |
25 | mov r0, wert |
26 | rcall getByte |
27 | mov r1, wert ; einlesen |
28 | ldi spmcsrval, 1 |
29 | ; 1 Wort in Puffer schreiben |
30 | out spmcsr, spmcsrval |
31 | spm |
32 | inc ZL ; Adresse + 1 Word |
33 | inc ZL |
34 | dec RWCount |
35 | brne Schreib_schleife |
36 | ; SeiteLoeschen: |
37 | subi ZL,64 |
38 | ldi spmcsrval, 3 |
39 | out spmcsr, spmcsrval |
40 | spm |
41 | ; evtl.hier Pause |
42 | ; Puffer in FLASH-Seite schreiben |
43 | ldi spmcsrval, 5 |
44 | out spmcsr, spmcsrval |
45 | spm |
46 | ret ;WrPage |
Mein Leseprogramm funktioniert leider nicht, deshalb will ich das hier auch nicht komplett einstellen. Hoffe, dass beim Entfernen einiger Code-Teile nichts falsch geworden ist. Fuer t25 sind wohl die Pages nur halb so grosz, also ZL 8 mal erhoehen bis zum naechsten ZH.
Für diese sehr konkrete Hilfestellung bedanke ich mich schonmal vorab und melde mich wieder wenn ich alles ausprobiert habe.
'What else is there to do on a Saturday, when your girl-friend has left you, your TV-set is broken and your jogging-suit is in the wash?' (Corona blieb Charles M. Schulz erspart)
Entschuldigung, noch mal. (falscher Sprung in §page_checking)
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.