Przestrzeń adresowa Atmegi8 jest 16bitowa, stąd też zadeklarowałem zmienną uint16_t.
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
/** \ingroup avr_pgmspace
\def pgm_read_word(address_short)
Read a word from the program space with a 16-bit (near) address.
\note The address is a byte address.
The address is in the program space. */
edit. jeszcze to się przyda
#define pgm_read_byte_near(address_short) __LPM((uint16_t)(address_short))
/** \ingroup avr_pgmspace
\def pgm_read_word_near(address_short)
Read a word from the program space with a 16-bit (near) address.
\note The address is a byte address.
The address is in the program space. */
co prowadzi do:
#define __LPM(addr) __LPM_classic__(addr)
a kończy się na assemblerze:
#define __LPM_classic__(addr) \
(__extension__({ \
uint16_t __addr16 = (uint16_t)(addr); \
uint8_t __result; \
__asm__ __volatile__ \
( \
"lpm" "\n\t" \
"mov %0, r0" "\n\t" \
: "=r" (__result) \
: "z" (__addr16) \
: "r0" \
); \
__result; \
}))
const uint8_t ssd1306xled_font31x47_1 [4][32] PROGMEM = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xE0,0xF0,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//00000000,00000000,00000000,00000000,
//00000000,00000000,00000000,00000000,
//00000000,00000001,11111100,00000000,
//00000000,00000001,11111100,00000000,
//00000000,00000011,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00011111,11111100,00000000,
//00000011,11111111,11111100,00000000,
{0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x03,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//00000011,11111111,11111100,00000000,
//00000001,11111111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x30,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00000111,11111100,00000000,
//00000000,00001111,11111110,00000000,
//00000000,00011111,11111111,00000000,
//00000000,00000000,00000000,00000000,
//00000000,00000000,00000000,00000000,
};
edit. Przy kompilacji wyskakuje
subscripted value is neither array nor pointer nor vector GccApplication2 C:\Users\Pawel\Documents\Atmel Studio\7.0\GccApplication2\GccApplication2\ssd1306xled31x47.c 78
przy czym 78 linijka to ssd1306_send_byte(pgm_read_byte(*adr[templine][i]));