Arduino Arrays

bprosman

Golden Member

In de Keil compiler kun je een array definieren als "code" waarmee hij in het flash/eprom geheugen opgeslagen wordt.

Bijvoorbeeld :

c code:

unsigned char code segm_table[] = {
    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

Dit wil ik ook bij een Arduino doen maar het lukt me niet.
Ik heb deze array :

c code:

const byte EEPROM_default[] = {10, 25, 5, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 
                                        0, 0, 1, 0, 1, 1, 1, 1, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3a, 0x3b, 0x3c, 0x3d, 0x3f};

Deze werkt, maar kost RAM geheugen.

Gebruik ik deze :

c code:

const byte EEPROM_default[] PROGMEM = {10, 25, 5, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 
                                        0, 0, 1, 0, 1, 1, 1, 1, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3a, 0x3b, 0x3c, 0x3d, 0x3f};

Dan leest hij dit terug :

0 - 0
1 - B8
2 - 0
3 - 0
4 - 1
5 - 3
6 - 0
7 - B8
8 - FC
9 - 0
A - 0
B - 0
C - 0
D - 0
E - 0
F - 0
10 - B8
11 - B8
12 - B8
13 - B8
14 - B8
15 - B8
16 - B8
17 - B8
18 - B8
19 - B8
1A - B8
1B - B8
1C - B8
1D - B8
1E - B8
1F - B8
20 - B8
21 - B8
22 - B8
23 - B8
24 - B8
25 - B8
26 - B8
27 - B8
28 - B8
29 - B8
2A - B8
2B - B8
2C - B8
2D - B8
2E - B8
2F - B8
30 - B8
31 - B8
32 - B8
33 - B8
34 - 1
35 - 4
36 - 3B
37 - 0
38 - 0
39 - B8
3A - 0
3B - B8
3C - 0
3D - F8
3E - FE
3F - FF

Weet iemand raad ?

De jongere generatie loopt veel te vaak zijn PIC achterna.

Die PROGMEM methode is correct. Zo moet dat. Dan gaat de array naar flash geheugen.

Maar dan moet je wel speciale functies gebruiken om de data weer terug te lezen. Dat gaat bijvoorbeeld met pgm_read_byte(Address).

bprosman

Golden Member

Ok, maar dat wordt tricky dan want ik weet niet waar de compiler m neerzet in Flash.

De jongere generatie loopt veel te vaak zijn PIC achterna.
eSe

Honourable Member

De compiler "zet hem neer" onder de naam die jij hem hebt gegeven, in dit geval EEPROM_default.

v.b. byte data = pgm_read_byte(EEPROM_default + 'offset');

Groetjes,
eSe

CChheecckk yyoouurr dduupplleexx sswwiittcchh..

Je kunt er ook voor kiezen om de data direct naar de Eeprom te compileren als je dat wilt. Dat gaat dan met EEMEM ipv PROGMEM.
Maar dan heb je weer andere funkties nodig om te lezen.

Dat staat beschreven in de compiler documentatie.
Zie bijvoorbeeld : http://www.nongnu.org/avr-libc/user-manual/index.html

En voor PROGMEM : http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

bprosman

Golden Member

@eSe,

Dank, ga ik testen vanavond.

@deKees,

Direct naar EEPROM compileren moet ik even over nadenken/testen, deze waarden zijn voor een "Virgin" of corrupte EEProm.

De jongere generatie loopt veel te vaak zijn PIC achterna.