打印

(TI MCU分享)+设计电子产品

[复制链接]
2096|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cz380921140|  楼主 | 2012-9-27 18:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MSP430系列功耗很低,用来设计电子产品时可以不设电源开关,以下是我设计的电子产品的
思路:
1.用两节电池供电,接上电池后F1121复位,设置好端口立即进入低功耗状态。
2.将on/off按钮接在 P2.0,利用端口的中断使电路进入工作状态。
3.当按着on/off超过几秒后电路进入低功耗状态。
4.利用WDT,当一段时间没有任何操作后电路进入低功耗状态。
程序如下:
#include  "msp430x11x1.h"
#define uint unsigned int
#define uchar unsigned char
unsigned short *sptr;           // Stack pointer
extern void getsptr (void);     // Get Stack Pointer
uchar    interrupt_flag;
uint times;
interrupt[PORT2_VECTOR] void P2_ISR(void);
interrupt[WDT_VECTOR] void watchdog_timer(void);
void delay(uchar k)
{
uchar i;
for(i=0;i<k;i++);
}
void beep(void)
{
P1OUT |= BIT3; // beep on
delay(120);
P1OUT &= ~BIT3; // beep off
}
void reset_port(void)
{
P1OUT &= ~BIT0;
P1OUT &= ~BIT1;
P1OUT &= ~BIT2;
P1OUT &= ~BIT3;
P2OUT &= ~BIT1;
P2OUT &= ~BIT2;
}   
void sleep(void)
{
    P2IES |= BIT0;        //P2.0 interrupt hi->low edge
      P2IFG &= ~BIT0;        //P2.0 IFG cleared
    P2IE |= BIT0;        //P2.0 interrupt enabled
    getsptr();                    // Get the current stack pointer - 2
    sptr-=1;
        
    IE1 &= ~WDTIE;     // disable WDT interrupt
    reset_port();
        
    LPM4;
   
}
void main(void)
{
uchar     i;
WDTCTL = WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1; // Set Watchdog Timer interval to 0.5ms
P1DIR |= BIT0;
P1DIR |= BIT1;
P1DIR |= BIT2;
P1DIR |= BIT3;
P2DIR &= ~BIT0;    //设为on/off按钮输入
P2DIR |= BIT1;
P2DIR |= BIT2;
reset_port();
   
P2IES |= BIT0;        //P2.0 interrupt hi->low edge
P2IFG &= ~BIT0;        //P2.0 IFG cleared
P2IE |= BIT0;        //P2.0 interrupt enabled
delay(250);
_EINT();                      // Enable Interrupts
sleep();  //进入低功耗
beep();   //提示
times=0;
IE1 |= WDTIE;     // Enable WDT interrupt
interrupt_flag=0;
if((P2IN&BIT0) != BIT0 )    //当on/off按钮按着超过5秒后进入低功耗
  {   
    times=0;
    while((P2IN&BIT0) != BIT0 )
        {
          if( times>6000 )        //5s
            {
            beep();
            sleep();
            break;
            }
        }
  }
while(1)
  {
  IE1 |= WDTIE;     // Enable WDT interrupt
   
  interrupt_flag=0;
   
.......
  if( times > 12000 )        
    {
    beep();
        sleep();
      }
 }
}
interrupt[PORT2_VECTOR] void P2_ISR(void)
{
//     Exit LPM4, disable P2.0 interrupt      
P2IE &= ~BIT0;        //P2.0 interrupt disabled
P2IFG &= ~BIT0;        //P2.0 IFG cleared
interrupt_flag=1;
*sptr &= ~(SCG1+SCG0+OSCOFF+CPUOFF);   // Clear LPM4 from the stacked status
register
beep();
}  
interrupt[WDT_VECTOR] void watchdog_timer(void)
{
times++;
}
程序getsptr.s43摘自安装目录下FET_examples的fet_9目录
    NAME getsptr
    PUBLIC getsptr
    EXTERN sptr ;Stack pointer variable declared in C file
    RSEG CODE
getsptr:
    mov SP,&sptr ;Copy the current stack pointer.
    ret
    END

C430与C51语法上基本一样,但是编程有些地方要注意,以下是我遇到的:
1.如果要判断P2.0是否为1,C51可以写为:if( P2&BIT0 == BIT0 ) ,但是在C430会得不到
结果,要写为:if( (P2&BIT0) == BIT0 ) 才对。
2.在C51中如果要让程序等待可以直接用while(1),但是写C430程序时我曾经遇到while(1)
无效,后来发现是我没设置WDT,加入WDTCTL = WDTPW+WDTHOLD,一切正常。
3.C51有bit flag等指令来定义位,而MSP430没有相关指令,但是可以这样实现:
先定义一个变量 uchar flag,这样就有8个位变量可以使用,
假设C51有这样的程序:
bit rflag;
    rflag = 0;
    while(rflag==0);  //等待
在C430里可以写成:
uchar flag;
    flag &= ~BIT1;   
    while( (flag&BIT1) != BIT1 );  
效果一样
由于设计的东西不多,很多地方还不懂,请大家赐教。

相关帖子

沙发
tianm| | 2012-9-28 09:23 | 只看该作者
:o 代码还省略了?

使用特权

评论回复
板凳
comeon201208| | 2012-9-28 14:21 | 只看该作者
多谢分享,1系列的,很好的

使用特权

评论回复
地板
chen0204| | 2012-9-28 14:33 | 只看该作者
看看哈

使用特权

评论回复
5
wood_ic| | 2012-9-28 17:37 | 只看该作者
很强大啊

使用特权

评论回复
6
hawksabre| | 2012-9-28 18:38 | 只看该作者
注意代码规范   呵呵   感觉问题不大  继续努力

使用特权

评论回复
7
爱之翼V| | 2012-9-30 09:06 | 只看该作者
不设电源开关啊,呵呵,不知道行不行

使用特权

评论回复
8
firstshine| | 2012-9-30 18:44 | 只看该作者
看看

使用特权

评论回复
9
bobde163| | 2012-10-2 20:44 | 只看该作者
学习了

使用特权

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

本版积分规则

0

主题

5

帖子

0

粉丝