Hallo,
ich habe ein kleines Problem (welches vermutlich irgendwo schon bis in's 
letzte Detail erklärt ist... nur finde ich diese Stelle nicht).
Programmiersprache ist C++ (gcc-avr), µC ist ein ATmega32u4
Ich habe ein paar Arrays im C++-Teil meines Projektes. Diese folgen 
durchweg diesem Schema:
| 1 | extern "C"
 | 
| 2 | {
 | 
| 3 |   PROGMEM volatile const uint8_t data[64] = // volatile?! why?
 | 
| 4 |   {
 | 
| 5 |     0,1,2,3,...
 | 
| 6 |   };
 | 
| 7 | 
 | 
| 8 |   volatile uint8_t offset = 0;
 | 
| 9 | }
 | 
Ich muss in einem kleinen inline-assembly Teil auf vier verschiedene 
davon zugreifen, d.h. ich kann nicht einfach den g++ die Addresse in's 
Z-register (bzw. X/Y) schieben lassen sondern muss irgendwie "direkt" an 
die Adresse herankommen.
| 1 |       "ldi        r30, pm_lo8(data)                                   \n\t"
 | 
| 2 |       "ldi        r31, pm_hi8(data)                                   \n\t"
 | 
| 3 |       "lds        r16, (offset)             ; range [0..255] !        \n\t"
 | 
| 4 |       "asr        r16                       ; shift down by two bits  \n\t"
 | 
| 5 |       "asr        r16                       ; so range is [0...63]    \n\t"
 | 
| 6 |       "add        r30, r16                  ; add offset              \n\t"
 | 
| 7 |       "adc        r31, r0                   ; add carry (and r0=0)    \n\t"
 | 
| 8 |       "lpm        r17, Z                    ; load value into r17     \n\t"
 | 
Dabei habe ich verschiedene Probleme:
1. Wenn ich das Array ohne einen (zusätzlichen) 'volatile' anlege, 
bekomme ich einen 'undefined reference "data"'... und ich verstehe nicht 
warum?!
2. Es ist bestimmt ein dummer (Verständnis-)Fehler, aber die Werte die 
ich in 'r17' erhalte, sind nicht die aus dem Array sonder 
"irgendeinwasauchimmer"...
Es ist nicht das erste Mal, dass ich Assembler schreibe, wohl aber für 
AVR... Wenn also jemand so freundlich wäre, mir das Brett vorm Kopf 
abzumontieren? Ich würde gern verstehen, was ich da Dümmliches tue...
Vielen lieben Dank,
Stefan