打印
[PIC®/AVR®/dsPIC®产品]

PIC18系列单片机使用大量RAM出问题

[复制链接]
1134|44
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heweibig|  楼主 | 2022-3-4 19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pzsh 于 2022-3-5 09:12 编辑

最近用PIC18单片机做LCD 液晶显示,其中页面显示用到很多数组,之前用PIC16 没发现什么异常,现在用PIC18,发现总是显示有些问题,要不就是显示不全,要不就是显示乱码

使用特权

评论回复
沙发
zhaoxqi| | 2022-3-4 19:31 | 只看该作者

还有什么现象?能再详细描述下吗?

使用特权

评论回复
板凳
heweibig|  楼主 | 2022-3-4 19:36 | 只看该作者
通过搜索,发现PIC18 在使用大数组或者大的连续RAM的时候,很容易出错! 真正的原因是什么呢?

使用特权

评论回复
地板
zhenykun| | 2022-3-4 19:39 | 只看该作者
好像也没有一个确切的解决问题的办法?

使用特权

评论回复
5
wyjie| | 2022-3-4 19:39 | 只看该作者
用C语言吧。哈哈哈

使用特权

评论回复
6
wangpe| | 2022-3-4 19:41 | 只看该作者
大的?  超过256?

使用特权

评论回复
7
jlyuan| | 2022-3-4 19:43 | 只看该作者
我是通过  修改链接文件解决的

使用特权

评论回复
8
zwll| | 2022-3-4 19:45 | 只看该作者
给数组指定  bank   你可以试一试

使用特权

评论回复
9
dengdc| | 2022-3-4 19:47 | 只看该作者

目前也在用PIC18,还没碰到这样的问题

使用特权

评论回复
10
heweibig|  楼主 | 2022-3-4 19:47 | 只看该作者
首先看PWR和USB两个LED灯是否亮了。如果PWR灯不亮,那是电源有问题,如果PWR灯亮了,而USB灯没有亮,那就是usb驱动没有安装好。

使用特权

评论回复
11
jlyuan| | 2022-3-4 19:49 | 只看该作者
显然程序写的不好。
即使LCD显示也不需要多大的RAM

使用特权

评论回复
12
stly| | 2022-3-4 19:51 | 只看该作者
多大的数组? 我觉得楼主应该把问题描述得详细一点,最好把关键得代码贴上,大神们才好帮你

使用特权

评论回复
13
pengf| | 2022-3-4 19:54 | 只看该作者
没有出现,你所说的问题,程序的问题吧!111

使用特权

评论回复
14
renyaq| | 2022-3-4 19:56 | 只看该作者
如果你的数组里面的元素是固定不变的,可以在定义的时候,数组名前面增加“const“限定符,

使用特权

评论回复
15
jiajs| | 2022-3-4 19:59 | 只看该作者
这样,数组是保存在ROM里面,而不是RAM里面,当然读取数组的效率会慢一点点

使用特权

评论回复
16
xxmmi| | 2022-3-4 20:01 | 只看该作者
你可以
试试看,看能不能解决你的问题

使用特权

评论回复
17
kangzj| | 2022-3-4 20:02 | 只看该作者
看来学习第二门语言很重要啊。

使用特权

评论回复
18
heweibig|  楼主 | 2022-3-4 20:06 | 只看该作者
加上const 更不显示了

使用特权

评论回复
19
heweibig|  楼主 | 2022-3-4 20:09 | 只看该作者

unsigned char Page = 0; //显示 页面 标志
unsigned char  **1[16] = "电动机智能控制器";
unsigned char  **2[16] = "      V1.0     ";
unsigned char  **3[16] = "    河北XXXX    ";
unsigned char  **4[16] = "XXXXXXXX有限公司";

unsigned char about1[16] = "电动机智能控制器";
unsigned char about2[16] = "  V1.0(160910)  ";
unsigned char about3[16] = "河北XXXX电气研制";
unsigned char about4[16] = "  0311-XXXXXXXX ";

unsigned char Index1[16] = "    系统菜单    ";
unsigned char Index2[16] = "  1:查看系统参数";
unsigned char Index3[16] = "  2:设置系统参数";
unsigned char Index4[16] = "  3:查看报警记录";

unsigned char Index5[16] = "  4:关于本机    ";

unsigned char  setup1[16] = "  设置参数菜单  ";
unsigned char  setup2[16] = "  1:电流参数设置";
unsigned char  setup3[16] = "  2:电压参数设置";
unsigned char  setup4[16] = "  3:轮换延时设置";


unsigned char  Error1 [16] = "    报    警    ";
unsigned char  Error31[16] = "    负载过流    ";
unsigned char  Error32[16] = "    负载电流低  ";
unsigned char  Error33[16] = "    电源过压    ";
unsigned char  Error34[16] = "    电源电压低  ";
unsigned char  Error35[16] = "    电源缺相    ";


unsigned char  setup5[16] = "  4:运行显示页面";
unsigned char  setup6[16] = "  5:时钟日历设置";
unsigned char  setup7[16] = "  6:修改设置密码";
unsigned char  setup8[16] = "  7:恢复出厂设置";

unsigned char RESET_2 [16]= "确认恢复出厂设置";
unsigned char RESET_OK[16]= "恢复出厂设置成功";

unsigned char  setup9[16] = "  8:厂家内部设置";

unsigned char  I_max1[16] = "电流上限:000 A ";
unsigned char  I_min3[16] = "电流下限:000 A ";

unsigned char  U_max1[16] = "电压上限:000 V ";
unsigned char  U_min3[16] = "电压下限:000 V ";

unsigned char Rota_delay1[16]="轮换时长:000小时";
unsigned char Rota_delay3[16]="延时时长:000秒钟";

unsigned char   Power_Work1[16] = "电源状态:000秒钟";
unsigned char   Power_Work3[16] = "负载状态:000秒钟";

extern unsigned char  time1[16]; //"2016年  09月01日"引用(引用变量不能有初始值)
extern unsigned char  time3[16]; //"    00:00:00    "引用 (引用变量不能有初始值)

unsigned char   in_pwd1[16] = "请输入密码:**** ";
unsigned char   YES_NO4[16] = "确认        取消";
unsigned char  pwd_err2[16] = "    密码错误    ";

unsigned char in_New_Pwd1[16]="输入新密码:**** ";
unsigned char in_New_Pwd3[16]="再输入一次:**** ";

unsigned char Write_User_Pwd_OK2 [16]="  密码修改成功  ";
unsigned char Write_User_Pwd_Err2[16]="输入错误  未修改";

unsigned char Work_End_2[16] ="返回代码: 0001  ";//第2行

unsigned char Err_Note1[16] = "    报警记录    ";
unsigned char Err_Note2[16] = "第 001条共 000条";
unsigned char Err_Note3[16] = "2016年09月01日  ";
unsigned char Err_Note4[16] = "00:00:00  过流  ";

unsigned char Err_Note5[16] = "  无报警记录    ";

extern unsigned char  Page1  [16] ;
extern unsigned char  U1A_I1A[16] ;
extern unsigned char  U1B_I1B[16] ;
extern unsigned char  U1C_I1C[16] ;

unsigned char  Read_Err_Notes [8];  //读报警记录缓存//EE报警记录元素 0=序号;1=年;2=月;3=日;4=时;5=分;6=秒;7=事件内容( 1=过流; 2=电流低;3=过压;4=电压低;5=缺相; )
unsigned char  Write_Err_Notes[8]; //写报警记录缓存

unsigned char Work_Mode_1[16] = "运行模式:       ";
unsigned char Work_Mot1_2[16] = "负载1 状态:     ";
unsigned char Work_Mot2_3[16] = "负载2 状态:     ";
unsigned char Work_Mot3_4[16] = "负载3 状态:     ";

unsigned char Table[10] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39}; //"0、1、2、3、4、5、6、7、8、9 ASCII码"

使用特权

评论回复
20
heweibig|  楼主 | 2022-3-4 20:12 | 只看该作者
没用外部我用片67K22片程序空间64K目前用概55%我看C18用户指南说变量能访问16位址0xFFFF内我部代码掉程序变点编译看map文件量数组址位于0xCBE8候变量访问量数组我尝试使用near限定符能量数组配0xFFFF内请问事何解决

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

869

主题

13089

帖子

7

粉丝