13294|28

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求一个MSP430G2553的捕获程序,谁有的话请发一个,谢谢! [复制链接]

 

……

最新回复

   TACCTL1 &= ~CCIFG;         P1OUT ^= BIT0;         interval = (CCR1 - CCRx) + (CCRy   详情 回复 发表于 2016-7-19 15:15
点赞 关注(1)
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
//////////////////////////////主工程文件////////////////////////////////////////
#include
#include "Init.h"
////////////////////////////////////////////////////////////////////////////////
uint Fre;           //定义频率
////////////////////////////////////主函数//////////////////////////////////////
int main( void )                           
{
    WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer to prevent time out reset
    InitSys();                  //总系统复位
   
    LCD_InitDisplay1();
    delay_ms(100);            //捕获P1.0  采电压P1.1
   
    P1DIR |= BIT0;
   
    while (1)
    {
        LCD_Display3(Fre);
        delay_ms(10);
        P1OUT ^= BIT0;
    }
}

//////////////////////////////////AD10中断//////////////////////////////////////

//////////////////////////////////频率计数//////////////////////////////////////
//Timer_A中断程序
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A (void)
{
    if (TACCTL1 & CCIFG)
    {
        TACCTL1 &= ~CCIFG;
        Fre = 10;
    }
}
 
 
 

回复

327

帖子

0

TA的资源

纯净的硅(高级)

推荐
 

先查器件手册(非UserGuide)找到有TA0.1或者TA0.2的管脚,
管脚设置为输入并且选中第二功能就可以作为捕获CCIxA的输入,TA0.1对应CCR1,TA0.2对应CCR2。
例如我选择了P1.2(TA0.1),则设置CCR1的TACCTL1中的设置,开启捕获模式(Cap)、选择捕获源(CCIS_0 <-- CCIxA),选择捕获边缘、开启中断。
  1. P1DIR &= ~BIT2; // P1.2 = (InputDirection + TA0.1) = CCIxA.1 --> CCR1
    P1SEL |= BIT2;

    TACCTL1 = CAP + CCIS_0 + CM_3 + CCIE; // Capture CCIxA, both edge, interrupt enable.
    TACTL = TASSEL_1 + MC_2; // ACLK, continuous mode.

    while(1){
        _BIS_SR(LPM3 + GIE);
    }
复制代码

然后就是中断服务程序,注意要及时清CCIFG标志位。interval就是ACLK的计数。注意中断向量是vector=TIMER0_A1_VECTOR,而不是vector=TIMER0_A0_VECTOR。手册上写TIMER_A3_Vector太坑人了……

  1. volatile unsigned int CCRx = 0;
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void TAIV_ISR(void){
        unsigned int interval;
        if(TACCTL1 & CCIFG){
            TACCTL1 &= ~CCIFG;
            P1OUT ^= BIT0;
            interval = CCR1 - CCRx;
            CCRx = CCR1;
        // do whatever you need here, your call ....^ ^
    }
}
复制代码

不是特别麻烦吧

点评

注意中断向量是vector=TIMER0_A1_VECTOR,而不是vector=TIMER0_A0_VECTOR。 为什么呢,不是用的TA0吗,为什么要写成TIMER0_A1_VECTOR啊?求教学!  详情 回复 发表于 2012-8-19 13:27
能不能帮我看看这个串口程序为什么不工作吗? #include \"msp430g2553.h\" void main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1SEL |=BIT1 + BI  详情 回复 发表于 2012-7-30 10:45
谢谢 您 回复的好详细 都见你几次 太感谢了  详情 回复 发表于 2012-7-16 22:09
个人签名Python全文搜索引擎:<url>http://code.google.com/p/ming-search/</url>
 
 
 

回复

327

帖子

0

TA的资源

纯净的硅(高级)

4
 

补充一下如何软件扩展成32位/64位捕获

有的时候要精细计时,16bit不够用需要32位。可以用软件的方式实现。修改:
  1. TACTL = TASSEL_1 + MC_2; // ACLK, continuous mode.
复制代码
开启TA的中断(timer值到达0xFF时发生中断,置TAIFG标志位)
  1. TACTL = TASSEL_1 + MC_2 + TAIE; // ACLK, continuous mode, interrupt enabled.
复制代码

然后增加一个全局变量:
  1. volatile unsigned int CCRy = 0;
复制代码
并且在修改TAIV_ISR(TIMER0_A1_VECTOR)的代码,增加TAIFG的判断:
  1. volatile unsigned int CCRx = 0;
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void TAIV_ISR(void){
        unsigned long interval;
        if(TACCTL1 & CCIFG){
            TACCTL1 &= ~CCIFG;
            P1OUT ^= BIT0;
            interval = (CCR1 - CCRx) + (CCRy << 16); // 32bit now ^ ^
            CCRx = CCR1;
            CCRy = 0;
        }
        if(TACTL & TAIFG){ // timer overflow
            TACTL &= ~TAIFG;
            CCRy ++;
        }
    }
复制代码
同理还可以扩展到64位、128位、1048576位
[ 本帖最后由 elulis 于 2012-7-16 03:11 编辑 ]

点评

我也有些问题 #include \"msp430g2553.h\" void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= (BIT0|BIT1|BIT2); // P1.2 output P1SEL |= BIT2; P1SEL |= (BIT0|BIT1|BIT2); //  详情 回复 发表于 2012-7-17 19:41
个人签名Python全文搜索引擎:<url>http://code.google.com/p/ming-search/</url>
 
 
 

回复

327

帖子

0

TA的资源

纯净的硅(高级)

5
 
再补充一下,有的时候TAIV_ISR处理的时间太长的,错了一次捕获。使用TACCTLx的COV标志位就可以判断,例如:

  1. if(TACCTL1 & COV){
        TACCTL1 &= ~COV; //此标志位要手动清除。
        // 有信号错过了,从头再捕获或者估算一下吧……
    }
复制代码

还有哦,前面说到的捕获边缘,通过CM_0/ CM_1 / CM_2 / CM_3 可以分别选择 不捕获 / 上升沿 / 下降沿 / 都捕获。举例来说如果捕获按键的时间间隔用上升沿或者下降沿就可以了,如果要记录红外遥控的数据则必须用CM_3才行。
最后注意是CCIS_1不是CCIS1,少一个下划线可就不工作了哦。
[ 本帖最后由 elulis 于 2012-7-16 03:28 编辑 ]

点评

谢谢!  详情 回复 发表于 2012-7-16 14:55
个人签名Python全文搜索引擎:<url>http://code.google.com/p/ming-search/</url>
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼 elulis 的帖子

谢谢!
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

7
 

回复 沙发 elulis 的帖子

谢谢 您 回复的好详细    都见你几次 太感谢了
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 板凳 elulis 的帖子

我也有些问题
#include "msp430g2553.h"

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // Stop WDT
  P1DIR |= (BIT0|BIT1|BIT2); // P1.2 output
  P1SEL |= BIT2;
  P1SEL |= (BIT0|BIT1|BIT2); // P1.2 TA1 otions
  CCR0 = 1000; // PWM Period/2
  CCR1 = 500; // CCR1 PWM duty cycle
  CCTL1 = OUTMOD_6;
  TACTL = MC_1; // up mode
  _BIS_SR(LPM3_bits); // Enter LPM3
  while(1);
}
P1DIR |= (BIT0|BIT1|BIT2); // P1.2 output
  P1SEL |= BIT2;
  P1SEL |= (BIT0|BIT1|BIT2); // P1.2 TA1 otions
这三句该成这样为什么就不行了
P1DIR |=BIT2; // P1.2 output
P1SEL |= BIT2;
而且用上面那程序的时候为什么p1.0会亮呢?
麻烦指导

点评

端口只要使能为输出就默认为高,所以就亮了! 那三句改了是可以的,TA的计数时钟选一下,TACTL |= TASSEL_2 + MC_1 + ID_0 + TACLR; 低功耗模式改成_BIS_SR(CPUOFF);  详情 回复 发表于 2012-7-18 09:11
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 7楼 luobo123 的帖子

端口只要使能为输出就默认为高,所以就亮了!
那三句改了是可以的,TA的计数时钟选一下,TACTL |= TASSEL_2 + MC_1 + ID_0 + TACLR; 低功耗模式改成_BIS_SR(CPUOFF);

点评

谢谢,按你的来做,问题解决了,你能不能再发个串口的程序给我。  详情 回复 发表于 2012-7-19 09:59
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

10
 
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

11
 

回复 8楼 yangshun 的帖子

谢谢,按你的来做,问题解决了,你能不能再发个串口的程序给我。

点评

/* 完成时间:2012年7月19日21时19分58秒 程序功能:串口测试 */ #include \"msp430g2553.h\" unsigned char temp[] = \"welcome!\"; void main(void) { WDTCTL = WDTPW + WDTHOLD;  详情 回复 发表于 2012-7-19 21:16
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

12
 

回复 10楼 luobo123 的帖子

/*
  完成时间:2012年7月19日21时19分58秒
  程序功能:串口测试
*/
#include  "msp430g2553.h"

unsigned char temp[] = "welcome!";

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  
  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

  __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0, interrupts enabled
}

//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  unsigned char i = 0;
  
  while (!(IFG2&UCA0TXIFG));                // 发送中断标志检测,每次发送后都要检测
                                            //直到发送完成,才可发送下个字节的数据
  UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
  while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  
  if (UCA0RXBUF == 'H')
  {
    while (temp != '\0')
    {
      UCA0TXBUF = temp;
      while (!(IFG2 & UCA0TXIFG));
      i++;
    }
  }
}

点评

谢谢了  详情 回复 发表于 2012-7-30 10:50
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

13
 
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

14
 

回复 沙发 elulis 的帖子

能不能帮我看看这个串口程序为什么不工作吗?
#include "msp430g2553.h"
void main( void )
{
   // Stop watchdog timer to prevent time out reset
   WDTCTL = WDTPW + WDTHOLD;
   P1SEL |=BIT1 + BIT2 ;
   UCA0CTL1 |= UCSSEL_2;
   UCA0BR0 = 104;
  UCA0BR1 = 0;
   UCA0MCTL = UCBRS_1 + UCBRF_0;
   UCA0CTL1 |=~UCSWRST;
   IE2 |= UCA0RXIE;
   while(1)
   {
      _BIS_SR(LPM3_bits + GIE);
     while(!(IFG2&UCA0TXIFG));
       UCA0TXBUF = UCA0RXBUF;
  }
   
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void usart0(void)
{
    LPM3_EXIT;
}
谢谢了!

点评

UCA0CTL1 &=~UCSWRST;  详情 回复 发表于 2012-7-31 09:51
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 11楼 yangshun 的帖子

谢谢了
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

16
 

回复 13楼 luobo123 的帖子

UCA0CTL1 &=~UCSWRST;

点评

果然是高手!行了  详情 回复 发表于 2012-7-31 17:04
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

17
 

回复 15楼 yangshun 的帖子

果然是高手!行了
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

18
 
void TIMERA_Fre()
{
    P1DIR &= ~BIT2;
    P1SEL |= BIT2;
   
    TACCTL1 |= CAP + CCIS_0 + CM_3 + CCIE;
    TACTL |= TASSEL_1 + MC_2;
}
貌似不行呀
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

19
 
大哥们 我直接粘过去了  我用的CCS  这三句有错在哪办
volatile unsigned int CCRx = 0;
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TAIV_ISR(void){
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

20
 

回复 沙发 elulis 的帖子

注意中断向量是vector=TIMER0_A1_VECTOR,而不是vector=TIMER0_A0_VECTOR。
为什么呢,不是用的TA0吗,为什么要写成TIMER0_A1_VECTOR啊?求教学!

点评

vector=TIMER0_A0_VECTOR是专门供CCR0用的。 CCR1,CCR2,和主计数器的溢出中断都用vector=TIMER0_A1_VECTOR,其实应该在中断服务函数里switch一下,选择看是CCR1或CCR2或主计数器的溢出三者里的哪一个导致的中断,继  详情 回复 发表于 2014-8-13 20:30
CCR0中断向量是TIMER0_A0_VECTOR;CCR1、CCR2、TAIFG共用TIMER0_A1_VECTOR这个中断向量。  详情 回复 发表于 2012-8-19 23:22
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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