打印
[AVR单片机]

mega32写eeprom有时候有些的写不上去

[复制链接]
1209|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
都是直接包含的eeprom。h文件的
void
eeprom_write_byte (uint8_t *addr,uint8_t value)
{
  __asm__ __volatile__ (
         "mov __tmp_reg__,%1"      CR_TAB
         XCALL " __eeprom_write_byte_" _REG_LOCATION_SUFFIX
       : "+x" (addr)
       : "r"  (value)
       : "memory"
      );
}
for(i=1;i<10;i++)
                        {
                                eeprom_write_byte(i,eeprom_data[i]);
                                delay(100,11059);//延时10毫秒
                        }
为什么有时候有个别的字写不上去,重写可能就会好了,问题出在哪里呢?
读问题倒是不大
        for(i=1;i<10;i++)
        {
        eeprom_data[i]=eeprom_read_byte(i);
        delay(100,11059);//延时10毫秒
        }

uint8_t
eeprom_read_byte (const uint8_t *addr)
{
  uint8_t result;
  __asm__ __volatile__
      ( XCALL " __eeprom_read_byte_" _REG_LOCATION_SUFFIX CR_TAB
        "mov %1,__tmp_reg__"
       : "+x" (addr),
         "=r" (result)
       : );
  return result;
}

相关帖子

沙发
huangxz| | 2014-4-21 16:27 | 只看该作者
根据数据手册确定延时时间吧

使用特权

评论回复
板凳
cl234583745|  楼主 | 2014-4-22 09:17 | 只看该作者
huangxz 发表于 2014-4-21 16:27
根据数据手册确定延时时间吧

只是延长时间的问题吗?手册典型时间才8.5ms 我都延迟100ms、了

使用特权

评论回复
地板
huangxz| | 2014-4-22 09:40 | 只看该作者
cl234583745 发表于 2014-4-22 09:17
只是延长时间的问题吗?手册典型时间才8.5ms 我都延迟100ms、了

是的,如果是使用api,那就肯定是时间延时的问题,除非有硬件上的原因比如电源电压是否合适等.

使用特权

评论回复
5
cl234583745|  楼主 | 2014-4-23 11:05 | 只看该作者
本帖最后由 cl234583745 于 2014-4-23 11:06 编辑
huangxz 发表于 2014-4-22 09:40
是的,如果是使用api,那就肯定是时间延时的问题,除非有硬件上的原因比如电源电压是否合适等. ...

我看mega32手册上说eeprom写时候在5.6阶段,若有中断发送就会写不上去,会不是这个原因

EEPROM 控制寄存器-EECR

QQ截图20140423110118.png (269.48 KB )

QQ截图20140423110118.png

使用特权

评论回复
6
huangxz| | 2014-4-23 12:42 | 只看该作者
不知道楼主用的是哪个版本的gcc,
看看我的编译结果就知道gcc的编译器是多么完美

使用特权

评论回复
7
huangxz| | 2014-4-23 12:44 | 只看该作者

使用特权

评论回复
评分
参与人数 1威望 +6 收起 理由
qin552011373 + 6 很给力!
8
cl234583745|  楼主 | 2014-4-23 16:07 | 只看该作者
huangxz 发表于 2014-4-23 12:44

是这个吗

版本.jpg (114.52 KB )

版本.jpg

使用特权

评论回复
9
cl234583745|  楼主 | 2014-4-23 16:08 | 只看该作者
huangxz 发表于 2014-4-23 12:42
不知道楼主用的是哪个版本的gcc,
看看我的编译结果就知道gcc的编译器是多么完美
...

这个是干啥,看不懂,说明什么呢

使用特权

评论回复
10
huangxz| | 2014-4-23 16:56 | 只看该作者
cl234583745 发表于 2014-4-23 16:08
这个是干啥,看不懂,说明什么呢

看看gcc编译出来的汇编代码了吗
它在操作EEMWE和EEWE中间是关闭中断的,也就是说,你文档中说的,库函数是支持的.

使用特权

评论回复
11
cl234583745|  楼主 | 2014-4-24 12:25 | 只看该作者
本帖最后由 cl234583745 于 2014-4-24 12:26 编辑
huangxz 发表于 2014-4-23 16:56
看看gcc编译出来的汇编代码了吗
它在操作EEMWE和EEWE中间是关闭中断的,也就是说,你文档中说的,库函数是支 ...

我没有明白你的意思,你是说看看读写函数里面是否已经关闭中断了吗?那到底是怎么回事呢?
我用的是AtmanAvr 5.8 包含gcc
这个函数好像就有汇编代码,我看不懂
void
eeprom_write_byte (uint8_t *addr,uint8_t value)
{
  __asm__ __volatile__ (
         "mov __tmp_reg__,%1"      CR_TAB
         XCALL " __eeprom_write_byte_" _REG_LOCATION_SUFFIX
       : "+x" (addr)
       : "r"  (value)
       : "memory"
      );
}

使用特权

评论回复
12
huangxz| | 2014-4-24 18:44 | 只看该作者
cl234583745 发表于 2014-4-24 12:25
我没有明白你的意思,你是说看看读写函数里面是否已经关闭中断了吗?那到底是怎么回事呢?
我用的是AtmanA ...

你这个还要再call下面的函数啊,你还是看汇编结果吧.

使用特权

评论回复
13
cl234583745|  楼主 | 2014-4-25 08:38 | 只看该作者
huangxz 发表于 2014-4-24 18:44
你这个还要再call下面的函数啊,你还是看汇编结果吧.

我不懂汇编,那你帮我出个读写eeprom的函数吧,来解决我的问题

使用特权

评论回复
14
huangxz| | 2014-4-25 09:32 | 只看该作者
cl234583745 发表于 2014-4-25 08:38
我不懂汇编,那你帮我出个读写eeprom的函数吧,来解决我的问题

:lol,不懂就学呗

使用特权

评论回复
15
zhprotel| | 2014-5-1 16:07 | 只看该作者
EEPROM读写的时候不CLI 吗?

使用特权

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

本版积分规则

99

主题

644

帖子

1

粉丝