4299|3

99

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求检查msp430f5438捕获测频率哪里错了!如果能给分我全给你! [复制链接]

#include
#include "LCD_12864.h"
#include "CLOCK.h"
unsigned int start,end;
unsigned char overflow,flag;
unsigned long gao,di;
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  InitSysCLKXT2();
  INI_LCD();
  P2SEL|=BIT2;
  flag=0;
  TA1CTL=TAIE+TASSEL__SMCLK+TACLR+MC__UP;//选择计时器时钟为SMCLK打 分频比为1 UP增模式
  TA1CCTL1=CCIE+CAP+CM0+SCS;//打开中断 打开捕获 上升沿捕获 同步捕获   
  TA1CCR0=60000;
  __bis_SR_register(GIE);
  while(1)
  {
  }
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void)
{
  switch(__even_in_range(TA1IV,14))
  {
    case  0: break;                          // No interrupt
    case  2:                                 // Add Offset to CCR1
      {  
        if(TA1CCTL1&CM0)
        {  
          start=TA1CCR1;
          TA1CCTL1=(TA1CCTL1&(~CM0))|CM1; //改为下降沿触发
          start=TA1CCR1;
          gao=overflow*60000+start;
          overflow=0;
        }
        else if(TA1CCTL1&CM1)
        {
          TA1CCTL1=(TA1CCTL1&(~CM1))|CM0;
          end=TA1CCR1;
          di=overflow*60000+end;
        }
      }
      break;                           
    case  4: break;                          // CCR2 not used
    case  6: break;                          // CCR3 not used
    case  8: break;                          // CCR4 not used
    case 10: break;                          // CCR5 not used
    case 12: break;                          // Reserved not used
    case 14:                                 // 溢出数加1
             overflow++;
             break;
    default: break;
  }
  
}
高电平时间在gao,低电平时间在di,仿真发现这两个数一直在加,很是不懂!求解释,告诉我怎么给分,然后100多分全给你!

最新回复

刚才看到你说你的芯片烧了。。。默哀一下。 你说100K很准,频率降低就不准了 我的建议是,仿真的时候设好断点,在watch观察各个变量,一步一步执行,你把watch里看到的变量的值算一下,和实际中的比较一下,看看到底是哪个步骤得出的结果影响了精度~  详情 回复 发表于 2011-8-15 18:19
 
点赞 关注

回复
举报

60

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
我稍微看了下
你这个定时器用的是增模式吧,增模式是计时到CCR0的值,你设的60000,
但是CCR0有自己独立的中断向量,TIMEA1的中断向量是CCR1-CCR6的,case 14的溢出,应该是0xffff寄存器计时满的溢出,不是你设的CCR0的溢出,你应该再写个CCR0的中断程序,在这里面overflow++。
还有,你这个gao 跟 di 你想求的是什么?
如果你想求高电平的时间,不应该是上升沿触发后的 CCR1,下降沿的触发后的CCR1,两者相减+overflow*(60000+1)吗?

赞赏

1

查看全部赞赏

 
 

回复

99

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
#include
#include "LCD_12864.h"
#include "CLOCK.h"
unsigned int end,a1,start;
unsigned char overflow;
double data;
unsigned long fre,a;
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  InitSysCLKXT2();
  INI_LCD();
  P2SEL|=BIT2;
  TA1CTL|=TAIE+TASSEL__SMCLK+TACLR+ MC__CONTINOUS;//选择计时器时钟为SMCLK打 分频比为1 UP增模式
  TA1CCTL1|=CCIE+CAP+CM0+SCS;//打开中断 打开捕获 上升沿捕获 同步捕获
  _EINT();
  while(1)
  {
    __bis_SR_register(LPM0+GIE);
    data=(end-start+overflow*65536)*0.000000125;
    fre=(unsigned long)(1/(2*data));
    write_cmd(0x01);
    write_cmd(0x80);
    displayshu(fre);
    __delay_cycles(800000);
  }
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void)
{
  switch(__even_in_range(TA1IV,14))
  {
    case  0: break;                          // No interrupt
    case  2:                                 // Add Offset to CCR1
      {  
        if(TA1CCTL1&CM0)
        {  
          TA1CCTL1=(TA1CCTL1&(~CM0))|CM1; //改为下降沿触发
          start=TA1CCR1;
          overflow=0;
        }
        else if(TA1CCTL1&CM1)
        {
          TA1CCTL1=(TA1CCTL1&(~CM1))|CM0;
          end=TA1CCR1;
          LPM0_EXIT;
        }
      }
      break;                           
    case  4: break;                          // CCR2 not used
    case  6: break;                          // CCR3 not used
    case  8: break;                          // CCR4 not used
    case 10: break;                          // CCR5 not used
    case 12: break;                          // Reserved not used
    case 14:                                 // 溢出数加1
             overflow++;
             break;
    default: break;
  }
}
我按你的意思把程序修改了下,测100K的时候很准,频率下来之后就不行了,帮我看看哪里错了?我觉得都对的。。。
 
 
 

回复

60

帖子

0

TA的资源

纯净的硅(初级)

4
 

回复 板凳 水货老手 的帖子

刚才看到你说你的芯片烧了。。。默哀一下。
你说100K很准,频率降低就不准了
我的建议是,仿真的时候设好断点,在watch观察各个变量,一步一步执行,你把watch里看到的变量的值算一下,和实际中的比较一下,看看到底是哪个步骤得出的结果影响了精度~

赞赏

1

查看全部赞赏

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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