搜索
bottom↓
回复: 17

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

[复制链接]

出0入0汤圆

发表于 2013-4-11 22:15:15 | 显示全部楼层 |阅读模式
初学MSP430,写了个小程序,就是点个灯,闪啊闪啊闪的,但奇怪的问题发生了,当P1OUT ^= 0x40;放在主函数里面,delay()好像没有被调用,灯一直灯着,但只要P1OUT ^= 0x40;放在delay()里面就看到灯闪。。有大大出来解释下么?这个百思不得骑姐啊..

#include <msp430.h>

#define uchar unsigned char
#define uint  unsigned 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;
  }
}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-4-11 22:21:13 | 显示全部楼层
你把“i”定义为了uint型,他最大也就到255,你让他“i<10000“,他溢出了。

出0入0汤圆

 楼主| 发表于 2013-4-11 22:22:02 | 显示全部楼层
对了,用的是CCS5.1的开发环境,单片机是M430G2552

出0入0汤圆

 楼主| 发表于 2013-4-11 22:32:21 | 显示全部楼层
CrazySummer 发表于 2013-4-11 22:21
你把“i”定义为了uint型,他最大也就到255,你让他“i

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

出0入0汤圆

发表于 2013-4-11 22:52:48 来自手机 | 显示全部楼层
我可以说你叙述的……有……错误吗?

出0入0汤圆

发表于 2013-4-11 22:57:25 来自手机 | 显示全部楼层
你可以debug一下么,这样描述很模糊。自己发现问题最重要。

出0入0汤圆

 楼主| 发表于 2013-4-11 23:17:44 | 显示全部楼层
monkerman 发表于 2013-4-11 22:52
我可以说你叙述的……有……错误吗?

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

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


#include <msp430.h>

#define uchar unsigned char
#define uint  unsigned 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();
  }
}

出0入0汤圆

 楼主| 发表于 2013-4-11 23:30:59 | 显示全部楼层
cc1989summer 发表于 2013-4-11 22:57
你可以debug一下么,这样描述很模糊。自己发现问题最重要。

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

出0入0汤圆

发表于 2013-4-12 09:08:50 | 显示全部楼层
本帖最后由 monkerman 于 2013-4-12 09:18 编辑
YRHeng 发表于 2013-4-11 23:30
debug 了一下,单步运行,楼主位的程序一运行到delay();就直接跳过去了,并没有进去循环,但7楼的程序却 ...


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

出0入0汤圆

发表于 2013-4-12 11:29:09 | 显示全部楼层
2楼说得对,你这么写一直在delay里面转悠。

出0入0汤圆

发表于 2013-4-12 12:00:37 | 显示全部楼层
YRHeng 发表于 2013-4-11 22:32
但把P1OUT ^= 0x40;放到delay();那灯就看到闪啊。。应该不是溢出问题

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

出0入0汤圆

发表于 2013-4-12 12:21:30 | 显示全部楼层
for(i=0;i<10000;i++);
改为
for(i=0;i<65000;i++);

出0入0汤圆

发表于 2013-4-12 12:36:38 | 显示全部楼层
可能是被优化掉了~~我前几天也发现了这个问题,CCS 5.1默认设置下面,软件延时都被优化掉了......后来装回CCS 5.0就OK了~~

出0入0汤圆

发表于 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, 初步验证了想法. 然后烧写进去调试, 运行正常, 一闪一闪亮晶晶............  

出0入0汤圆

发表于 2013-4-12 14:36:24 | 显示全部楼层
应该是变量赋值溢出的问题,应该有闪烁,但是人眼识别不了。
430我喜欢用IAR的,纯属个人爱好!

出0入0汤圆

发表于 2013-4-16 15:59:15 | 显示全部楼层
int main(void)

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

出0入0汤圆

发表于 2013-4-16 18:18:31 | 显示全部楼层
应该是被优化了,跟踪一下就知道了。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-28 08:34

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

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