Vkládání konstant
Ales Povalac
konf@alpov.net
Středa Červen 6 22:06:17 CEST 2007
Zdravim,
pro cteni jednotlivych bajtu je nejjednodusi pouzit fci
pgm_read_byte(&pole[i]), existuji i varianty pro word a dword.
Ukazka kousku ktery mi funguje (s klasickym defaultnim Makefile na mega8):
const unsigned char PROGMEM hamming[256] = {
0x00, 0x03, 0x05, 0x06, 0x06, 0x05, 0x03, 0x00,
0x07, 0x04, 0x02, 0x01, 0x01, 0x02, 0x04, 0x07,
...
0x03, 0x00, 0x06, 0x05, 0x05, 0x06, 0x00, 0x03,
};
unsigned char hamming_get(unsigned char c)
{
return pgm_read_byte(&hamming[c]);
}
Tabulka je umistena ve flash, pro cteni generuje avr-gcc instrukci LPM.
Pokud nebudou konstanty v dolnich 64KB flash (coz se muze u mega2560
stat), je myslim potreba pouzit _far funkce (pgm_read_byte_far() a
spol.), ktere ctou pomoci ELPM.
AP
kral.j@centrum.cz napsal(a):
> Ještě jsem se nedopracoval konečného výsledku a tak něco o průběžném
> stavu. Doplňuji, že je to pro ATmega2560, používám AvrStudio v
> kombinaci s WinAvr. Takže s pomocí pgmspace.h se mi příkazem
>
> const int8_t pole[] PROGMEM = {0x52, 0x61, 0x26};
>
> podařilo uložit to pole do programové paměti. Ukládání je vždy od
> adresy 0x0074 a platí i pro jiné typy konstant. Když program spustím
> v simulátoru a najedu kurzorem na konstantu pole[ ], hláška mi
> tvrdošíjně tvrdí, že je uložena na adrese 0x00E4. No s tím se asi
> musím smířit. S čím se ale smířit nemohu je to, že nevím, jak načíst
> nějaký prvek konstanty do proměnné. Soudím že bych měl použít funkci
> memcpy_P( ), ale z manuálu nevím jak, resp. co předat za parametry.
> Můžete ještě někdo poradit? Král
>
Další informace o konferenci Hw-list