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

求救:PIC18系列单片机使用大量RAM出问题的解决办法?

[复制链接]
2925|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
QQ826220679|  楼主 | 2016-9-23 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近用PIC18单片机做LCD 液晶显示,其中页面显示用到很多数组,之前用PIC16 没发现什么异常,现在用PIC18,发现总是显示有些问题,要不就是显示不全,要不就是显示乱码,通过搜索,发现PIC18 在使用大数组或者大的连续RAM的时候,很容易出错! 真正的原因是什么呢?好像也没有一个确切的解决问题的办法?

这帖子倡议大家把使用   PIC18系列芯片定义大数组成功的经验的经验分享一下,也让这方便使用有困惑的朋友,从中受益!

沙发
QQ826220679|  楼主 | 2016-9-23 11:53 | 只看该作者
希望大家能积极回帖,目前悬赏分数最高!谢谢大家!

使用特权

评论回复
板凳
xiuxiu6581772| | 2016-9-27 10:05 | 只看该作者
大的?  超过256?             我是通过  修改链接文件解决的。    给数组指定  bank   你可以试一试

使用特权

评论回复
地板
黑洞不黑| | 2016-10-10 10:01 | 只看该作者
目前也在用PIC18,还没碰到这样的问题

使用特权

评论回复
5
shizaigaole| | 2016-10-10 20:04 | 只看该作者
显然程序写的不好。
即使LCD显示也不需要多大的RAM

使用特权

评论回复
6
netbeans| | 2016-10-11 11:58 | 只看该作者
多大的数组? 我觉得楼主应该把问题描述得详细一点,最好把关键得代码贴上,大神们才好帮你

使用特权

评论回复
7
dogglove| | 2016-10-18 10:35 | 只看该作者
没有出现,你所说的问题,程序的问题吧!111

使用特权

评论回复
8
GeekyGeek| | 2016-10-18 13:12 | 只看该作者
如果你的数组里面的元素是固定不变的,可以在定义的时候,数组名前面增加“const“限定符,
这样,数组是保存在ROM里面,而不是RAM里面,当然读取数组的效率会慢一点点。你可以
试试看,看能不能解决你的问题

使用特权

评论回复
9
QQ826220679|  楼主 | 2016-10-22 22:12 | 只看该作者
GeekyGeek 发表于 2016-10-18 13:12
如果你的数组里面的元素是固定不变的,可以在定义的时候,数组名前面增加“const“限定符,
这样,数组是保 ...

加上const 更不显示了

使用特权

评论回复
10
QQ826220679|  楼主 | 2016-10-22 22:21 | 只看该作者
shizaigaole 发表于 2016-10-10 20:04
显然程序写的不好。
即使LCD显示也不需要多大的RAM


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码"

使用特权

评论回复
11
QQ826220679|  楼主 | 2016-10-22 22:27 | 只看该作者
QQ826220679 发表于 2016-10-22 22:21
unsigned char Page = 0; //显示 页面 标志
unsigned char  **1[16] = "电动机智能控制器";
unsigned  ...

http://zhidao.baidu.com/link?url=lqEaB_LmHGpty6IeJEUzBjqFkNXJkBAYxQLqPLoCslPe73YQYy2s11g2nVKAbVx_EF6G264LuFnFVf2d7D_zE4ewFgu6PQmGH1Fv9JzwnNy

使用特权

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

使用特权

评论回复
13
shizaigaole| | 2016-10-23 13:42 | 只看该作者
QQ826220679 发表于 2016-10-22 22:12
加上const 更不显示了

前面定义成const型,
显示的时候读到显示RAM里面,
显示ram可以很小

使用特权

评论回复
14
QQ826220679|  楼主 | 2016-10-23 14:28 | 只看该作者
shizaigaole 发表于 2016-10-23 13:42
前面定义成const型,
显示的时候读到显示RAM里面,
显示ram可以很小

const 显示更不行
现在换平台了,STM23F103 ,移植过去,显示正常。
之前一直是PIC的最忠诚的用户,5年之后,这次浪费了一个半月,被迫放弃PIC。
伤心!
差点丢了工作。唉!

满满的都是泪啊!

使用特权

评论回复
15
shizaigaole| | 2016-10-23 14:34 | 只看该作者
本帖最后由 shizaigaole 于 2016-10-23 14:36 编辑

const显示为何会不行??
几乎所有的关于LCD的显示都是,需要显示的内容定义成CONST型。

PIC16都可以,何况PIC18???

使用特权

评论回复
16
shizaigaole| | 2016-10-23 14:51 | 只看该作者
本帖最后由 shizaigaole 于 2016-10-23 15:26 编辑

const unsigned char  **1[16] = "电动机智能控制器";
const unsigned char  **2[16] = "      V1.0     ";
const unsigned char  **3[16] = "    河北XXXX    ";
const unsigned char  **4[16] = "XXXXXXXX有限公司";

unsigned char dispBuf[16];
unsigned char i;

//显示第1行
for(i = 0; i< 16; i++)
    dispBuf = **1;
dispLcd(0,0,dispBuf);

//显示第2行
for(i = 0; i< 16; i++)
    dispBuf = **1;
dispLcd(1,0,dispBuf);

//显示第3行
for(i = 0; i< 16; i++)
    dispBuf = **2;
dispLcd(2,0,dispBuf);

//显示第4行
for(i = 0; i< 16; i++)
    dispBuf = **3;
dispLcd(3,0,dispBuf);

这样不行吗?

使用特权

评论回复
17
shizaigaole| | 2016-10-23 14:54 | 只看该作者
QQ826220679 发表于 2016-10-23 14:28
const 显示更不行
现在换平台了,STM23F103 ,移植过去,显示正常。
之前一直是PIC的最忠诚的用户,5年之 ...

如果因此要换平台,真的要好好反思一下了。
如果PIC18都不能驱动LCD,
MICROCHIP早就应该倒闭,

想想,那么多人都可以,自己不可以,
就更改自己把问题解决掉

使用特权

评论回复
18
michaellengleng| | 2016-11-10 10:50 | 只看该作者
MICROCHIP代理商 我们有专业的PIC工程师为您服务

使用特权

评论回复
19
中浩然| | 2020-8-10 16:13 | 只看该作者
遇到相似问题,以前用PIC12/16/24,各种单片机包括STM32都没有遇到过这个问题。只有用18的时候遇到这个奇葩问题。可以肯定的是用CONST 死的更快。。无法理解!!!!!!!!!!

使用特权

评论回复
20
wooda| | 2020-8-10 18:33 | 只看该作者
unsigned char xxx[xx]
然后初始化的时候memcpy (xxx,"初始化内容",lengthof("初始化内容"));
应该就可以了

使用特权

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

本版积分规则

13

主题

170

帖子

1

粉丝