Tiny13 řada čísel v paměti programu, ne v RAM (C)

Zdravím všechny. Potřebuji v tomto malém procesoru mít řadu čísel, podle kterých se budou vykonávat další operace. Jde mi o to, aby čísla byla nejlíp v paměti programu, ne v RAMce, tedy aby nezabírala zbytečný prostor. Jejich hodnoty se nebudou měnit. Jak je spravně zapsat? Zkoušel jsem něco takovéhoto:

const unsigned char hranice_pwm[25] = {27,28,32,38,41,46,49,53,56,60,62,68,73,78,81,86,89,92,96,100,104,109,113,118,122};

ale pokud potřebuji čísel víc a hlavně typ unsigned int, tak prostě program nefunguje (simulace v AVR studiu ano, v procesoru ne). V C se dokonale nevyznám, tak hledám radu zde…
Dík za nápady

:arrow_right: administrator: přejmenováno z "Tiny13 řada čísel v programu ©"

Zdarec,
“avr-libc-user-manual.pdf”, kapitola 5 “Data in Program Space”. Kdybys to nedal dohromady tak ti pošlu i příklad. Ovšem části kódu, ze kterých to složíš, tam jsou.

Takhle nějak:

const unsigned char Numeros [25] PROGMEM = {27,28,32,38,41,46,49,53,56,60,62,68,73,78,81,86,89,92,96,100,104,109,113,118,122};

Musíš si však uvědomit, že pro načítání dat z flash musíš použít speciální funkce (Např.: strcmp_P, strcopy_P, atd) z knihovny <avr/pgmspace.h> , protože je nemůžeš číst přímo.

piityy > Dík, to je přesně ono, co jsem potřeboval…
Divous > Dobrý postřeh, na čtení je potřeba použití složitější funkci, ale k dramatickému nárustu kódu naštěstí nedojde…

Výsledek teda nakonec vypadá asi takto (kdyby někdy někdo řešil stejný problém):

[code].
.
#include <avr/pgmspace.h>

const unsigned char promenna_char [25] PROGMEM = {27,28,32,38,41,46,49,53,56,60,62,68,73,78…
const unsigned int promenna_int [24] PROGMEM = {4500,2250,1500,1125,900,750,643,563,500…
.
.
.
pom1 = pgm_read_byte(&(promenna_char[0])); // nacteni prvni hodnoty promenne uchar z pameti do “pom1”

pom2 = pgm_read_word(&(promenna_int[0])); // nacteni prvni hodnoty promenne uint z pameti do “pom2”
[/code]