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

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-25 11:15
那相差多少呀?计算有没有小忽视的地方?调试看过相应的几个值了么?
tao910221
2楼-- · 2019-03-25 12:34
看了寄存器窗口,寄存器里面的值没问题。计算值是理论值的1/4,用示波器测得正脉宽是4ms,计算出的是1ms。但是当我把实验改成测一个按键高电平的持续时间时,实验是正确的,时间基本符合。再请教你一个比较器A+的问题,当做比较器的实验时,为什么P1.1和P1.2总是高电平!P1.1和P1.2分别对应比较通道CA1和CA2。不管我用不用这两个通道,只要是我做比较器这块的实验,我选择其他比较通道,P1.1和P1.2始终为高电平。我一直搞不懂是为啥?求指点……谢啦!!

一周热门 更多>

相关问题

    相关文章