工具与软件:
您好:提前感谢您在这个问题上提供的任何帮助。
我正在尝试对连接到 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 }