Flash-Speicher vom ATTINY25 beschreiben

OP #6480896
Lesenswert?

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
#6483191
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren