打印
[C语言]

奇怪的#define

[复制链接]
4260|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fnh02|  楼主 | 2013-12-30 18:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 fnh02 于 2013-12-31 17:19 编辑

#define freq                11059200
#define PWM_limt       (freq/1000*4.2)

#define UART_BAUDRATE_2400_T2   (65536-freq/4/2400)

T2L = UART_BAUDRATE_2400_T2;      //设定定时初值
T2H = UART_BAUDRATE_2400_T2 >> 8; //设定定时初值

上面这两行编译没有问题,可以通过

TL0=  PWM_limt;                    -->这一行也没有提示出错!
         


TH0=  PWM_limt >> 8;   -->这一行出错了   error C193: '>>': bad operand type

好像定义里面有*号 乘法运算表达式的基本上都会出错。
请教一下大大们~!!:funk:

不知道还允许不允许开新的问题...
void CCAP0_Time_SET (u32 i)
    {      
      i += (CCAP0H<<8)|CCAP0L;         //取  CCAP0定时器当前值
      CCAP0L      =  ((u8 *)& i)[3];         //更新CCAP0[3]计数器值L     
      CCAP0H      =  ((u8 *)& i)[2];         //更新CCAP0[2]计数器值H           
      PWM.CCAP0L1 =  ((u8 *)& i)[1];   //更新CCAP0[1]
      PWM.CCAP0H1 =  ((u8 *)& i)[0];   //更新CCAP0[0]  
    }

我想把它做成
void CCAP0_Time_SET (u8 x,u32 i)
    {      
      i += (CCAPxH<<8)|CCAPxL;         //取  CCAPx定时器当前值
      CCAPxL      =  ((u8 *)& i)[3];         //更新CCAPx[3]计数器值L     
      CCAPxH      =  ((u8 *)& i)[2];         //更新CCAPx[2]计数器值H           
      PWM.CCAPxL1 =  ((u8 *)& i)[1];   //更新CCAPx[1]
      PWM.CCAPxH1 =  ((u8 *)& i)[0];   //更新CCAPx[0]  
    }

  不知道怎实现....要不然就要写两个函数了!

相关帖子

沙发
fnh02|  楼主 | 2013-12-30 18:01 | 只看该作者
一下就不见了20分,可怜都没有分了!!!!

使用特权

评论回复
板凳
fnh02|  楼主 | 2013-12-30 18:03 | 只看该作者
不知道是展开时出错还是因为里面有*号的问题,,,试了好几个有乘法的基本上都过不了 “bad operand type

使用特权

评论回复
地板
fnh02|  楼主 | 2013-12-30 18:07 | 只看该作者
只要里面没有*号的运算都可以编译通过....真的想不通了!!!

使用特权

评论回复
5
gx_huang| | 2013-12-30 18:16 | 只看该作者
4.2是浮点数呀!浮点数怎么右移?
是不是这个问题?

使用特权

评论回复
6
as564335sa| | 2013-12-30 18:17 | 只看该作者
数据太长了吧,数据写成#define (xxx)UL试试

使用特权

评论回复
7
as564335sa| | 2013-12-30 18:19 | 只看该作者
或者是你的的二个define里涉及到浮点运算了

使用特权

评论回复
8
ytlcainiao| | 2013-12-30 19:32 | 只看该作者
浮点数是不能右移的。虽然相当于乘除法。

使用特权

评论回复
9
ljzhang2_10| | 2013-12-30 19:53 | 只看该作者
TL0不是应该是整数么??PWM_limt应该是浮点吧,是不是这里的问题??

使用特权

评论回复
10
fnh02|  楼主 | 2013-12-30 20:47 | 只看该作者
gx_huang 发表于 2013-12-30 18:16
4.2是浮点数呀!浮点数怎么右移?
是不是这个问题?

试了一下把 4.2变成4好像编译通过了,不知道能不能弄个int取整数的函数?

使用特权

评论回复
11
fnh02|  楼主 | 2013-12-30 20:55 | 只看该作者
谢谢大家打的确是浮点的问题!
再请教一下大家,如果该表达式我想让它自动取整该如何定义呢?

使用特权

评论回复
12
fnh02|  楼主 | 2013-12-30 21:05 | 只看该作者
不是把它赋值给一个整数型类型,是直接在#define就实现?

使用特权

评论回复
13
李冬发| | 2013-12-30 23:14 | 只看该作者

TH0=  PWM_limt_Min >> 8;
换成
TH0=  PWM_limt_Min / 256;

使用特权

评论回复
14
fnh02|  楼主 | 2013-12-30 23:22 | 只看该作者
李冬发 发表于 2013-12-30 23:14

TH0=  PWM_limt_Min >> 8;
换成

好像也可以,最主要我不是要它除256而是要取它的高位的数!

使用特权

评论回复
15
fnh02|  楼主 | 2013-12-30 23:26 | 只看该作者
temp=(TH1<<8)|TL1;

temp=TH1;
temp<<=8;
temp+=TL1
计算时间是不一样的

使用特权

评论回复
16
ballack_linux| | 2013-12-31 00:01 | 只看该作者
明显就是因为浮点数 不能进行位操作嘛   可以强制转换为整数

使用特权

评论回复
17
gx_huang| | 2013-12-31 08:31 | 只看该作者
C语言里本来就可以强制转换的,(freq/1000*4.2)改为:
((unsigned int)(freq/1000*4.2))
另外,(freq/1000*4.2)的精度不是你想象的,一般改为(freq*4.2/1000),
或者改为整数操作:((unsigned long)freq*42/10000),先放大10倍。整数操作比浮点数快多了。
注意计算不要溢出就可以了。

使用特权

评论回复
评论
cool_coder 2013-12-31 21:52 回复TA
这是编译时处理的常数,不会在运行时计算的 
评分
参与人数 1威望 +1 收起 理由
fnh02 + 1 果然是资深工程师...
18
sunhq02| | 2013-12-31 08:53 | 只看该作者
17楼说得对

使用特权

评论回复
19
yongma62| | 2013-12-31 09:27 | 只看该作者
浮点数怎么移啊?

使用特权

评论回复
20
luofeng2g| | 2013-12-31 10:03 | 只看该作者
学到一招

使用特权

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

本版积分规则

4

主题

53

帖子

0

粉丝