чтение констант pic18 rom с помощью C18


Я изо всех сил пытаюсь понять, почему я получаю случайные данные, пытаясь прочитать из многомерной таблицы, которая хранится в ПЗУ.

У меня есть таблица растровых символов, которую я хочу отобразить на OLED-экране. Таблица символов слишком велика, чтобы поместиться в оперативной памяти, и rom является естественным местом для нее. Когда я пытаюсь прочитать элементы из таблицы, данные не хранятся в таблице.

Вот что я пытаюсь сделать. У меня есть bitmap, объявленный как многомерный массив по просьбе 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, я не уверен, что это то, что мне нужно знать, или компилятор знает, как с этим справиться.

2 2

2 ответа:

Имея данные в ROM (.раздел txt) или ОЗУ (.раздел данных) не имеет ничего общего с проблемой, с которой вы столкнулись.

Предполагая, что инициализация правильна и вы инициализируете все элементы (если вы этого не сделаете, то элементы, оставшиеся без инициализации, будут по умолчанию инициализированы в 0), проблема может быть в реализации функции: PutImage. Поскольку у вас возникают проблемы при изменении размера, возможно, у вас есть какие-то жестко закодированные значения...

ОК связанный вопрос и его ответ привели меня (надеюсь) в нужное русло: могу ли я сделать функцию, которая принимает как ram, так и ROM указатели в микрочипе C18?

И спасибо Пандрею также за указание на то, что реализация if PutImage может быть причиной. Я получил код, работающий, делая дублирующую функцию PutROMImage, которая принимает "near rom char*" - введите вместо просто " char*", который по умолчанию ОЗУ.

Таким образом, C18 не позволяет указателям указывать как на ОЗУ, так и на ПЗУ и putimage-параметр функции по умолчанию ОЗУ. Таким образом, передача указателя на массив, который находится в ПЗУ, приводит к указателю на случайные значения.

Я не заметил этого недостатка в коде, и компилятор не был достаточно умен, чтобы жаловаться на это.