2012-08-29 3 views
3

Tenir compte cet extrait, compilé avec Arduino IDE:tableau d'octets Arduino PROGMEM

PROGMEM char charSet[] = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xA , 0x6, 0xE, 0x1, 0x9,0x5, 0xD, 0x3,0xB,0x7,0xF }; 
char reversed[]   = { 0x0, 0x8, 0x4, 0xc, 0x2, 0xA , 0x6, 0xE, 0x1, 0x9,0x5, 0xD, 0x3,0xB,0x7,0xF }; 
char ff; 

for (int i=0; i < 16; i++) { 
    Serial.print(" "); 
    Serial.print(reversed[i], HEX); 
} 

Serial.println(" "); 
for (int i=0; i < 16; i++) { 
    Serial.print(" "); 
    ff = pgm_read_byte(&charSet[i]); 
    Serial.print(ff); 
} 

je me attends les deux pour les boucles pour produire une même sortie. Mais la sortie est:

0 8 4 C 2 A 6 E 1 9 5 D 3 B 7 F 
    FFFFFF94 FFFFFFB0 6 FFFFFF80 FFFFFF91 FFFFFFC7 3 62 FFFFFFE3 E FFFFFF94 5E 29 FFFFFF99 23 39 

Qu'est-ce qui me manque?

Répondre

1

Eh bien la réponse était la déclaration PROGMEM. J'ai dû le sortir de la fonction, en ajoutant const mot-clé. D'autres modifications en tant que types de données ne fonctionnaient pas.

La réponse complète est sur Arduino forum.

0

Vous avez le mauvais type de données. De http://arduino.cc/en/Reference/PROGMEM:

Certains bogues cryptés sont générés en utilisant des types de données ordinaires pour les appels de mémoire programme.

Vous ne pouvez pas utiliser char - vous devez utiliser prog_char

Alors:

PROGMEM prog_char charSet[] = {0x0, 0xB} 

Cela devrait fonctionner.

par la voie: Vous ne devez pas faire Serial.println(" "); Vous pouvez simplement faire Serial.println();

0
PROGMEM char charSet[] = ... 

Ce n'est pas bon - pour les données PROGMEM, vous ne pouvez pas utiliser des types ordinaires en mémoire. Ce que vous devez faire est

PROGMEM prog_char charSet[] = ... 
4

Oui, le mot clé const est manquant.

Il est probablement pas une bonne idée d'utiliser prog_char, comme il est marqué comme dépréciée dans gcc-avr, voir avr/pgmspace.h