3393|5

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教ATmega16使用EEPROM存储数据时遇到的现象??? [复制链接]

以下是我做实验的一段小程序:
#include
#include

void port_init(void)
{
PORTA = 0xFF;
DDRA  = 0xFF;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

main()
{
char a,b,c;
a=b=c=0;
init_devices();
while(c==0)
{  EEARH=0X00;
    if((EECR&0X02)==0)
    {  if((SPMCR&0X00)==0)
       {  EEARL=0X02;                  
               EEDR=0X08;            //往EEPROM中0x02写入值
               //EECR|=(1<                    EECR|=0X04;          
               //EECR|=(1<                    EECR|=0X02;
                   a=1;
             }
         }
        if(a==1)
        {  if((EECR&0X02)==0)
              {  EEARL=0X02;
              //EECR|=(1<               EECR|=0X02;        //读EEPROM中0x02的值
              b=EEDR;
              }
        }
    c=3;
    break;
}
while(b==0x08)
{  PORTA = 0x00;
}
}

当执行PORTA=0x00时,PA0引脚会变为低电平,外围电路指示灯会亮。、

现在的问题是:用仿真器单步执行的时候,程式没有问题,PA0最后变为低电平,但当用仿真器直接RUN时,PA0一直不拉低,但此时可监控到EEPROM中0X02值已变为08。然后不用仿真器,直接跑单片机,效果还是一样,PA0不拉低。

请问各位,这到底是什么原因引起的呢????

最新回复

谢谢各位,原来是时序没把握好。。。。 是我经验太差了。。。  详情 回复 发表于 2010-5-26 20:06
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
#include
#include

void port_init(void)
{
    ……
}

void init_devices(void)
{
    ……
}

main()
{
    char a,b,c;
    a = b = c =0;
    init_devices();
    while(c ==0)
    {
        EEARH =0x00;
        if((EECR &0x02) ==0)
        {
            ……
        }
        if(a ==1)
        {
            if((EECR &0x02) ==0) /*运行到这里的时候,因为还没有执行完EEPROM的写操作,所以条件不成立,不会执行下面的语句*/
            {
                EEARL =0x02;
                EECR |=0x02;
                b =EEDR;
            }
        }
        c =3;/*直接跳到这里了,并退出这个while循环*/
        break;
    }
    while(b ==0x08)
    {
        PORTA = 0x00;
    }
}
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
从你的思路上看,你需要的代码应该是这样的:
main()
{
  char a,b,c;
  a = b = c =0;
  init_devices();

  while((EECR &0x02) !=0);
  EEARL =0x02;
  EEDR =0x08;
  EECR |= (1<   EECR |= (1<   while( (EECR &0x02) !=0 );
  EEARL =0x02;
  EECR |= (1<   b = EEDR;
  if(b ==0x08)
  {
    PORTA =0x00;
  }
}
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
这种情况,一般都是时序的问题造成的。全速和单步的区别就是时间,全速很快,单步就没一步都很慢,给足了时间给处理一些外设,像一些延时不够的情况,全速会出错。但单步没问题,也有想读写或者初始化要求等待的操作,要会出现单步没错,全速出问题的情况。
看了下你的代码,延时没有,应该就出在EEPROM的读写操作的等待,全速你等待不够,很多操作没完成,很多标志位根本没成立,但你单步是成立的。

要查出问题,既然你有仿真器,那简单,你要善于使用断点。在程序分支和重要的地方设置很断点。看看他走过的路径是否和你预想的一样,那个断点没执行,就看出问题所在了。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 
ICC里EEPROM有专门的读写函数 很好用的

记得关上全局中断
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢各位,原来是时序没把握好。。。。
是我经验太差了。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
Microchip 直播|利用motorBench开发套件高效开发电机磁场定向控制方案 报名中!
直播主题:利用motorBench开发套件高效开发电机磁场定向控制方案
直播时间:2025年3月25日(星期二)上午10:30-11:30
快来报名!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表