2143|1

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

我刚有了一个面试,给我留了个作业。哪位能帮帮我? [复制链接]

我刚有了一个面试,给我留了个作业。哪位能帮帮我?我的工作就有希望了
写已小段程序 TI MSP430Fxxx
1) 用中断控制
2) 在P1.0产生一个连续的 1KHz 变占空比的输出
3) 占空比由P1.1 P1.2 P1.3 控制如下
  P1.1      P1.2       P1.3      Duty Cycle (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

最新回复

我自己写了一个,找问题给分 #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)è?¨DCO??1MHZ         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=end)&(dutycyle  详情 回复 发表于 2008-12-21 07:06
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我自己写了一个,找问题给分
#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)è?¨DCO??1MHZ
        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;
           }
}

  
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表