MSP430 G2553 TimerA Режим сравнения для ИК-приемника

Мой ИК-приемник отправляет мне Цифровые данные на P1.1. Я уже настроил свой таймер, чтобы при наличии падающего или нарастающего фронта срабатывало прерывание. Я хочу знать, как я могу получить фактическое время между краями. После этого я хочу сохранить их в массиве.

Главный:

// Stop watchdog timer
WDTCTL = WDTPW + WDTHOLD;

//1mhz = 0.000001
BCSCTL1 = CALBC1_1MHZ;               // load calibrated data
DCOCTL = CALDCO_1MHZ;

//Define Outputs
P1DIR = green_led+red_led+IR_Send;
P2DIR = LED1+LED2+LED3;

//Define Inputs
P1DIR &= ~IR_Recv;

//Set IR_Recv as input for Timer (TA0.CCI0A)
P1SEL |= BIT1;

//Timer_A using SMCLK/8 = 0.000008s and Continuous mode
TACTL = TASSEL_2 | MC_2 | ID_3;

// falling edge and rising edge capture mode, CCI0A, enable IE
CCTL0 = CM_3 | CCIS_0 | CAP | CCIE;

//Enter LPM and enable Global Interrupts
__bis_SR_register(CPUOFF + GIE);

Программа прерывания:

//gets called when falling or rising edge is detected on IR_Recv
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
if(edgeCount < 10){
    rxData[edgeCount] = TACCR0;
    TACCR0 = 0;
}
edgeCount++;

P2OUT ^= LED2;
//Clear interrupt Flag
TACCTL0 &= ~CCIFG;
//go back to LPM
__bic_SR_register_on_exit ( CPUOFF );
}

1 ответ

Решение

Чтобы получить разницу во времени между двумя захваченными событиями в тиках, просто оставьте таймер включенным, не сбрасывая его, и вычтите собранные метки времени:

uint16_t difference = rxData[1] - rxData[0];

Это вычисление верно, даже если счетчик таймера переполнен.

Другие вопросы по тегам