YRHeng 发表于 2013-4-11 22:15:15

初学MSP430,遇到一个奇怪问题

初学MSP430,写了个小程序,就是点个灯,闪啊闪啊闪的,但奇怪的问题发生了,当P1OUT ^= 0x40;放在主函数里面,delay()好像没有被调用,灯一直灯着,但只要P1OUT ^= 0x40;放在delay()里面就看到灯闪。。有大大出来解释下么?这个百思不得骑姐啊..

#include <msp430.h>

#define uchar unsigned char
#define uintunsigned int

void delay()
{
       uint i;
       for(i=0;i<10000;i++);
}

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x40;
P1OUT &= ~0x40;
while(1)
{

        delay();
        P1OUT ^= 0x40;
}
}

CrazySummer 发表于 2013-4-11 22:21:13

你把“i”定义为了uint型,他最大也就到255,你让他“i<10000“,他溢出了。

YRHeng 发表于 2013-4-11 22:22:02

对了,用的是CCS5.1的开发环境,单片机是M430G2552

YRHeng 发表于 2013-4-11 22:32:21

CrazySummer 发表于 2013-4-11 22:21 static/image/common/back.gif
你把“i”定义为了uint型,他最大也就到255,你让他“i

但把P1OUT ^= 0x40;放到delay();那灯就看到闪啊。。应该不是溢出问题

monkerman 发表于 2013-4-11 22:52:48

我可以说你叙述的……有……错误吗?

cc1989summer 发表于 2013-4-11 22:57:25

你可以debug一下么,这样描述很模糊。自己发现问题最重要。

YRHeng 发表于 2013-4-11 23:17:44

monkerman 发表于 2013-4-11 22:52 static/image/common/back.gif
我可以说你叙述的……有……错误吗?

好吧。。好像我叙述有点模糊。。

楼主位的程序运行后灯看不到灯闪,像这样灯就可以闪了


#include <msp430.h>

#define uchar unsigned char
#define uintunsigned int

void delay()
{
         uint i;
         for(i=0;i<10000;i++);
      P1OUT ^= 0x40;
}

int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= 0x40;
P1OUT &= ~0x40;
while(1)
{

      delay();
}
}

YRHeng 发表于 2013-4-11 23:30:59

cc1989summer 发表于 2013-4-11 22:57 static/image/common/back.gif
你可以debug一下么,这样描述很模糊。自己发现问题最重要。

debug 了一下,单步运行,楼主位的程序一运行到delay();就直接跳过去了,并没有进去循环,但7楼的程序却能进到delay();里面去。。

monkerman 发表于 2013-4-12 09:08:50

本帖最后由 monkerman 于 2013-4-12 09:18 编辑

YRHeng 发表于 2013-4-11 23:30 static/image/common/back.gif
debug 了一下,单步运行,楼主位的程序一运行到delay();就直接跳过去了,并没有进去循环,但7楼的程序却 ...

好吧. 可能是被优化掉了?
我以前这么写过没问题啊.你试试IAR, 或者等高手解释吧.
要不你试试
while (1) {
      P1OUT ^= 0x40;
      delay();
}
{:shutup:}

qiuchen 发表于 2013-4-12 11:29:09

2楼说得对,你这么写一直在delay里面转悠。

CrazySummer 发表于 2013-4-12 12:00:37

YRHeng 发表于 2013-4-11 22:32 static/image/common/back.gif
但把P1OUT ^= 0x40;放到delay();那灯就看到闪啊。。应该不是溢出问题

肯定会闪啊,而且还很快,你把10000改为0XFF。

jack12345 发表于 2013-4-12 12:21:30

for(i=0;i<10000;i++);
改为
for(i=0;i<65000;i++);
{:smile:}

BBC 发表于 2013-4-12 12:36:38

可能是被优化掉了~~我前几天也发现了这个问题,CCS 5.1默认设置下面,软件延时都被优化掉了......后来装回CCS 5.0就OK了~~

monkerman 发表于 2013-4-12 14:04:11

本帖最后由 monkerman 于 2013-4-12 15:08 编辑

我用自己的CCS5.2 和 G2553 测试了一下. 也出现了楼主的问题.
之前怀疑是优化掉了. 然后设置了 Project-->Build-->MSP430 Compiler-->Optimization-->Optimization Level下拉菜单点 off , OK后再编译一次.
首先观察编译后的代码量大了将近 1KB, 初步验证了想法. 然后烧写进去调试, 运行正常, 一闪一闪亮晶晶............{:lol:}

zhuyl456 发表于 2013-4-12 14:36:24

应该是变量赋值溢出的问题,应该有闪烁,但是人眼识别不了。
430我喜欢用IAR的,纯属个人爱好!

ilikeavr666 发表于 2013-4-16 15:59:15

int main(void)

会不会跟main()的定义有关....
改为
void main(void)
试试...

divineliu 发表于 2013-4-16 18:18:31

应该是被优化了,跟踪一下就知道了。

巴黎丶欧莱雅 发表于 2013-4-17 09:37:56

试试吧延时改成 void delay(volatile uint i)
页: [1]
查看完整版本: 初学MSP430,遇到一个奇怪问题