大家帮我看看这个捕获实验哪里有错误?调试的时候,计算得出的时间总是和理论值不...

2019-03-24 12:21发布

#include "msp430G2553.h"
unsigned int start,end;//定义两个无符号整形变量start和end
unsigned char overflow;//定义一个无符号字符型变量overflow
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;//关闭看门狗
  P1DIR|=BIT0+BIT6;//P1.0和P1.6设置为输出
  P1DIR&=~BIT2;//P1.2设置为输入
  P1SEL|=BIT0+BIT2;//复用功能选择P1.0->ACLK输出,P1.2->捕获输入
  P1OUT&=~BIT6;//关闭P1.6LED
  BCSCTL1 =DIVA_3;//ACLK8分频(vlo=12Khz)
  TACCTL1=CM_1+SCS+CCIS_0+CAP+CCIE;//上升沿捕获+同步捕获+CCI1A(p1.2)输入+捕获功能+捕获中断
  TACTL=TASSEL_2+MC_2+ID_3+TAIE+TACLR;//选择SMCLK(DCO=1.1Mhz)时钟源,8分频,连续计数模式、开启定时器中断、定时器清零
  while(1)
  {
          _BIS_SR(LPM0_bits+GIE);//进入低功耗模式0,开启全局中断
  }
}
#pragma vector=TIMER0_A1_VECTOR        //#pragma 预处理指令,指明引起中断的中断向量类型
__interrupt void Timer_A (void)//中断处理函数
{
  switch(TAIV)//向量查询
  {
    case 2://捕获中断
      if(CCTL1&CM_1)//上升沿
      {
        CCTL1=(CCTL1&(~CM_1))|CM_2;//更变设置为下降沿触发
        start=TAR;//记录初始时间
        overflow=0;//溢出计数变量复位
      }
      else if(CCTL1&CM_2)//下降沿
      {
          CCTL1=(CCTL1&(~CM_2))|CM_1;//更变设置为上升沿触发
          end=TAR;//记录结束时间
      }
      P1OUT|=BIT6;//拉升P1.6电平
      break;
    case 10://定时器溢出中断
      overflow++;//溢出计数加1
      break;
    default:
      break;
   }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
wangfuchong
1楼-- · 2019-03-24 17:01
< BCSCTL1 =DIVA_3;//ACLK8分频(vlo=12Khz)

时钟配置有没有问题?

给个CCS软件自动配置的例程(ALCK使用的32768晶体,如用VLO需要修改BCSCTL3)
  1. /* USER CODE START (section: BCSplus_graceInit_prologue) */
  2.     /* User initialization code */
  3.     /* USER CODE END (section: BCSplus_graceInit_prologue) */
  4.    
  5.     /*
  6.      * Basic Clock System Control 2
  7.      *
  8.      * SELM_0 -- DCOCLK
  9.      * DIVM_0 -- Divide by 1
  10.      * ~SELS -- DCOCLK
  11.      * DIVS_3 -- Divide by 8
  12.      * ~DCOR -- DCO uses internal resistor
  13.      *
  14.      * Note: ~ indicates that has value zero
  15.      */
  16.     BCSCTL2 = SELM_0 + DIVM_0 + DIVS_3;

  17.     if (CALBC1_8MHZ != 0xFF) {
  18.         /* Follow recommended flow. First, clear all DCOx and MODx bits. Then
  19.          * apply new RSELx values. Finally, apply new DCOx and MODx bit values.
  20.          */
  21.                 __delay_cycles(100000);
  22.         DCOCTL = 0x00;
  23.         BCSCTL1 = CALBC1_8MHZ;      /* Set DCO to 1MHz */
  24.         DCOCTL = CALDCO_8MHZ;
  25.     }

  26.     /*
  27.      * Basic Clock System Control 1
  28.      *
  29.      * XT2OFF -- Disable XT2CLK
  30.      * ~XTS -- Low Frequency
  31.      * DIVA_0 -- Divide by 1
  32.      *
  33.      * Note: ~XTS indicates that XTS has value zero
  34.      */
  35.     BCSCTL1 |= XT2OFF + DIVA_0;

  36.     /*
  37.      * Basic Clock System Control 3
  38.      *
  39.      * XT2S_0 -- 0.4 - 1 MHz
  40.      * LFXT1S_0 -- If XTS = 0, XT1 = 32768kHz Crystal ; If XTS = 1, XT1 = 0.4 - 1-MHz crystal or resonator
  41.      * XCAP_1 -- ~6 pF
  42.      */
  43.     BCSCTL3 = XT2S_0 + LFXT1S_0 + XCAP_3;
  44.    
  45.     /* USER CODE START (section: BCSplus_graceInit_epilogue) */
  46.     /* User code */
  47.     /* USER CODE END (section: BCSplus_graceInit_epilogue) */
复制代码先看看这个有没有问题,后面的代码我还没看
tao910221
2楼-- · 2019-03-24 18:55
< :TI_MSP430_内容页_SA7 --> BCSCTL1 =DIVA_3;//ACLK8分频(vlo=12Khz)这里是设置ACLK时钟信号的!系统时钟信号时子系统时钟SMCLK。BCSCTL1 =DIVA_3;//ACLK8分频(vlo=12Khz)这里是P1.0的ACLK输出!我感觉系统时钟应该没问题吧……不知哪出错了!都几天了!求帮忙啊……
wangfuchong
3楼-- · 2019-03-24 21:05
 精彩回答 2  元偷偷看……
tao910221
4楼-- · 2019-03-25 01:51
哦!看过了!明白了……谢谢啦!
wangfuchong
5楼-- · 2019-03-25 02:27
不过说了,不一定是你的问题的根本,那个只是容易出错

没看仔细
你为何不用上下沿都捕捉的方式CM_3呢?
tao910221
6楼-- · 2019-03-25 06:58
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章