xczxwy 发表于 2008-5-22 09:48:19

请教马老师:关于在CVAVR里定义EEPROM型值的问题!

马老师:在CVAVR里我需要定义一个EEPROM类型的值,比如:eeprom int EEP_CaliVolt00;你的那本书上也是这么写的,可是编译时,他提示没有初始化EEPROM,所以我改成eeprom int EEP_CaliVolt00=20;这样就可以编译通过了,但是这样一来就有一个问题,我这个值在程序里是要校正它的,如果这样定义,并且它还是个全局变量,那么就算校正好了,再下一次RESET后,这个EEPROM不是又被初始化成20了,那这样一来不是每次开机后都需要校正了吗??请帮忙解惑!这个问题很棘手啊!

machao 发表于 2008-6-2 01:53:54

eeprom int EEP_CaliVolt00;可是编译时,他提示没有初始化EEPROM,
====>此句定义一个INT变量在EEPROM中,但没有值.编译只是给出警告,可以认为通过编译.

eeprom int EEP_CaliVolt00=20;这样就可以编译通过了
====>此句定义一个INT变量在EEPROM中,初值为20.此时会生成一个ROM文件,在下载HEX文件时,需要同时将ROM文件下载,这样在EEPROM中的变量才能为20.即EEPROM中变量的初值时通过ISP编程下载写入的.

但是这样一来就有一个问题,我这个值在程序里是要校正它的,如果这样定义,并且它还是个全局变量,那么就算校正好了,再下一次RESET后,这个EEPROM不是又被初始化成20了!

=====>与RAM中的变量不同,EEPROM中的初值不是程序在启动初始化时写入的,而是通过ISP下载时写入的.如果程序中没有对该EEPROM变量写入语句的话,该变量永远不变.除非你重新擦除芯片,再次编程写入.


为了操作简单,我通常这样处理:

eeprom char flag;
eeprom int EEP_CaliVolt00;


main()
{
   if (flag != 0xa5)
   {
         EEP_CaliVolt00 = 20;
         flag = 0x05;
   }
   ......
   ......
}

这样,就不必理会编译时给出的警告提示:没有初始化EEPROM.程序下载后第一次上电运行,由程序写入初值20.而以后的上电启动过程中,由于flag是0x05了,程序就不会再对EEP_CaliVolt00写初值了.

fangmcu 发表于 2008-6-2 07:01:27

这个警告看起来很不爽,所以通常在软件里将其屏蔽!

machao 发表于 2008-6-2 17:18:51

我已经习惯了.警告作为提醒,否则会忘掉做必要的处理.
页: [1]
查看完整版本: 请教马老师:关于在CVAVR里定义EEPROM型值的问题!