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