搜索
bottom↓
回复: 3

写mega128片内EEPROM(在CVAVR 1.24.4a版本中),乘法运算和左移有何区别?

[复制链接]

出0入0汤圆

发表于 2011-11-19 16:12:14 | 显示全部楼层 |阅读模式
写mega128片内EEPROM(在CVAVR 1.24.4a版本中),乘法运算和左移有何区别?我刚发现一个现象:

首先,已定义ASCII码转二进制的函数:
byte atb(unsigned char a )
{
    unsigned char b;
    b=a-0x30;
    if(b>=0xa)b=b-7;
    return(b);
}

也定义了变量
unsigned long int lParameter;
eeprom unsigned long int eep_lConfig;

接着,要将一个4字节数写入EEPROM,代码如下:

                               lParameter=((unsigned long int)atb(rx_buffer[5]))<<28+
                     ((unsigned long int)atb(rx_buffer[6]))<<24+
                     ((unsigned long int)atb(rx_buffer[7]))<<20+
                     ((unsigned long int)atb(rx_buffer[8]))<<16+
                     ((unsigned long int)atb(rx_buffer[9]))<<12+
                     ((unsigned long int)atb(rx_buffer[10]))<<8+
                     ((unsigned long int)atb(rx_buffer[11]))<<4;
                     (unsigned long int)atb(rx_buffer[12]);

结果:(通过串口发送写EEPROM指令,传送8个字节的ASCII码做参数值,通过这段代码合成4个字节)写入EEPROM某值,并由上述变量lParameter赋值给片内EEPROM变量eep_lConfig,再读出,发现返回值错误,全变成了零。


又改代码如下:
                lParameter=((unsigned long int)atb(rx_buffer[5]))*268435456+
                     ((unsigned long int)atb(rx_buffer[6]))*16777216+
                     ((unsigned long int)atb(rx_buffer[7]))*1048576+
                     ((unsigned long int)atb(rx_buffer[8]))*65536+
                     ((unsigned long int)atb(rx_buffer[9]))*4096+
                     ((unsigned long int)atb(rx_buffer[10]))*256+
                     ((unsigned long int)atb(rx_buffer[11]))*16+
                     (unsigned long int)atb(rx_buffer[12]);

写入EEPROM某值,并由上述变量lParameter赋值给片内EEPROM变量eep_lConfig,再读出,返回值正确。

各位网友,为什么啊?难道写片内EEPROM时,乘法和左移操作不一样吗?困惑中......

我又简化代码做了测试,发现汇编确实不一样:

lParameter=((unsigned long int)atb(rx_buffer[11]))<<4;

__GETB1MN _rx_buffer,11
CALL SUBOPT_0x33
MOVW R26,R30
MOVW R24,R22
LDI  R30,LOW(4)
CALL __LSLD12
STS  _lParameter,R30
STS  _lParameter+1,R31
STS  _lParameter+2,R22
STS  _lParameter+3,R23



lParameter=((unsigned long int)atb(rx_buffer[11]))*16;
__GETB1MN _rx_buffer,11
CALL SUBOPT_0x33
__GETD2N 0x10
CALL __MULD12U
STS  _lParameter,R30
STS  _lParameter+1,R31
STS  _lParameter+2,R22
STS  _lParameter+3,R23


请各位老师解惑,不胜感激!!!!
(本想查cvavr的帮助文档,但在我的系统win7下打不开)

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

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2011-11-20 00:52:40 | 显示全部楼层
" lParameter=((unsigned long int)atb(rx_buffer[5]))<<28+  
                     ((unsigned long int)atb(rx_buffer[6]))<<24+  
                     ((unsigned long int)atb(rx_buffer[7]))<<20+
..."

learn to use brackets:

lParameter=(((unsigned long int)atb(rx_buffer[5]))<<28)+  
                     (((unsigned long int)atb(rx_buffer[6]))<<24)+  
                     (((unsigned long int)atb(rx_buffer[7]))<<20)+  
...

出0入0汤圆

发表于 2011-11-20 03:05:09 | 显示全部楼层
优先级啊……

出0入0汤圆

 楼主| 发表于 2011-11-20 15:24:25 | 显示全部楼层
谢谢,回头测试一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-17 07:11

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

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