搜索
bottom↓
回复: 22

收到MSP430 LaunchPad,编程出现怪现象

[复制链接]

出0入0汤圆

发表于 2011-9-26 16:30:52 | 显示全部楼层 |阅读模式
是我晕了么。

参照“手把手教你使用TI MSP430 LaunchPad”写的LED灯驱动程序,开始是这样的

#include "io430.h"

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  P1DIR |= 1 << 0;  //Set P1.0 to output direction
  P1DIR |= 1 << 6;
  
  while(1)
  {
    volatile unsigned int i;
    P1OUT ^= 1 << 0;  //Toggle P1.0 using exclusive-OR
   
    i = 50000;  //Delay
    while(i --);
   
    P1OUT ^= 1 << 6;  //交替闪烁
  }
}

下载下来现象不对,没有交替闪烁,只有一个闪烁,后来改成


#include "io430.h"

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  P1DIR |= 1 << 0;  //Set P1.0 to output direction
  P1DIR |= 1 << 6;
  
  while(1)
  {
    volatile unsigned int i;
    P1OUT ^= 1 << 0;  //Toggle P1.0 using exclusive-OR
    P1OUT ^= 1 << 6;
   
    i = 50000;  //Delay
    while(i --);
   
  }
}
再下载调试后现象对,但代码明显不是这个意思,就把程序改成先前那个交替闪烁的,后来重新插拔了USB口,看到两个LED灯同时闪烁,然后复位,居然交替闪烁了,再复位,又同时闪烁了,如此交替,难道430的单片机存储器有什么特别设置?

真有些晕了,还没碰到过这种情况。

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

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

 楼主| 发表于 2011-9-26 16:40:25 | 显示全部楼层
期待高手解答。

出0入0汤圆

发表于 2011-9-26 17:00:33 | 显示全部楼层
请问lz  ,  那个 触摸板 你收到了吗?  我没有收到,只收到了底板,现在放着积灰尘

出0入0汤圆

发表于 2011-9-26 17:35:53 | 显示全部楼层
谁然我没用过msp430,但是感觉这段代码
volatile unsigned int i;
    P1OUT ^= 1 << 0;  //Toggle P1.0 using exclusive-OR
     
    i = 50000;  //Delay
    while(i --);
     
    P1OUT ^= 1 << 6;  //交替闪烁

是不是应该这样写
   volatile unsigned int i;
  unsigned char j;
j=1;
while(1){

    P1OUT =(P1OUT&~(1<<0))|(j<< 0);;  //Toggle P1.0 using exclusive-OR
     
    i = 50000;  //Delay
    while(i --);
     
    P1OUT = (P1OUT&~(1<<6))|(j<< 6);  //交替闪烁
j=1-j;
  }

这一段
  while(1)
  {
    volatile unsigned int i;
P1OUT ^= 1 << 0;  
      P1OUT ^= 1 << 6;  //交替闪烁
     
    i = 50000;  //Delay
    while(i --);
     
  }
是不是应该写成
volatile unsigned int i;
unsigned char j;
j=1;
  while(1)
  {
   
    P1OUT =(P1OUT&~(1<<0))|(j<< 0);  //Toggle P1.0 using exclusive-OR
    P1OUT =(P1OUT&~(1<<6))|(j<< 6);
     
    i = 50000;  //Delay
    while(i --);
     j=1-j;
  }
PS:看lz的代码,在程序中间申请变量竟然不报错,这编译器视乎很强大

出0入0汤圆

 楼主| 发表于 2011-9-26 20:13:56 | 显示全部楼层
回复【2楼】121212
-----------------------------------------------------------------------

没收到,现在还没发货呢,慢慢等着吧,会发的

出0入0汤圆

发表于 2011-9-26 20:26:21 | 显示全部楼层
不对,找个板子测下,P1OUT ^= 1 << 6;  //交替闪烁  后面加延时,不然你这句刚写完,到while那边就被你的P1OUT ^= 1 << 0给放倒了

出0入0汤圆

 楼主| 发表于 2011-9-26 20:29:33 | 显示全部楼层
回复【3楼】hzr0071
-----------------------------------------------------------------------

才注意到是在程序里申请变量,确实没报错,已经改过来了,同时闪烁没问题,你提供的那个同时闪烁的代码也可以用,交替闪烁那个改成你写的那个就没问题了,但我的那个感觉逻辑没问题啊,也能实现交替闪烁,但复位一下后就变成同时闪烁了,再复位又变回交替闪烁了,如此循环,复位按键成了控制按键,是怎么回事???

出0入0汤圆

发表于 2011-9-26 20:32:15 | 显示全部楼层
回复【楼主位】wisology
-----------------------------------------------------------------------

#include "io430.h"

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
// P1DIR |= 0x01;                            // Set P1.0 to output direction
  P1DIR |= 1 << 0;  //Set P1.0 to output direction
  P1DIR |= 1 << 6;
  P1OUT |= (1 << 0)|(1 << 6);     //加上这一句,给个初始状态
  while(1)
  {
    volatile unsigned int i;
    P1OUT ^= 1 << 0;  //Toggle P1.0 using exclusive-OR
     
    i = 50000;  //Delay
    while(i --);
     
    P1OUT ^= 1 << 6;  //交替闪烁
  }
}
上面代码试试,while前加上 P1OUT |= (1 << 0)|(1 << 6);//加上这一句,给个初始状态     绿红交替闪烁,复位后也是绿红交替。

出0入0汤圆

发表于 2011-9-26 20:40:19 | 显示全部楼层
哈哈,给你搞了个更好玩的现象

出0入0汤圆

 楼主| 发表于 2011-9-26 20:42:59 | 显示全部楼层
回复【8楼】mawenwei 小马
-----------------------------------------------------------------------

是啊,是不是编译器编译的时候一点逻辑问题

出0入0汤圆

发表于 2011-9-26 20:45:34 | 显示全部楼层
回复【6楼】wisology
-----------------------------------------------------------------------

程序里没有初始化IO口状态
如果要一起闪烁那就初始化IO口为相同的输出值 即同为0或者同为1
如果要交替闪烁那就初始化IO口为相斥的输出值 即一个是1另一个是0

出0入0汤圆

发表于 2011-9-26 20:49:45 | 显示全部楼层
回复【9楼】wisology
回复【8楼】mawenwei 小马
-----------------------------------------------------------------------
是啊,是不是编译器编译的时候一点逻辑问题
-----------------------------------------------------------------------

嗯,你理清楚了有总共有几个状态,然后一句一句往下跟就知道怎么写了,其实你开始的时候也程序也执行了,只是闪的太快了,眼睛看不到

出0入0汤圆

 楼主| 发表于 2011-9-26 20:50:00 | 显示全部楼层
回复【10楼】sunshulin
-----------------------------------------------------------------------

有道理啊,不过不知道怎么初始化,呵呵,上边写的那个只是参照例程做的修改,我看看手册修改下,这应该是正解

出0入0汤圆

 楼主| 发表于 2011-9-26 21:05:24 | 显示全部楼层
回复【5楼】mawenwei 小马
-----------------------------------------------------------------------

假如开始为:1111 1111,
            1111 1111 ^ 0000 0001 = 1111 1110; //第一个
            
            1111 1110 ^ 0100 0000 = 1011 1110;
            1011 1110 ^ 0000 0001 = 1011 1111;//第二个
            
            1011 1111 ^ 0100 0000 = 1111 1111;
            1111 1111 ^ 0000 0001 = 1111 1110;//第三个
依次循环,没问题

出0入0汤圆

发表于 2011-9-26 21:07:58 | 显示全部楼层
回复【12楼】wisology
-----------------------------------------------------------------------
可以参考一下

P1OUT |=BIT0+BIT6; //初始化为相同

P1OUT |=~BIT0+~BIT6; //初始化为相同

P1OUT |=BIT0+~BIT6; //初始化为相斥

P1OUT |=~BIT0+BIT6; //初始化为相斥

出0入0汤圆

 楼主| 发表于 2011-9-26 21:10:25 | 显示全部楼层
先初始化IO口后就没问题了,如下:
#include "io430.h"

int main( void )
{
  volatile unsigned int i;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  P1DIR |= 1 << 0;  //Set P1.0 to output direction
  P1DIR |= 1 << 6;
  
  P1OUT |= (1 << 0) | (1 << 6);//初始化
  
  while(1)
  {
   
    P1OUT ^= 1 << 0;  //Toggle P1.0 using exclusive-OR
   
   
    i = 50000;  //Delay
    while(i --);
   
    P1OUT ^= 1 << 6;  //交替闪烁
  }
}

出0入0汤圆

发表于 2011-9-27 08:42:37 | 显示全部楼层
没有初始化端口值,对端口取反操作,出现这样的现象很正常

出0入0汤圆

发表于 2011-9-29 10:36:16 | 显示全部楼层
我今天刚收到触摸板了 还带了一个CPU呢   看图


(原文件名:CIMG3160.JPG)


(原文件名:CIMG3162.JPG)

出0入0汤圆

发表于 2011-9-29 10:58:42 | 显示全部楼层
我的还没收到呢。

出0入0汤圆

发表于 2011-9-29 15:02:13 | 显示全部楼层
前几天下单的,现在还没出北京呢。。。

出0入0汤圆

发表于 2011-9-29 15:11:23 | 显示全部楼层
回复【楼主位】wisology  
是我晕了么。
参照“手把手教你使用ti msp430 launchpad”写的led灯驱动程序,开始是这样的
#include "io430.h"
int main( void )
{
  // stop watchdog timer to prevent time out reset
  wdtctl = wdtpw + wdthold;
  
  p1dir |= 1 &lt;&lt; 0;  //set p1.0 to output direction
  p1dir |= 1 &lt;&lt; 6;
  
  while(1)
  {
    volatile unsigned int i;
    p1out ^= 1 &lt;&lt; 0;  //toggle p1.0 using exclusive-or
   
    i = 50000;  //delay
    wh......
-----------------------------------------------------------------------

没有初始化开始的输出状态

在初始化了方向后应该初始化输出的状态
P1DIR |= BIT0+BIT6;
P1OUT &= ~BIT0;
P1OUT &= ~BIT6;
然后你的程序没问题

出0入0汤圆

发表于 2011-11-8 21:19:45 | 显示全部楼层
没错,应该在输出前有个输出初始化,否则就会有出现相同状态的几率!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-2 07:21

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

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