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.