Forum: Mikrocontroller und Digitale Elektronik AVR Bootloader


von Michael L. (nightflyer88)


Lesenswert?

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

von Andreas H. (ahz)


Lesenswert?

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

von Andreas H. (ahz)


Lesenswert?

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

von Tim  . (cpldcpu)


Lesenswert?

Hier gibt es mehrere Bootloader zur Auswahl:

https://www.mikrocontroller.net/forum/codesammlung

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

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 ?

von Sascha W. (sascha-w)


Lesenswert?

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

von Andreas H. (ahz)


Lesenswert?

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

von Michael L. (nightflyer88)


Lesenswert?

> 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

von Andreas H. (ahz)


Lesenswert?

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

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.