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
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.