This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:用于测量转速计脉冲时钟的 TimerA 不会启动斜坡;输入保持低电平

Guru**** 1860360 points
Other Parts Discussed in Thread: MSP430G2553
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1405664/msp430g2553-timera-used-to-measure-tachometer-pulse-clock-wont-start-input-held-low

器件型号:MSP430G2553

工具与软件:

您好:提前感谢您在这个问题上提供的任何帮助。

我正在尝试对连接到 LaunchPad 上 MSP430G2553芯片 P2.5的霍尔效应传感器的脉冲时序进行监控。

timerA 从不启动、TA1R 寄存器保持为零。 当我注释掉 InitHallSensor()代码时、计时器将按预期递增计数。

另外、当 LaunchPad (P2.5)的引脚13断开连接时、霍尔传感器电路会提供正确的脉冲、但当它连接时(在示波器上检测到的)保持低电平。

我将尝试简化操作、而不使用端口/引脚的数字 I/O。 我是否必须使用端口中断(引脚为数字 I/O)、或者我是否可以跳过该操作并直接转到通过 MSP430G2553数据表中所示的 CCI2B 输入触发计时器捕捉中断?

以下是我的霍尔效应传感器(018 412)电路。

以下是我的代码。

#include <intrinsics.h>
#include <msp430.h>
#include <stdio.h>
#include <stdint.h>

void InitPorts(void);
void InitHallSensor(void);

#define SENSOR_PIN BIT5   //attach hall sensor to P2_5 TA1.2

volatile unsigned int cntOvrFloTAR = 0;
volatile uint16_t currTimerCounts = 4;

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    //set up Basic Clock Module
    BCSCTL1 |= DIVA_3; //this write clears all other bits; divide ACLK/8
    BCSCTL3 |= XCAP_3; //sets internal capacitance for watch crystal

    InitPorts();
    InitHallSensor();
	
    //Set up Timer1A
    // capture on rising edge, CCI2B input, synchronous cap, capture mode, ints enabled
    TA1CCTL2 = CM_1 | CCIS_1 | CAP | CCIE | SCS;
    // Continuous, divide clock by 1, ACLK, clear, enable
    TA1CTL = MC_2 | ID_0 | TASSEL_1 | TACLR | TAIE;
    __enable_interrupt();

    for(;;){
        // wait
    }
}
#pragma vector = TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR (void){
    switch (__even_in_range(TA1IV, 10)){
    case 0:
        break;
    case TA1IV_TACCR2:
        TA1CCTL2 &= ~CCIE;    // disable further CCIE interrupts
        currTimerCounts = TA1CCR2;
        cntOvrFloTAR = 0; //reset TAR rollover counter
        TA1CCTL2 &= ~CCIFG; // clear the CCRO flag
        TA1CCTL2 |= CCIE; //enable interrupts
        break;
    case TA1IV_TAIFG:
        ++cntOvrFloTAR;
        break;
    default:
        for (;;){
            //Should not be possible
        }
    }
}
void InitPorts(void){
    P1OUT = 0;
    P1DIR = 0xFF;
    P2OUT = 0;
    P2DIR = 0xFF;
}
void InitHallSensor(void){
    P2DIR &= ~SENSOR_PIN; //Set pin as input
    P2SEL = SENSOR_PIN; //Set pin for Timer1_A CCI1A capture
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > P2SEL = SENSOR_PIN;//设置针对 Timer1_A CCI1A 捕捉的引脚

    这将关闭 P2.6/.7上的晶体振荡器。 请尝试改用:

    > P2SEL |= SENSOR_PIN;//设置 Timer1_A CCI1A 捕捉的引脚

    [编辑:更正了拼写错误]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您花时间赶上这个!

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce

    感谢您的帮助~

    此致、

    Helic