用mega128只能画三幅图,第四五六以后的就出错~~求高手
用mega128做控制芯片,用lcd12864画图,如果把三幅图的取模数组放进去都能显示,但是要是把第四五六以后的都加进去,那么四五六以后的图形都乱码,前三幅还可以正常显示。也将数组定义成volatile类型调试了 说的太笼统了,放代码出来瞅瞅。 你将图形的数据全部放入了SRAM区域。由于图片过大,超出了SRAM区域,故不能正确显示,建议将图形数据放入flash区域,需要那个图片用flash读写函数调用到SRAM区域显示。 fanice 发表于 2013-2-4 10:24 static/image/common/back.gif你将图形的数据全部放入了SRAM区域。由于图片过大,超出了SRAM区域,故不能正确显示,建议将图形数据放入fl ...
那怎样读写flash上的呢?请大侠指教一二 mcu_lover 发表于 2013-2-4 10:08 static/image/common/back.gif
说的太笼统了,放代码出来瞅瞅。
就是多个数组就显示乱码了,其他的都正常,单独显示也正常 用的啥编译器? 3楼 说的不错 包含头文件#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,
读取数组
Lcd_WriteData(~pgm_read_byte(&menu_pic));
Lcd_WriteData(~pgm_read_byte(&menu_pic)); 放在FLASH内 但HEX>64K时也会出现问题的
不过估计楼主应该用不到64K以上吧 数据多了就会这样,你的图片信息全部放在变量里了,变量总数一般不能超过1Kbyte的
可以放在大一点的EEPROM里
或者
只要把unsigned char Photo1 [] PROGMEM =
改为unsigned char code Photo1 [] PROGMEM =
即可。
yklstudent 发表于 2013-2-4 16:01 static/image/common/back.gif
放在FLASH内 但HEX>64K时也会出现问题的
不过估计楼主应该用不到64K以上吧
这种问题现在的编译器已经解决了吧!以前用M128,ICCAVR的时候遇到过这种情况,图片数据太多,超过64K,编译都编译不过去。 ST_ATMEL_NXP 发表于 2013-2-4 16:44 static/image/common/back.gif
这种问题现在的编译器已经解决了吧!以前用M128,ICCAVR的时候遇到过这种情况,图片数据太多,超过64K, ...
编译过去 不代表就能正常运行吧
我以前用Atmel Studio6编译ATmega128大于64K的部分就工作不正常
听说要人为改东西的 不过对这方面不了解
所以哪个问题也没解决 yklstudent 发表于 2013-2-4 18:13 static/image/common/back.gif
编译过去 不代表就能正常运行吧
我以前用Atmel Studio6编译ATmega128大于64K的部分就工作不正常
听说要 ...
好久不用M128了。昨天试了试,将数据分为两个.C文件存储,编译后,Flash的占有量为95%。但是没办法测试是否正常运行,已经没有M128的板子了。现在都用M3的芯片了。 ST_ATMEL_NXP 发表于 2013-2-5 08:25 static/image/common/back.gif
好久不用M128了。昨天试了试,将数据分为两个.C文件存储,编译后,Flash的占有量为95%。但是没办法测试是 ...
看还能找别人帮试试 jimmy_xt 发表于 2013-2-4 10:44 static/image/common/back.gif
用的啥编译器?
AVR-studio+WIN-avr 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);
} yklstudent 发表于 2013-2-4 16:01 static/image/common/back.gif
放在FLASH内 但HEX>64K时也会出现问题的
不过估计楼主应该用不到64K以上吧
嗯,程序不会超过64kb的目前,编译器编译没问题现在就是读取flash数据时有点出错,因为之前没涉及到过这样的问题 清雨影 发表于 2013-2-4 16:09 static/image/common/back.gif
数据多了就会这样,你的图片信息全部放在变量里了,变量总数一般不能超过1Kbyte的
可以放在大一点的EEPROM ...
嗯,那如果要是放在eeprom中是不是也需要特殊的读取数据才行啊? 无所谓的 难道放在程序区里 程序就不能读了? 代码稍微改下应该能行的吧!!!!{:lol:} 多谢楼上各位大侠的热心帮助,谢谢了!问题已经解决。
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);
}
LS这部分程序应该没问题 应该是其他问题影响了 ipoqing 发表于 2013-2-5 09:31 static/image/common/back.gif
嗯,那如果要是放在eeprom中是不是也需要特殊的读取数据才行啊?
EEPROM一般分为好几个扇区,指定地址就能读出该地址的数值。没什么特殊的,就是I2C总线会限制读写速度。详见EEPROM的驱动程序 清雨影 发表于 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]