搜索
bottom↓
回复: 23

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

[复制链接]

出0入0汤圆

发表于 2013-2-4 10:03:12 | 显示全部楼层 |阅读模式
用mega128做控制芯片,用lcd12864画图,如果把三幅图的取模数组放进去都能显示,但是要是把第四五六以后的都加进去,那么四五六以后的图形都乱码,前三幅还可以正常显示。也将数组定义成volatile类型调试了

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入264汤圆

发表于 2013-2-4 10:08:32 来自手机 | 显示全部楼层
说的太笼统了,放代码出来瞅瞅。

出0入0汤圆

发表于 2013-2-4 10:03:13 | 显示全部楼层
你将图形的数据全部放入了SRAM区域。由于图片过大,超出了SRAM区域,故不能正确显示,建议将图形数据放入flash区域,需要那个图片用flash读写函数调用到SRAM区域显示。

出0入0汤圆

 楼主| 发表于 2013-2-4 10:34:07 | 显示全部楼层
fanice 发表于 2013-2-4 10:24
你将图形的数据全部放入了SRAM区域。由于图片过大,超出了SRAM区域,故不能正确显示,建议将图形数据放入fl ...

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

出0入0汤圆

 楼主| 发表于 2013-2-4 10:34:49 | 显示全部楼层
mcu_lover 发表于 2013-2-4 10:08
说的太笼统了,放代码出来瞅瞅。

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

出0入42汤圆

发表于 2013-2-4 10:44:04 | 显示全部楼层
用的啥编译器?

出0入0汤圆

发表于 2013-2-4 11:04:40 | 显示全部楼层
3楼 说的不错

出0入0汤圆

发表于 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,

出0入0汤圆

发表于 2013-2-4 11:30:00 | 显示全部楼层
读取数组
                                Lcd_WriteData(~pgm_read_byte(&menu_pic[menu_num][j*4+i*2]));
                                Lcd_WriteData(~pgm_read_byte(&menu_pic[menu_num][j*4+i*2+1]));

出0入0汤圆

发表于 2013-2-4 16:01:28 | 显示全部楼层
放在FLASH内 但HEX>64K时  也会出现问题的
不过估计楼主应该用不到64K以上吧

出0入0汤圆

发表于 2013-2-4 16:09:51 | 显示全部楼层
数据多了就会这样,你的图片信息全部放在变量里了,变量总数一般不能超过1Kbyte的
可以放在大一点的EEPROM里
或者
只要把unsigned char Photo1 [] PROGMEM =
改为unsigned char code Photo1 [] PROGMEM =
即可。

出0入0汤圆

发表于 2013-2-4 16:44:28 | 显示全部楼层
yklstudent 发表于 2013-2-4 16:01
放在FLASH内 但HEX>64K时  也会出现问题的
不过估计楼主应该用不到64K以上吧

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

出0入0汤圆

发表于 2013-2-4 18:13:39 | 显示全部楼层
ST_ATMEL_NXP 发表于 2013-2-4 16:44
这种问题现在的编译器已经解决了吧!以前用M128,ICCAVR的时候遇到过这种情况,图片数据太多,超过64K, ...

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

出0入0汤圆

发表于 2013-2-5 08:25:44 | 显示全部楼层
yklstudent 发表于 2013-2-4 18:13
编译过去 不代表就能正常运行吧
我以前用Atmel Studio6编译ATmega128  大于64K的部分就工作不正常
听说要 ...

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

出0入0汤圆

发表于 2013-2-5 08:51:28 | 显示全部楼层
ST_ATMEL_NXP 发表于 2013-2-5 08:25
好久不用M128了。昨天试了试,将数据分为两个.C文件存储,编译后,Flash的占有量为95%。但是没办法测试是 ...

看还能找别人帮试试

出0入0汤圆

 楼主| 发表于 2013-2-5 09:23:29 | 显示全部楼层
jimmy_xt 发表于 2013-2-4 10:44
用的啥编译器?

AVR-studio+WIN-avr

出0入0汤圆

 楼主| 发表于 2013-2-5 09:29:15 | 显示全部楼层
fanice 发表于 2013-2-4 11:28
包含头文件#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);
}

出0入0汤圆

 楼主| 发表于 2013-2-5 09:30:57 | 显示全部楼层
yklstudent 发表于 2013-2-4 16:01
放在FLASH内 但HEX>64K时  也会出现问题的
不过估计楼主应该用不到64K以上吧

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

出0入0汤圆

 楼主| 发表于 2013-2-5 09:31:57 | 显示全部楼层
清雨影 发表于 2013-2-4 16:09
数据多了就会这样,你的图片信息全部放在变量里了,变量总数一般不能超过1Kbyte的
可以放在大一点的EEPROM ...

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

出0入0汤圆

发表于 2013-2-5 09:37:28 | 显示全部楼层
无所谓的 难道放在程序区里 程序就不能读了? 代码稍微改下应该能行的吧!!!!

出0入0汤圆

 楼主| 发表于 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[i]=pgm_read_byte(&major[i]);//读取flash
}
    system_init();//系统初始化
    delay_ms(10);
    LCD_init();//液晶初始化
    delay_ms(10);
    write_com(0x01);    //清屏
    delay_ms(1);  
    display_graph(temp);//画图函数
    while(1);
}

出0入0汤圆

发表于 2013-2-5 11:21:15 | 显示全部楼层
LS这部分程序应该没问题 应该是其他问题影响了

出0入0汤圆

发表于 2013-2-5 12:17:27 | 显示全部楼层
ipoqing 发表于 2013-2-5 09:31
嗯,那如果要是放在eeprom中是不是也需要特殊的读取数据才行啊?

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

出0入0汤圆

 楼主| 发表于 2013-2-5 17:01:01 | 显示全部楼层
清雨影 发表于 2013-2-5 12:17
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;
}


回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 08:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表