hallo!
wer zeigt mir meinen Fehler auf?:
ich möchte einen Datenblock "pgm_data[8]" im Programmspeicher ablegen
und zur laufzeit wieder abholen
Das habe ich wie folgt programmiert:
#include <avr/pgmspace.h>
// Das kommt auch im Flash an:
prog_uchar pgm_data[8] = { 2,3,4,5,6,7,8};
// ein paar Variablen im RAM
unsigned char ram_data[8];
unsigned char i;
// Diese Schleife sollte doch die pgm-Daten in sram_data kopieren,
// tut sie aber nicht.
for(i=0;i<8;i++)
{
ram_data[i] = pgm_data[i];
}
// Das hier wird erzeugt - muss da nicht ein LPM-Befehl entstehen:
for(i=0;i<8;i++)
27c: 90 e0 ldi r25, 0x00 ; 0
27e: 35 e1 ldi r19, 0x15 ; 21
280: a3 2e mov r10, r19
282: 31 e0 ldi r19, 0x01 ; 1
284: b3 2e mov r11, r19
286: ac 0e add r10, r28
288: bd 1e adc r11, r29
28a: d5 01 movw r26, r10
28c: ec e8 ldi r30, 0x8C ; 140
28e: f0 e0 ldi r31, 0x00 ; 0
{
ram_data[i] = pgm_data[i];
290: 81 91 ld r24, Z+
292: 8d 93 st X+, r24
294: 9f 5f subi r25, 0xFF ; 255
296: 98 30 cpi r25, 0x08 ; 8
298: d8 f3 brcs .-10 ; 0x290
}
Wer kann mir da helfen???
Gruß Martin
Lies Dir mal das Kapitel über `program space strings' in der Doku durch. Du mußt sowas wie pgm_read_byte() benutzen, um die Daten aus dem Flash zu lesen.
pgm_read_byte bzw. _LPM hat mir erstmal weitergeholfen, vielen Dank. aber von meinem (begrenzten) C-Verständnis her müsste doch mein Beispiel auch ohne pgm_read_byte funktionieren. Das Feld pgm_data[8] ist doch extra als "prog_uchar" definiert worden?! Gruß Martin
> aber von meinem (begrenzten) C-Verständnis her müsste doch mein > Beispiel auch ohne pgm_read_byte funktionieren. Nein, der GCC kann das nicht automatisch handhaben, weil er nichts von Harvard-Architekturen wissen will.
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.