Hallo Zusammen
Ich versuche gerade einen Bootloader für einen ATtiny45 in ASM zu
programmieren.
Als erstes habe ich einen einfachen Versuch unternommen, um irgendwelche
Daten mit SPM in den Flash zu schreiben.
Ich bin mir nicht sicher, ob ich folgendes richtig verstanden habe:
Mit dem Befehl SPM werden alle 32 Word im Puffer in einem Rutsch in den
Flash geschrieben ?
Das Word 0 habe ich mit Daten laden können. Wie lade ich nun Word 1, 2,
3 .... ?
Folgender Test Bootloader sollte einfach die Buchstaben X,Y,A,B in den
Flash bei adresse H00 schreiben. So lange nur ein Word (X,Y) in den
Puffer geschrieben wird, funktionierts. Beim zweiten Word (A,B), wird
wieder das erste Word überschrieben.
Was mach ich falsch ?
hier mein Code:
'Page löschen
ldi r31, &H00 'Page 0
ldi r16, &B00000011
Out Spmcsr , R16
SPM
nop
nop
nop
nop
'Word in Puffer laden
ldi r31, &H00 'Page 0
ldi r16, 88 'X
mov r1, r16
ldi r16, 89 'Y
mov r0, r16
ldi r16, &B00000001
Out Spmcsr , R16
SPM
nop
nop
nop
nop
ldi r16, 65 'A
mov r1, r16
ldi r16, 66 'B
mov r0, r16
ldi r16, &B00000001
Out Spmcsr , R16
SPM
nop
nop
nop
nop
'Puffer in Flash laden
ldi r31, &H00 'Page 0
ldi r16, &B00000101
Out Spmcsr , R16
SPM
nop
nop
nop
nop
Huhu
Also so aus der hohlen Hand würde ich sagen, Du incrementierst den
Addresspointer für den Transferbuffer nicht:
Michael L. schrieb:> 'Word in Puffer laden> ldi r31, &H00 'Page 0>> ldi r16, 88 'X> mov r1, r16> ldi r16, 89 'Y> mov r0, r16>> ldi r16, &B00000001> Out Spmcsr , R16> SPM
Ok, also 'X,'Y in den Transferbuffer (page 0,adr 0) geschoben
Soweit ich mich erinnere incrementiert SPM das Z-Register NICHT.
> ldi r16, 65 'A> mov r1, r16> ldi r16, 66 'B> mov r0, r16>> ldi r16, &B00000001> Out Spmcsr , R16> SPM
Nun 'A,'B in den Transferbuffer (page 0, adr 0) geschoben
HUCH, nochmal adr 0 ?
Probier das mal nach dem ersten SPM Befehl:
adiw R30, 2 'Increment buffer address
Wie gesagt, nur kurz rübergeschaut. Ohne Garantie ;-)
Grüße
Andreas
Michael L. schrieb:> Ich versuche gerade einen Bootloader für einen ATtiny45 in ASM zu> programmieren.
Da fällt mir noch ein das Peter Dannegger auch irgendwo einen Bootloader
vorgestellt hatte. Die Forensuche kann da sicher helfen.
Ansonsten gibts noch http://www.jtxp.org/tech/tinysafeboot.htm#tsb
Da kannst Du auch mal in den Sourcen schmulen ;-)
Grüße
Andres
Super besten Dank !
Den Puffer mit 32 Word laden, und anschliessend in den Flash schreiben,
funktioniert. Wenn ich nun die nächste Page beschreiben will, so wird
diese bei adresse h100 eingesetzt, sollte doch aber bei h40 eingesetzt
werden, oder etwa nicht ?
Michael L. schrieb:> Super besten Dank !>> Den Puffer mit 32 Word laden, und anschliessend in den Flash schreiben,> funktioniert. Wenn ich nun die nächste Page beschreiben will, so wird> diese bei adresse h100 eingesetzt, sollte doch aber bei h40 eingesetzt> werden, oder etwa nicht ?
ja, dann wird wohl in deinem Bootloader irgendwo die falsche Pagesize
stehen!
Sascha
Michael L. schrieb:> Wenn ich nun die nächste Page beschreiben will, so wird> diese bei adresse h100 eingesetzt, sollte doch aber bei h40 eingesetzt> werden, oder etwa nicht ?Sascha Weber schrieb:> ja, dann wird wohl in deinem Bootloader irgendwo die falsche Pagesize> stehen!
Möglich. Die pagesize ist für ATtiny25 und ATtiny45 unterschiedlich.
Vergleiche Table 20.-8. im Datenbltt.
Kannst Du mal bitte Deinen code posten ?
Grüße
Andreas
> ja, dann wird wohl in deinem Bootloader irgendwo die falsche Pagesize> stehen!
Ich bin erst bei einem versuch, um irgendwelche Daten in den Flash zu
bekommen. Das Testprogramm sollte einfach 4 Pages mit den Buchstaben X Y
füllen.
Was mach ich den genau falsch ? Pagesize kann ich nirgendwo einstellen
Hier der Code:
Page_nr = 0
Read_page:
'Page löschen
$asm
push r17
push r31
push r30
lds r17, {Page_nr}
mov r31, r17
ldi r17, &B00000011
Out Spmcsr , R17
SPM
pop r30
pop r31
pop r17
$end Asm
Word_nr = 0
Input_data:
If Word_nr = 64 Then 'anzahl Bytes
Goto Write_buffer 'Wenn Puffer voll -> Daten in Flash schreiben
End If
'Word in Puffer laden
$asm
push r0
push r1
push r16
push r17
push r30
lds r17, {Word_nr}
mov r30, r17
ldi r16, 88 'X
mov r1, r16
ldi r16, 89 'Y
mov r0, r16
ldi r16, &B00000001
Out Spmcsr , R16
SPM
inc r17 'Byte Nr im Puffer hochzählen
inc r17
STS {Word_nr}, r17
pop r30
pop r17
pop r16
pop r1
pop r0
$end Asm
Goto Input_data
Write_buffer:
'Puffer in Flash laden
$asm
push r17
push r31
push r30
lds r17, {Page_nr}
mov r31, r17
ldi r17, &B00000101
Out Spmcsr , R17
SPM
pop r30
pop r31
pop r17
$end Asm
If Page_nr = 4 Then
End 'Nach 4 Pages: Ende
End If
Page_nr = Page_nr + 1
Goto Read_page
Michael L. schrieb:> Was mach ich den genau falsch ? Pagesize kann ich nirgendwo einstellen
Ne, die Pagesize wird ja durch den Processor vorgegeben. Schau Dir mal
Figure 19.-1. und Table 20.-8. im Datenblatt an.
Die Wort_nr und Page_nr liegen im Z-Register NICHT auf Byte boundaries.
Das siehst Du auch aus Figure 19.-1. Die Tabelle sagt Dir auch, wo genau
die beiden Werte im Z-Register liegen.
Da passt auch das rein, was Du beobachtet hast (´habs jetzt nicht
nachgerechnet, sry).
Das solltest Du relativ leicht korrigieren können (Nur die Werte
entsprechend im Z-Register an die passende Stelle schieben)
Grüße
Andreas
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.