ipoqing 发表于 2013-2-4 10:03:12

用mega128只能画三幅图,第四五六以后的就出错~~求高手

用mega128做控制芯片,用lcd12864画图,如果把三幅图的取模数组放进去都能显示,但是要是把第四五六以后的都加进去,那么四五六以后的图形都乱码,前三幅还可以正常显示。也将数组定义成volatile类型调试了

mcu_lover 发表于 2013-2-4 10:08:32

说的太笼统了,放代码出来瞅瞅。

fanice 发表于 2013-2-4 10:03:13

你将图形的数据全部放入了SRAM区域。由于图片过大,超出了SRAM区域,故不能正确显示,建议将图形数据放入flash区域,需要那个图片用flash读写函数调用到SRAM区域显示。

ipoqing 发表于 2013-2-4 10:34:07

fanice 发表于 2013-2-4 10:24 static/image/common/back.gif
你将图形的数据全部放入了SRAM区域。由于图片过大,超出了SRAM区域,故不能正确显示,建议将图形数据放入fl ...

那怎样读写flash上的呢?请大侠指教一二

ipoqing 发表于 2013-2-4 10:34:49

mcu_lover 发表于 2013-2-4 10:08 static/image/common/back.gif
说的太笼统了,放代码出来瞅瞅。

就是多个数组就显示乱码了,其他的都正常,单独显示也正常

jimmy_xt 发表于 2013-2-4 10:44:04

用的啥编译器?

sync765 发表于 2013-2-4 11:04:40

3楼 说的不错

fanice 发表于 2013-2-4 11:28:24

包含头文件#include <avr/pgmspace.h>


调用数组
/******************************************************************************/
//开机画面
/******************************************************************************/
unsigned char Photo1 [] PROGMEM ={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

fanice 发表于 2013-2-4 11:30:00

读取数组
                                Lcd_WriteData(~pgm_read_byte(&menu_pic));
                                Lcd_WriteData(~pgm_read_byte(&menu_pic));

yklstudent 发表于 2013-2-4 16:01:28

放在FLASH内 但HEX>64K时也会出现问题的
不过估计楼主应该用不到64K以上吧

清雨影 发表于 2013-2-4 16:09:51

数据多了就会这样,你的图片信息全部放在变量里了,变量总数一般不能超过1Kbyte的
可以放在大一点的EEPROM里
或者
只要把unsigned char Photo1 [] PROGMEM =
改为unsigned char code Photo1 [] PROGMEM =
即可。

ST_ATMEL_NXP 发表于 2013-2-4 16:44:28

yklstudent 发表于 2013-2-4 16:01 static/image/common/back.gif
放在FLASH内 但HEX>64K时也会出现问题的
不过估计楼主应该用不到64K以上吧

这种问题现在的编译器已经解决了吧!以前用M128,ICCAVR的时候遇到过这种情况,图片数据太多,超过64K,编译都编译不过去。

yklstudent 发表于 2013-2-4 18:13:39

ST_ATMEL_NXP 发表于 2013-2-4 16:44 static/image/common/back.gif
这种问题现在的编译器已经解决了吧!以前用M128,ICCAVR的时候遇到过这种情况,图片数据太多,超过64K, ...

编译过去 不代表就能正常运行吧
我以前用Atmel Studio6编译ATmega128大于64K的部分就工作不正常
听说要人为改东西的 不过对这方面不了解
所以哪个问题也没解决

ST_ATMEL_NXP 发表于 2013-2-5 08:25:44

yklstudent 发表于 2013-2-4 18:13 static/image/common/back.gif
编译过去 不代表就能正常运行吧
我以前用Atmel Studio6编译ATmega128大于64K的部分就工作不正常
听说要 ...

好久不用M128了。昨天试了试,将数据分为两个.C文件存储,编译后,Flash的占有量为95%。但是没办法测试是否正常运行,已经没有M128的板子了。现在都用M3的芯片了。

yklstudent 发表于 2013-2-5 08:51:28

ST_ATMEL_NXP 发表于 2013-2-5 08:25 static/image/common/back.gif
好久不用M128了。昨天试了试,将数据分为两个.C文件存储,编译后,Flash的占有量为95%。但是没办法测试是 ...

看还能找别人帮试试

ipoqing 发表于 2013-2-5 09:23:29

jimmy_xt 发表于 2013-2-4 10:44 static/image/common/back.gif
用的啥编译器?

AVR-studio+WIN-avr

ipoqing 发表于 2013-2-5 09:29:15

fanice 发表于 2013-2-4 11:28 static/image/common/back.gif
包含头文件#include




谢谢,已经明白是哪里出错了,但是,我没用大侠的读取方式,因为大侠的读取没看明白,我是这样做,但是也出错了:请指教
#include <avr/pgmspace.h>

prog_uchar major[]={。。。。。。。。。。。。。。};
void main()
{
    uchar *p;
    p=major;
    uchar temp=pgm_read_byte(p);//读取flash
    system_init();//系统初始化
    delay_ms(10);
    LCD_init();//液晶初始化
    delay_ms(10);
    write_com(0x01);    //清屏
    delay_ms(1);
    display_graph(temp);//画图函数
    while(1);
}

ipoqing 发表于 2013-2-5 09:30:57

yklstudent 发表于 2013-2-4 16:01 static/image/common/back.gif
放在FLASH内 但HEX>64K时也会出现问题的
不过估计楼主应该用不到64K以上吧

嗯,程序不会超过64kb的目前,编译器编译没问题现在就是读取flash数据时有点出错,因为之前没涉及到过这样的问题

ipoqing 发表于 2013-2-5 09:31:57

清雨影 发表于 2013-2-4 16:09 static/image/common/back.gif
数据多了就会这样,你的图片信息全部放在变量里了,变量总数一般不能超过1Kbyte的
可以放在大一点的EEPROM ...

嗯,那如果要是放在eeprom中是不是也需要特殊的读取数据才行啊?

jlhgold 发表于 2013-2-5 09:37:28

无所谓的 难道放在程序区里 程序就不能读了? 代码稍微改下应该能行的吧!!!!{:lol:}

ipoqing 发表于 2013-2-5 09:58:42

多谢楼上各位大侠的热心帮助,谢谢了!问题已经解决。

fanice 发表于 2013-2-4 11:28
包含头文件#include
谢谢,已经明白是哪里出错了,但是,我没用大侠的读取方式,因为大侠的读取没看明白,我是这样做,但是也出错了:请指教
#include <avr/pgmspace.h>

prog_uchar major[]={。。。。。。。。。。。。。。};
void main()
{
    uint i;
   for(i=0;i<1024;i++)
{   
    temp=pgm_read_byte(&major);//读取flash
}
    system_init();//系统初始化
    delay_ms(10);
    LCD_init();//液晶初始化
    delay_ms(10);
    write_com(0x01);    //清屏
    delay_ms(1);
    display_graph(temp);//画图函数
    while(1);
}

yklstudent 发表于 2013-2-5 11:21:15

LS这部分程序应该没问题 应该是其他问题影响了

清雨影 发表于 2013-2-5 12:17:27

ipoqing 发表于 2013-2-5 09:31 static/image/common/back.gif
嗯,那如果要是放在eeprom中是不是也需要特殊的读取数据才行啊?

EEPROM一般分为好几个扇区,指定地址就能读出该地址的数值。没什么特殊的,就是I2C总线会限制读写速度。详见EEPROM的驱动程序

ipoqing 发表于 2013-2-5 17:01:01

清雨影 发表于 2013-2-5 12:17 static/image/common/back.gif
EEPROM一般分为好几个扇区,指定地址就能读出该地址的数值。没什么特殊的,就是I2C总线会限制读写速度。 ...

我是刚接触avr没多久,之前没用过内部自带的#include<avr/eeprom.h>,都是自己编的存储程序,请问下您是怎样用内部的eeprom库的呢?:


void eeprom_write(unsigned int address,unsigned char data)
{
    while(EECR&(1<<EEWE));//等待上一次写完
    EEAR=address;
    EEDR=data;
    EECR|=(1<<EEMWE);
    EECR|=(1<<EEWE);//启动写操作
}

uchar eeprom_read(unsigned int address)
{
    while(EECR&(1<<EEWE));
    EEAR=address;
    EECR|=(1<<EERE);
    return EEDR;
}


页: [1]
查看完整版本: 用mega128只能画三幅图,第四五六以后的就出错~~求高手