搜索
bottom↓
回复: 13

AVR GCC编译器(AVR STUDIO 4)中关于读写内部eeprom时的指针问题的请教

[复制链接]

出0入0汤圆

发表于 2009-12-16 09:42:37 | 显示全部楼层 |阅读模式
UCHAR  uOffset=0;
          UCHAR  AddrPointer[2];

        UINT i;
        AddrPointer[0]=0x00;//为什么此处定义的起始地址感觉是固定的,设为其他地址如0x50等也是一样的(用双龙的下载器读出的EEPROM内容)

        for(i=0;i<500;i++){
                eeprom_write_byte(&AddrPointer[0]+uOffset,0x65+uOffset);
                uOffset++;
                delay1();//写数据延迟

        }

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-12-16 10:58:45 | 显示全部楼层
没明白你的意思,你是想用AddrPointer指向EEPROM的某个地址?

出0入0汤圆

 楼主| 发表于 2009-12-16 11:27:37 | 显示全部楼层
对,是想用AddrPointer传递EEPROM的某个地址

出0入0汤圆

发表于 2009-12-16 12:29:04 | 显示全部楼层
for(i=0;i<500;i++){
eeprom_write_byte(&AddrPointer[0]+uOffset,0x65+uOffset);
uOffset++;
delay1();//写数据延迟
}
等价于
for(i=0;i<500;i++){
eeprom_write_byte(&AddrPointer[uOffset],0x65+uOffset);
uOffset++;
delay1();//写数据延迟
}
何必写那么复杂?


你的数组
UCHAR  AddrPointer[2];
才定义两个,如何循环到500?

数组的地址也不确定,这是干什么,看不懂 ....

出0入0汤圆

 楼主| 发表于 2009-12-16 13:47:39 | 显示全部楼层
我的本意是如何采用下列函数往片内EEPROM写一段数据temp[50],由于是第一次使用ATMEGA8,对于eeprom.h内的函数参数调用比较困惑,请用过的高手给予指点。

static inline uint8_t __attribute__ ((always_inline))
eeprom_read_byte (const uint8_t *addr);

static inline uint16_t __attribute__ ((always_inline))
eeprom_read_word (const uint16_t *addr);

static inline void __attribute__ ((always_inline))
eeprom_read_block (void *pointer_ram,
                   const void *pointer_eeprom,
                   size_t size);

static inline void __attribute__ ((always_inline))
eeprom_write_byte (uint8_t *addr,uint8_t value);

static inline void __attribute__ ((always_inline))
eeprom_write_word (uint16_t *addr,uint16_t value);

static inline void __attribute__ ((always_inline))
eeprom_write_block (const void *pointer_ram,
                    void *pointer_eeprom,
                    size_t size);

出0入0汤圆

发表于 2009-12-16 16:08:55 | 显示全部楼层
eeprom_write_block (const void *pointer_ram,
                    void *pointer_eeprom,
                    size_t size);
--------------------块写------------
UCHAR temp[50];
eeprom_write_block(temp, (void*)0, sizeof(temp));



或者用单字节写   eeprom_write_byte (uint8_t *addr,uint8_t value);

UCHAR temp[50];
UCHAR i;
for (i=0;i<50;++i)
{
   eeprom_write_byte((void*)i , temp);
}

出0入0汤圆

发表于 2009-12-16 17:07:53 | 显示全部楼层
关注!

出0入0汤圆

 楼主| 发表于 2009-12-16 17:11:38 | 显示全部楼层
谢谢5楼的大侠!
块写eeprom_write_block(temp, (void*)0, sizeof(temp)); 可以编译通过,可是下载程序后,原来1秒1闪的运行指示灯不断快速闪烁,程序好像在不断自启;

而且用单字节如下写时
UCHAR temp[50];
UCHAR i;
for (i=0;i<50;++i)
{
   eeprom_write_byte((void*)i , temp);
}

出现编译错误如下:
warining: cast to pointer from integer of different size
error:    invalid conversion from 'void*' to 'uint8_t*'
error:    initializing argument 1 of 'void eeprom_write_byte(uint8_t*,uint8_t)'
不知何故,看以上的参数传递应该没问题呀。

出0入0汤圆

发表于 2009-12-16 17:18:55 | 显示全部楼层
嗯,我写错了,应该如下:
UINT  i;  
for (i=0;i<50;++i)  
{  
   eeprom_write_byte((uint8_t *)i , temp);  
}  

或者

UCHAR i;  
for (i=0;i<50;++i)  
{  
   eeprom_write_byte((uint8_t *)((UINT)i) , temp);  
}

出0入0汤圆

 楼主| 发表于 2009-12-16 17:58:39 | 显示全部楼层
谢谢5楼的,单字节写EEPROM的程序测试正确,
块写eeprom_write_block(temp, (uint16_t*)0, sizeof(temp)); 可以编译通过,可是下载程序后,原来1秒1闪的运行指示灯不断快速闪烁,程序好像在不断自启;

出0入0汤圆

 楼主| 发表于 2009-12-16 18:00:00 | 显示全部楼层
是不是要关闭看门狗呀

出0入0汤圆

发表于 2009-12-16 18:05:30 | 显示全部楼层
估计eeprom_write_block函数内部应该不会有喂狗的语句,所以答案应该是要关。

出0入0汤圆

 楼主| 发表于 2009-12-17 10:04:59 | 显示全部楼层
shark大侠,果然必须关看门狗,谢谢。这个论坛果然有不少古道热肠之士,在我刚用AVR的时候就得到贴心的指导,能否留个QQ号,以便交流。我的QQ:449224425 高山流水

出0入0汤圆

发表于 2012-10-8 11:40:14 | 显示全部楼层
AVR的E2读写真的很无语啊,写一个字节也会马上重启,难道只能关狗狗吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-27 09:01

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

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