Я изо всех сил пытаюсь понять, почему я получаю случайные данные при попытке чтения из многомерной таблицы, хранящейся в ПЗУ.
У меня есть таблица растровых символов, которую я хочу отобразить на OLED-экране. Таблица символов слишком велика, чтобы поместиться в оперативной памяти, и ПЗУ - естественное место для нее. Когда я пытаюсь прочитать элементы из таблицы, данные не те, что хранятся в таблице.
Вот что я пытаюсь сделать. У меня есть растровое изображение, объявленное как многомерный массив в начале C-файла, где оно используется:
rom const char number[15][4][20] = { {
{0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0x70, 0x78, 0x38, 0x38, 0x38, 0x38, 0x78, 0x70, 0xf0, 0xe0, 0xc0, 0x00, 0x00},// row 1 columns 19
{0x00,...
Здесь я пытаюсь прочитать данные и вывести их на экран:
for(i=0; i<4; i++)
{
PutImage(number[digit][i],20,4,offset,i+2);
}
Реализация функции PutImage:
void PutImage(char ptr[], unsigned char sizex, unsigned char sizey, unsigned char startx, unsigned char starty)
{
unsigned char _page, _column;
//startx += OFFSET;
OledWriteCommand(0xb0+starty);
OledWriteCommand(startx&0x0F);
OledWriteCommand(0x10 | ((startx>>4)&0x0F));
for(_column=0; _column<sizex; _column++)
{
OledWriteData(ptr[_column]);
}
}
Если я изменю его так, чтобы данные помещались в оперативную память, все работает нормально. Таким образом, проблема должна быть либо в том, что данные изначально хранятся неправильно, либо в том, как я их использовал неправильно.
Я использую рисунок 18F27J53, а в разделе 7.1 таблицы данных (чтение и запись таблиц) рассказывается о некоторых операциях ассемблера, которые используются для перемещения байтов между памятью программы и оперативной памятью. Поскольку я использую C, я не уверен, что мне нужно знать об этом, или компилятор знает, как с этим справиться.