Ich habe einen sehr einfachen Bootloader (ich weiss nicht mehr, wo der her ist) vom Tiny2313 auf den 4313 angepasst. Auf dem 2313 funktionierte alles bestens. Der Flash ist da doppelt so gross (4k statt 2k), ansonsten ist lt. Datenblatt und Errata kein Unterschied. Bei der Programmierung wird nur jeder zweite der 32 Byte-Blöcke erfolgreich programmiert, die anderen werden mit FF programmiert (d.h. möglicherweise gelöscht, aber nicht programmiert) Hat jemand diesen Effekt beim 4313 schon gehabt?
Hier ist das Testprogramm und der resultierende Dump nach der Programmierung. Write_Page kommt glaube ich aus der AVR Doku. Ich schiebe nur zh:zl in den Flash.
1 | .equ pages = (bootloader*2) / PAGESIZE |
2 | //Then 48 x 32 bytes = bytes to FLASH, blocksize = 16 words = 32 bytes |
3 | ldi r18, PAGES |
4 | ldi zh,high((2*bootloader)-32) |
5 | ldi zl,low((2*bootloader)-32) |
6 | wrrom1: |
7 | rcall write_page |
8 | sbiw zh:zl,32 //next flash page |
9 | dec r18 |
10 | brne wrrom1 |
11 | nix: rjmp nix |
12 | |
13 | write_page: |
14 | ;page erase |
15 | //address needs to be in zh:zl |
16 | ldi a,0b00000011 |
17 | rcall do_spm |
18 | |
19 | ;transfer data from RAM to Write Buffer |
20 | ;points to Y |
21 | ldi r21,PAGESIZE/2 //= 16 words |
22 | push zl //save pointer to flash |
23 | push zh |
24 | |
25 | wrloop: |
26 | // ld r0,y+ |
27 | // ld r1,y+ |
28 | mov r0,zh |
29 | mov r1,zl |
30 | ldi a,0b00000001 |
31 | rcall do_spm |
32 | adiw zh:zl,2 |
33 | dec r21 |
34 | brne wrloop |
35 | |
36 | ;execute write page |
37 | pop zh |
38 | pop zl |
39 | ldi r16,0b00000101 |
40 | rcall do_spm |
41 | |
42 | ret |
43 | |
44 | do_spm: |
45 | in r22,spmcsr |
46 | sbrc r22,spmen |
47 | rjmp do_spm |
48 | |
49 | wait_ee: |
50 | sbic eecr,eewe |
51 | rjmp wait_ee |
52 | out spmcsr,r16 |
53 | SPM //Writes r0,r1 to flash zh:zl |
54 | ret |
Hallo, das liegt da dran das beim 4313 die Flashpage 32 words = 64 bytes groß ist und beim 2313 nur 16 words = 32 bytes. Gruß Rene
Hi danke du hast mir das Wochenende gerettet! Viele Grüße Oli
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.
