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

PIC单片机非初始化变量问题

[复制链接]
1913|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
529515910|  楼主 | 2013-12-9 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 529515910 于 2013-12-9 14:43 编辑

1.有些PIC单片机内部没有EEPROM,当要记录一些变量时(上电复位非初始化,程序开始要将其提取出来使用的),那是不是得烧两次程序(第一次给它赋初值,第二次将这句删掉再烧入)?
2. PORTB已设置为输出,写的测试程序如下:
   persistent unsigned char POS;
   .....
   PORTB = POS;
   POS = PORTB;
   .....
   按理说不管 POS初始值为多少,PORTB在每次复位时都以同一个值输出。但我测得PORTB在每次复位时老发生变化,但基本在0110 0001 和  0010 0001 之间变化。
   一直想不明白,是不是非初始化变量不是这样用的?
沙发
yewuyi| | 2013-12-9 15:29 | 只看该作者
1.有些PIC单片机内部没有EEPROM,当要记录一些变量时(上电复位非初始化,程序开始要将其提取出来使用的),那是不是得烧两次程序(第一次给它赋初值,第二次将这句删掉再烧入)?
RE:没搞懂你到底想说什么?想干什么?想得到好的回答的前提就是正确的描述自己的问题。
2. PORTB已设置为输出,写的测试程序如下:
   persistent unsigned char POS;
   .....
   PORTB = POS;
   POS = PORTB;
   .....
   按理说不管 POS初始值为多少,PORTB在每次复位时都以同一个值输出。但我测得PORTB在每次复位时老发生变化,但基本在0110 0001 和  0010 0001 之间变化。
   一直想不明白,是不是非初始化变量不是这样用的?
RE:谁告诉你都会‘以同一个值输出’?你从哪里看到的?还是谁告诉过你?
POS既然已经被定为上电时不作初始化,这本身就意味着这个变量的数值在上电时就是不确定的。

使用特权

评论回复
板凳
Rain_King| | 2013-12-9 16:02 | 只看该作者
和楼上一样,不懂你想表达什么.........

使用特权

评论回复
地板
huangxz| | 2013-12-9 17:19 | 只看该作者
不用烧两次程序,eeprom是可以随时用的,

使用特权

评论回复
5
529515910|  楼主 | 2013-12-9 19:45 | 只看该作者
本帖最后由 529515910 于 2013-12-9 19:46 编辑
yewuyi 发表于 2013-12-9 15:29
1.有些PIC单片机内部没有EEPROM,当要记录一些变量时(上电复位非初始化,程序开始要将其提取出来使用的) ...

你好,yewuyi!
  感谢您的回复,不好意思,是我表达不清。
  我的目的就是要记录电机旋转的位置,并下次在这个位置上继续旋转。在没有EEPROM的PIC单片机上如何做到?
  我的编程代码如下:
  persistent unsigned char res_pos;   //存储位置
  unsigned char cur_pos;     //当前位置
  ....
  main()
{
   ...
  cur_pos = res_pos;  //提取存储位置
   ...
   while(1)
{
   ...
   rotate()    //旋转一次
   {
   ...
   res_pos = cur_pos; //存储当前位置
   }
  }
}
但这样单片机运行不正确,不知哪里错了。

使用特权

评论回复
6
yewuyi| | 2013-12-9 21:23 | 只看该作者
529515910 发表于 2013-12-9 19:45
你好,yewuyi!
  感谢您的回复,不好意思,是我表达不清。
  我的目的就是要记录电机旋转的位置,并下次 ...

先弄懂EEPROM、FLASH、RAM等都是干啥的再谈如何做项目。。。

使用特权

评论回复
7
谈的元| | 2013-12-10 20:03 | 只看该作者
掉电了无法**你电机位置。

再说详细一点,大家给你一点建议参考

使用特权

评论回复
8
谈的元| | 2013-12-10 20:03 | 只看该作者
掉电了无法**你电机位置。

再说详细一点,大家给你一点建议参考

使用特权

评论回复
9
ZG11211| | 2013-12-10 20:11 | 只看该作者
没有EEPROM你还想保持**,你牛。

使用特权

评论回复
10
529515910|  楼主 | 2013-12-11 13:08 | 只看该作者
谈的元 发表于 2013-12-10 20:03
掉电了无法**你电机位置。

再说详细一点,大家给你一点建议参考

1.感谢您的回复。我就是想把掉电前电机的位置保存下来,在下次上电的时候再读出,这样就可以在原来的位置上继续旋转了。
2.电机每转一次,我就记录一次,这样掉电前肯定可以记录它的位置。但由于没有EEPROM,无法保存。
3.把它放到FLASH里,并生成可重定义代码,不知道这样能不能保存下来,看来我得去试一下了。


使用特权

评论回复
11
谈的元| | 2013-12-11 18:59 | 只看该作者
如果可以写FLASH ,就可以做EEPROM使用,不必重定义代码,关键有写FLASH 指令没有?

使用特权

评论回复
12
谈的元| | 2013-12-11 19:11 | 只看该作者
电机每转一次,存一次?你电机转多快?

可以考虑大电容掉电检测,然后把数据写在FLASH中,下次读出

使用特权

评论回复
13
529515910|  楼主 | 2013-12-11 22:15 | 只看该作者
谈的元 发表于 2013-12-11 18:59
如果可以写FLASH ,就可以做EEPROM使用,不必重定义代码,关键有写FLASH 指令没有?  ...

1.我用的是PIC16F723,没有写FLASH指令。但我在MPASM中发现有伪指令udata– BEGIN AN OBJECT FILE UNINITIALIZED DATA SECTION,不知道它能不能达到**的目的。
2.宽电压输入,没设计过压检测,如果能实现**储存,存一次时间也只需要几个时钟周期吧。

使用特权

评论回复
14
谈的元| | 2013-12-12 18:43 | 只看该作者
FLASH操作不方便,合适次存取次数少比较少的场合,一般次数在10W左右

没有写FLASH指令 这个就不可以了

使用特权

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

本版积分规则

个人签名:无惧 无悔 有梦 有为

17

主题

48

帖子

1

粉丝