//Löscht Page die in PAGE-Adresse des Z-Pointer(Z6...Z12) steht
124
#asm
125
movwr30,r6;
126
ldir17,0x03;
127
#endasm
128
DO_SPM();
129
}
130
131
voidREENABLE_RWW(void)
132
{
133
#asm("ldi r17,0x11");
134
DO_SPM();
135
136
}
137
138
139
voidRAM_2_TEMP_PAGE(void)
140
{
141
unsignedcharn;
142
for(n=0;n<128;n+=2)
143
{
144
daten=PAGE_BUFFER[j]+256*PAGE_BUFFER[j+1];//schreibt wort in registerpar r3+r2
145
#asm("movw r0,r2"); //kopiert wert r3+r2 in r1+r0
146
DO_SPM();
147
#asm("adiw r31:r30,2"); //kopiert wert r3+r2 in r1+r0
148
}
149
150
151
}
152
153
voidPAGE_WRITE(void)
154
{
155
#asm
156
movwr30,r6;
157
ldir17,0x05;
158
#endasm
159
DO_SPM();
160
}
161
162
163
voidDO_SPM(void)
164
{
165
#asm
166
WAIT_SPM:
167
inr16,0x37;//SPMCR in Register r16 einlesen
168
sbrcr16,0x01;//Skip if Bit in Register is Cleared
169
rjmpWAIT_SPM;
170
out0x37,r17;//schreibe in SPMCR-Register und führe aus
171
spm;
172
#endasm
173
}
Programmblauf:
1. Atmega16 sendet "0x01" als Startzeichen
2. Terminalprogramm antwortet mit "0x02"
3. ATmega16 sendet "0x16" als DeviceID
4. Terminalprogramm sendet Anzahl der Seiten die übertragen werden
sollen
5. Atmega16 löscht aktuelle Page gibt RWW bereich wieder frei und sendet
"0x03" um Daten zu empfangen.
6. Terminalprogramm sendet 128 Bytes
7. Atmega16 empfängt die 128 Bytes und legt diese in SRAM
(PAGE_PUFFER[128]) ab
8. Atmega16 schreibt Daten aus SRAM(PAGE_PUFFER[128]) in einen internen
temporäre PAGE-Puffer
9. Page wird geschrieben
10.RWW bereich wird wieder frei gegeben
11. Programmende
Das Programm läuft auch so ab. Doch wenn ich mir den Flash auslese, sehe
ich, ausser dem Bootloaderprogramm ab Adress 0x1C00, das nichts in den
FLASH geschrieben wurde.´
Kann jemand mit Bootloadererfahrung mal über meinen Code schauen?
Vielleicht mache ich etwas Grundsätzliches falsch.
hallo,
na muss man nicht den temporären puffer des atmega's füllen? da war bzw.
ist doch etwas mehr am SPMCR zu drehen, als nur ein Standard-muster zu
schreiben.
iirc gibt es unterschiedliche belegungen des SPMCR für pageload, page
erase und page write. du mal einfach in der doku nachschauen.
bye kosmo
ich setzte in den Funktionen mit ldi r17,0x__ den SPMCR und mit der
Unterfunktion DO_SPM wird r17 nach SPMCR übertragen und mit Befehl spm
ausgeführt. Aber vorher wird geprüft ob er bereit ist eine neue
spm-funktion auszuführen
Gruß
Schaue ich mir nun den kompilierten ASM-Text an sehe ich bei gleicher
Funktion "void RAM_2_TEMP_PUFFER(void)" folgenden ASM-CODE
1
_RAM_2_TEMP_PAGE:
2
;175for(j=0;j<128;j++)
3
LDIR30,0
4
STS_j,R30
5
STS_j+1,R30
6
_0x1A:
7
LDSR26,_j
8
LDSR27,_j+1
9
CPIR26,LOW(0x80)
10
LDIR30,HIGH(0x80)
11
CPCR27,R30
12
BRSH_0x1B
13
;176{
14
;177daten=PAGE_BUFFER[j]+256*PAGE_BUFFER[j+1];//schreibt wort in registerpar r3+r2
15
CALLSUBOPT_0x3
16
SUBIR30,LOW(-_PAGE_BUFFER)
17
SBCIR31,HIGH(-_PAGE_BUFFER)
18
LDR30,Z
19
MOVR26,R30
20
CALLSUBOPT_0x3
21
__ADDW1MN_PAGE_BUFFER,1
22
LDR30,Z
23
MOVR31,R30
24
LDIR30,0
25
LDIR27,0
26
ADDR30,R26
27
ADCR31,R27
28
MOVWR2,R30
29
;178#asm("movw r0,r2");//kopiert wert r3+r2 in r1+r0
30
movwr0,r2
31
;179#asm("ldi r17,0x01");
32
ldir17,0x01
33
;180DO_SPM();
34
CALL_DO_SPM
35
;181#asm("adiw r31:r30,2");//kopiert wert r3+r2 in r1+r0
36
adiwr31:r30,2
37
;182}
38
CALLSUBOPT_0x4
39
JMP_0x1A
40
_0x1B:
41
;183
42
;184
43
;185}
44
RET
Liegt es vieleicht daran das hier z.b. in der ersten ASM-Zeile das
Register r30 mit "0" beschrieben wird?
r30 und r31 sind doch meine Page- sowie Siteadesse.
;181#asm("adiw r31:r30,2");//kopiert wert r3+r2 in r1+r0
aus dem hut zauberst. für das page load brauchst du nur einen index in
den temporären puffer, also quasi dein 'j' << 1
deine page-adresse (CurrentAddress) brauchst du dann beim schreiben.
cmiiw.
Hallo kosmonaut_pirx,
danke erstmal für deine Hilfe.
Es funktioniert, ich kann eine Seite übertragen und in den Flash
schreiben.
Nur habe ich bei der Übertragung einen Fehler.
Ich übergebe
hallo,
scheint ja vorwärts zu gehen.
du bist irgendwie eine adresse zu früh dran im temp-buffer. schreib
nochmal deinen derzeitigen "c"-code, wenn's nicht zuviel aufwand ist.
fällt schwer, den aktuellen stand im auge zu behalten.
bye kosmo