[LaunchPad] 求大神指导 G2553 用PWM控制led的程序问题。

a828378   2013-7-15 03:22 楼主
我是想通过P1.3的按键控制P1.0口接的led的光强。实现步进调节的功能。小弟刚接触430几天,英语不好,手册看的头大。。
贴下程序看下哪里有问题。

好像现在是按键可调,但不是步进调节,光强是乱变的。
在这小弟先谢过大神了。


#include  

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  
  P1DIR &=~BIT3;       //P1.3作为按键输入
  P1IE |= BIT3;                         // P1.3 interrupt enabled
  P1IES |= BIT3;                          // P1.3 Hi/lo edge
  P1REN |= BIT3;                          // P1.3 pullup
  
  P1DIR |= BIT0;                            // P1.0 output
  P1OUT |= BIT0;
  
  CCTL2 = CCIE;                             // CCR2 interrupt enabled
  CCR2 = 10;
  CCR0 = 100;
  TACCTL2 |= OUTMOD_4;
  TACTL = TASSEL_2 + MC_3;//+ID0+ID1;                  // SMCLK, Contmode

  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
}

// Timer_A3 Interrupt Vector (TA0IV) handler
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
  switch( TA0IV )
  {
  case  4:                                  // CCR1
    {
    P1OUT ^= 0x01;                          // Toggle P1.0
    }
           break;
  case  2: break;                           // CCR2 not used
  case 10: break;                           // overflow not used
}
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  if (P1IFG & BIT3==BIT3)
  {
    P1IFG = 0x00;
    CCR2+=10;
    if (CCR2>100) CCR2=10;
  }
  else P1IFG = 0x00;
}

回复评论 (16)

你这不是pwm调光,是乱调,稍微理顺下思路再写程序吧
点赞  2013-7-15 07:20
应该是ccr2溢出时置led,ccr0溢出时清led,你试试。
点赞  2013-7-15 07:23
为何不直接使用IO引脚的复用功能?PWM能够直接通过引脚输出不需要软件中断处理的呀。具体哪个引脚,看G2553的数据手册,设置相应的PxSELy
点赞  2013-7-15 09:01
Port_1函数不受时间控制啊
点赞  2013-7-15 12:18

回复 楼主a828378 的帖子

你是想按一下按键递进一级呢?

还是长按按键递进?

两种做法程序思路不一样。

按一下递进需要做按键释放检测。

长按递进需要设定递进时间长度,既按多久才会递进一级。

以上观点仅供参考。
点赞  2013-7-15 12:22
楼主晚上三点多还在调,精神可嘉!
楼上几位解答了,楼主试试看
点赞  2013-7-15 13:34

回复 板凳lcofjp 的帖子

刚刚开始看user guide。英语看的我头大。用复用功能可以写得好但是不能调。?先谢谢了。
点赞  2013-7-15 18:49

回复 6楼deweyled 的帖子

我是想按一下一个下降沿,就调一下。430不是边沿触发中断的。?还需要释放检测吗。?
点赞  2013-7-15 18:50
小弟比较爱熬夜,白天爱睡觉。


#include  

int f=500;
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  
  P1DIR &=~BIT3;       //P1.3作为按键输入
  P1IE |= BIT3;                         // P1.3 interrupt enabled
  P1IES |= BIT3;                          // P1.3 Hi/lo edge
  P1REN |= BIT3;                          // P1.3 pullup
   
  P1DIR |= BIT6;
  P1SEL |= BIT6;
  
  CCR1 = 7900;
  CCR0 = 8000;
  TACCTL1 |= OUTMOD_2;
  TACTL = TASSEL_2 + MC_1;//+ID0+ID1;                  // SMCLK, Contmode

  while (1) {
    _BIS_SR(LPM1_bits + GIE);                 // Enter LPM1 w/ interrupt
  }
}


#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  if (P1IFG & BIT3==BIT3)
  {
    P1IFG &=~BIT3;
    CCR1 = CCR1+1000;
    if (CCR1>8000) CCR1=500;
    TACTL = TASSEL_2 + MC_1;
  }
  else P1IFG = 0x00;
}

接在P1.3的按键我想让他按一下就能使CCR1递增1000,从而实现步进调光。但为什么按了好像没用。问问各位大神了。
先谢过大家
点赞  2013-7-15 18:55
如果今晚有时间,我帮你写一个。
点赞  2013-7-16 08:45
建议看一下PWM的例程~  CCS里430Ware自带~
点赞  2013-7-16 09:45

回复 11楼lcofjp 的帖子

谢谢了。能生成pwm波形。可是帮忙看下10L的程序。为什么不能实现步进。?谢谢了先。
点赞  2013-7-16 20:07

回复 10楼a828378 的帖子

您好,10楼的程序基本是OK了,问题可能出在
if (P1IFG & BIT3==BIT3) 这句,改成if ((P1IFG & BIT3)==BIT3)或者if (P1IFG & BIT3);
== 的优先级 大于 &,导致按键得不到响应,所以如果你仿真的话,应该可以看到。
我没太注意你10楼的程序,另外开了个帖子,不好意思。
https://bbs.eeworld.com.cn/thread-376072-1-1.html
点赞  2013-7-16 21:47

回复 14楼lcofjp 的帖子

果然是这个问题。以前是编程序倒还没注意过这个优先级。另外谢谢你的那个帖子了。受教了正在学习^。^
万分感谢。
点赞  2013-7-17 00:19
童鞋 能 把 你 做的这用 G2553用PWM控制LED的资料(程序 和 硬件的连接图) 发我给 我 看下嘛  我 也是刚接触这MSP430 想通过实例来学习着
点赞  2013-7-20 11:49

回复 16楼leihonglun 的帖子

程序的话你看14L的帖子,硬件我就是用launchpad上面的led的没什么连接的事。
点赞  2013-7-29 09:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复