2017-06-23 43 views
0

マイレシーバがP1.1でデジタルデータを送信します。私はすでにタイマーを設定しているので、立ち下がりエッジまたは立ち上がりエッジが発生した場合に割り込みが発生します。私はどのように私はエッジ間の実際の時間を取得するか知っていると思う。その後、私はそれらを配列に保存したいと思います。MSP430 G2553 TimerA IRレシーバの比較モード

メイン:

// 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); 
} 
+0

あなたは 'rxData [0]'と 'rxData [1]'を持っていて、それらの間隔を知りたいですか? –

+0

。 TACCR0は現在の「時間」を得るための正しいレジスタでもありますか?最初のエッジが受信されたときにタイマーを開始するにはどうすればよいですか? –

+0

たとえば、 'rxData [0]'の値が '1010'で、' rxData [1] 'の値が' 1234'の場合、それらの間に何回のティックが経過したか知りたいですか? ( '224') –

答えて

1

はそれをリセットせずに走り続けるタイマーを聞かせて、2つの捕獲の事象の間、ダニの時間差を、取得、および減算しますキャプチャされたタイムスタンプ:

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

この計算は、 eタイマカウンタがオーバーフローします。

+0

私のコードでは、TACCR0を0に設定していますので、最後のエッジが検出されて以来、すべての割り込みがタイマーの正確な値を取得しています...私は間違っています? –

+0

申し訳ありませんが、削除する言及を忘れてしまった。 (ソフトウェアのタイマーをリセットすると、レイテンシーが導入され、精度が低下します。) –

+0

私は、あなたが言ったように自分のコードを変更し、2つの異なるリモート25タイムスタンプで受信しました。しかし、データはまだ変わっています...線形に見え、リモコンの2つの異なるキーはほぼ同じです。いくつかのスクリーンショットを表示します:http://imgur.com/a/lucQi –