5411|11

49

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

TI MSP430 中断 [复制链接]

我刚有了一个面试,给我留了个作业。哪位能帮帮我?我的工作就有希望了
写小段程序 TI MSP430Fxxx
1) 用中断控制
2) 在P1.0产生一个连续的 1KHz 变占空比的输出
3) 占空比由P1.1 P1.2 P1.3 控制如下
  P1.1      P1.2      P1.3          占空比(on-off)
  0        1          1              90-10
  1        0          1              70 - 30
  0        0          1              50 - 50
  1        1          0              30 - 70
  0        1          0              10 - 90

最新回复

我的理解,MSP430 是用来低功耗监控的。没有死循环是因为想让它的大部分硬件进入低功耗模式,省电  详情 回复 发表于 2008-12-29 03:33
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
ding
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
ding
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
我自己写了一个,找错加分
#include "MSP430x22x4.h"

#define MAXSTEP         1000-1                 // clk 1mHz /1k freq required=1000 step
#define DUTYCYCLE10 100                        //dutycycle 10
#define DUTYCYCLE30 300                        //dutycycle 30
#define DUTYCYCLE50 500                 //dutycycle 50
#define DUTYCYCLE70 700                 //dutycycle 70
#define DUTYCYCLE90 900                 //dutycycle 90

#define STATUS1         0xC                        //input combination
#define STATUS2         0xA
#define STATUS3         0x8
#define STATUS4         0x6
#define STATUS5         0x4

#define ENABLE1         0xC                        //interrupt enable setting
#define ENABLE2         0xA
#define ENABLE3         0x8
#define ENABLE4         0x6
#define ENABLE5         0x4


unsigned int dutycyle        =        DUTYCYCLE10;
unsigned int start                =        DUTYCYCLE10;
unsigned int end                =        DUTYCYCLE30;

void init_port1(void)
{       
        P1DIR         =         0x1;                      //P1.0 ouput
        P1SEL         =         0x1;                //timer A output P1.0
        P1IE        =        0xE;                 //Enable interrupt
        P1IFG        =        0x0;                //Clear flag

// POR input status detection in order to set Interrupt edge
        switch(P1IN&0xOE)                               
        {                                                               
          case STATUS1:         //Input P1.1, P1.2 and P1.3 STATUS
                  start =        DUTYCYCLE90;//set starting dutycle
                  end        =        DUTYCYCLE10;//set ending dutycle
                  P1IES =        ENABLE1;//reset interrupt ENABLE
          break;
          case STATUS2:
                  start =        DUTYCYCLE70;//set starting dutycle
                  end        =        DUTYCYCLE30;//set ending dutycle
                  P1IES =        ENABLE2;//reset interrupt ENABLE
          break;
          case STATUS3:
                  start =        DUTYCYCLE50;//set starting dutycle
                  end        =        DUTYCYCLE50;//set ending dutycle
                  P1IES =        ENABLE3;//reset interrupt ENABLE
          break;
          case STATUS4:
                  start =        DUTYCYCLE30;//set starting dutycle
                  end        =        DUTYCYCLE70;        //set ending dutycle
                  P1IES =        ENABLE4;//reset interrupt ENABLE
          break;  
          case STATUS5:
                  start =        DUTYCYCLE10;//set starting dutycle
                  end        =        DUTYCYCLE90;        //set ending dutycle
                  P1IES =        ENABLE5;//reset interrupt ENABLE
          break;
          default:
                  start =        DUTYCYCLE90;//set starting dutycle
                  end        =        DUTYCYCLE10;        //set ending dutycle
                  P1IES =        ENABLE1;//reset interrupt ENABLE
                 
          break;
        }
}
       
void main (void)
{
        WDTCTL         =         WDTPW + WDTHOLD;            //Stop watch dog

          BCSCTL1 =        CALBC1_1MHZ;            //(0x10FF)
        DCOCTL        =        CALDCO_1MHZ

        init_port1();
       
        TACTL         =         TASSEL1 + TACLR;         // SMCLK, clear
        TACTL        =        MC_1+CNTL_0+TACLGRP_0;         //up,16 bits
        TACCTL0        =        CCIE;                                         //timer seting
        TACCTL1        =        OUTMOD_7+CLLD_1;                 //mode 7
          TACCR0         =         MAXSTEP;                //PWM freq
          TACCR1         =         DUTYCYCLE10;                //duty cycle
       
          _EINT();
    LPM0;
}

#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0_ISR(void)
{
  if (end>=start)
        {
          if(dutycyle>=start)&(dutycyle           else dutycyle= start;
        }
        else
        {
                if(dutycyle>=end)&(dutycyle                 else dutycyle= start;
        }
        TACCR1 = dutycyle;
}

#pragma vector=P1_VECTOR
__interrupt void P1_ISR(void)
{         
        P1IFG=0;                                                //clear flag P1IFG
          switch(P1IN&0xOE)// Asuming there might be some jitter            {                                                                //So, I don't use the P1IFG  to determion the state,
          case STATUS1:                //Input P1.1, P1.2 and P1.3 STATUS
                  start        =         DUTYCYCLE90; //set starting dutycle
                  end          =         DUTYCYCLE10; //set ending dutycle
                  P1IES =         ENABLE1; //reset interrupt ENABLE
          break;
          case STATUS2:
                  start        =         DUTYCYCLE70; //set starting dutycle
                  end          =         DUTYCYCLE30;         //set ending dutycle
                  P1IES =         ENABLE2; //reset interrupt ENABLE
          break;
          case STATUS3:
                  start        =         DUTYCYCLE50; //set starting dutycle
                  end          =         DUTYCYCLE50;         //set ending dutycle
                  P1IES =         ENABLE3; //reset interrupt ENABLE
          break;
          case STATUS4:
                  start        =         DUTYCYCLE30; //set starting dutycle
                  end          =         DUTYCYCLE70;         //set ending dutycle
                  P1IES =         ENABLE4; //reset interrupt ENABLE
          break;  
          case STATUS5:
                  start        =         DUTYCYCLE10; //set starting dutycle
                  end          =         DUTYCYCLE90;         //set ending dutycle
                  P1IES =         ENABLE5; //reset interrupt ENABLE
          break;
          default:
          break;
           }
}

  
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
代码的架子没错,而且这个是最基本的东西,建议你自己做然后把遇到的问题贴上来.这样才会有提高噢.
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

6
 
我的问题:中断服务程序中,设下次端口触发中断的上升沿或下降沿时,根据什么(因为端口高低已经翻转)
选择1.当前端口的状态
选择2.上次中断留下的标志
如果2,端口有抖动怎么办
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
1) 用中断控制
2) 在P1.0产生一个连续的 1KHz 变占空比的输出
3) 占空比由P1.1 P1.2 P1.3 控制如下
  P1.1      P1.2      P1.3          占空比(on-off)
  0        1          1              90-10
  1        0          1              70 - 30
  0        0          1              50 - 50
  1        1          0              30 - 70
  0        1          0              10 - 90

/////////////////////////////////////////////

看了一下你的题目没看你的代码

1KHZ
占空比精度要到1/10

那先把定时器搞到10KHZ

每一次定时刚刚好是1/10,然后10次,刚刚好是1KHZ

爽。。。

把控制IO读进来

然后,丢到定时器处理的状态机(自己建一个状态机)上

定时反转

真帅。。。

代码行应该只有LZ给的代码的1/2

嘿嘿,而且还足够帅
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

8
 
友情up
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
谢谢你lbing7的建议, 不过我的题目是针对TI MSP430的。它的TimerA有个功能Mode7, 可以自动产生PWM,不用状态机
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

10
 
晕,没劲

原来就只考一个PWM的应用
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
中断这么宝贵,用来读io口,确实比较变态
另外你的main里怎么没有死循环,,,
 
 
 

回复

89

帖子

0

TA的资源

禁止访问

12
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表