用C18读取pic18 rom常量

时间:2013-12-02 11:16:23

标签: c pic rom pic18 c18

我正在努力理解为什么在尝试从存储在rom中的多维表中读取时获取随机数据。

我有一个位图字符表,我想在OLED屏幕上显示。字符表太大而不适合ram而rom是它的自然之处。当我尝试从表中读取元素时,数据不是存储在表中的数据。

这是我尝试做的事情。我在使用它的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]);
}
}

如果我更改它以便数据适合ram它可以正常工作。所以问题必须是数据首先没有正确存储,或者我使用它的方式不正确。

我使用的Pic是18F27J53,数据表第7.1节(表读和表写)讨论了一些用于在程序存储器和RAM之间移动字节的汇编器操作。当我使用C时,我不确定这是否需要注意,或者编译器是否知道如何处理它。

2 个答案:

答案 0 :(得分:0)

将数据放在ROM(.txt部分)或RAM(.data部分)中与您面临的问题无关。

假设初始化是正确的并且您初始化所有元素(如果不这样做,则省略的元素将默认初始化为0),问题可能出在函数的实现中:PutImage。 由于尺寸变化时遇到问题,也许你有一些硬编码的值...

答案 1 :(得分:0)

好的相关问题及其答案让我(希望)走上正轨:Can I make a function that accepts both ram and rom pointers in Microchip C18?

还要感谢Pandrei指出PutImage的实现可能是原因。 我通过制作重复函数PutROMImage来接受代码工作,该函数接受“near rom char *” -type而不仅仅是“char *”,默认为ram。

因此C18不允许指向ram和rom以及PutImage -function参数的指针默认为ram。因此,将指针传递给位于rom中的数组会导致指针指向随机值。

我没有注意到代码中的这个缺陷,并且编译器不够聪明,不能抱怨。