搜索
bottom↓
回复: 4

MPLAB C18编译器变量值无法改变,求指导!

[复制链接]

出0入0汤圆

发表于 2017-2-14 23:09:56 | 显示全部楼层 |阅读模式
使用MPLAB C18编译器编写PIC的C程序,就是简单写了个LED闪烁函数,用for循环做的简单延时, 结果程序就一直循环在for循环,在线调试发现变量一直不变,所以程序一直在for里面循环,请坛友指导下,谢谢,下面附上我的代码。
  1. void main(void)
  2. {
  3.         TRISB = 0x00;               //###  Configure RB0-7 as output
  4.         LATB = 0x04;
  5.         //PORTB = 0x00;
  6.         PORTB = 0x04;

  7.     //### Your Code Here ###    //###  Enable external interrupt
  8.     //### Your Code Here ###    //###  Clear external interrupt flag
  9.     //### Your Code Here ###    //###  Enable external interrupt for falling edge
  10.     //### Your Code Here ###    //###  Enable High priority interrupt
  11.    while(1)
  12.    {
  13.                 PORTB = 0x00;
  14.                 delay();
  15.                 PORTB = 0x04;
  16.                 delay();
  17.    }
  18. }

  19. void delay(void)/*延时 1mS*/
  20. {
  21. unsigned char i,j;
  22. for(i=0;i<100;i++)
  23. {
  24.          ;
  25.     //for(j=0;j<142;j++);
  26. }
  27. }
复制代码

在线调试发现复位时,变量i的值信息是“out of scope”,运行后变成“restrict memory”,难道是内存不够了?郁闷啊,调试了一晚上了,求指导啊。

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

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2017-2-17 00:04:09 | 显示全部楼层
你把unsigned char i,j;定义成全局变量试试

出0入0汤圆

 楼主| 发表于 2017-2-20 12:28:08 | 显示全部楼层
yanzhiwei 发表于 2017-2-17 00:04
你把unsigned char i,j;定义成全局变量试试

已经解决了,就是要定义成全局变量,这个编译器很怪啊。还有个现象想请教一下,PORTA做输出IO输出高低电平怎么操作,我直接给PORTA赋值(像PORTA=0x01或PORTAbits.RA0=1)却只能在锁存器(LATA)上看到值端口却不能输出,而PORTB用以上任意一种都可以输出高低电平,请问是我哪里设置的不对么,端口方向什么的都配置了。

出0入0汤圆

发表于 2017-2-20 12:43:45 | 显示全部楼层
PORTA引脚复用数字口和模拟口的,如果你要设置成数字模式是要设置ANCONx寄存器的,具体操作看看datasheet里面PORTA端口的说明

出0入0汤圆

 楼主| 发表于 2017-3-11 10:54:38 | 显示全部楼层
yanzhiwei 发表于 2017-2-20 12:43
PORTA引脚复用数字口和模拟口的,如果你要设置成数字模式是要设置ANCONx寄存器的,具体操作看看datasheet里 ...

非常感谢您的指点,我现在又遇到一个问题,片上EEPROM写不进去,表现出的现象是:编译器在线调试观察EEPROM内部全是FF,我的擦写驱动是按照datasheet上的汇编写的c语言格式,网上说的BOD也是打开的,找到了几个相近片子的例程几乎一致,但就是写不进去,还请您再指导一下,以下附上我的代码和相关截图。
  1. void data_write(unsigned char addr,unsigned char value)
  2. {
  3.         EEADR = addr;                                //写目标地址,范围0-ff
  4.         EEDATA = value;                                //写目标值
  5.         EECON1bits.EEPGD = 0;                //指向EEPROM接口
  6.         EECON1bits.CFGS = 0;                //指向EEPROM/FLASH 区分config
  7.         INTCONbits.GIE = 0;                        //关闭全局中断
  8.         EECON1bits.WREN = 1;                //使能写功能
  9.         EECON2 = 0x55;                                //填入写序列 55h
  10.         EECON2 = 0xAA;                                //填入写序列 aah
  11.         EECON1bits.WR = 1;                        //使能写控制位
  12.         while(EECON1bits.WR == 1);        //等待写中断完成
  13.         INTCONbits.GIE = 1;                        //使能全局中断
  14.         PIR2bits.EEIF = 0;                        //清除写中断标志位
  15.         EECON1bits.WREN = 0;                //关闭写功能
  16. }

  17. int data_read(unsigned char addr)
  18. {       
  19.         EEADR = addr;                                //读目标地址,范围0-ff
  20.         EECON1bits.EEPGD = 0;                //指向EEPROM接口
  21.         EECON1bits.RD = 1;                        //使能读功能
  22.         return EEDATA;
  23. }
复制代码

时钟位配置


编译环境是MPLAB C18 调试器 PICKit3.5+
EEPROM地址手册上说范围是0x00-0xFF,我读写使用的地址是0x22,0x33,也没看到有什么位置说偏移地址啊,地址应该没错吧

地址组成关系如下


期待您的回复,不胜感激!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

本版积分规则

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

GMT+8, 2024-4-16 22:28

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

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