2016-07-18 22 views
-1

クイック質問。どのようにしてこの特定の割り込みで10秒間、1分間割り込みを設定するのですか?私は下のカウンターを使ってみましたが、うまくいきません。このプログラムが待機すると、1秒間中断します。私は通常、10秒の割り込みの間隔を達成するために.... .... ....しかし、彼は日本であり、これらのような時代に教授にMSP430 TIMERA1割り込み

#include <msp430.h> 

#define RedLED BIT0 
#define GreenLED BIT6 

#define RedLEDToggle (P1OUT ^= RedLED) 
#define GreenLEDToggle (P1OUT ^= GreenLED) 



unsigned int i = 0; 

void main(void) 
{ 

WDTCTL = WDTPW|WDTHOLD; 


P1DIR = RedLED|GreenLED; 
P1OUT = RedLED|GreenLED; 

TACTL = TASSEL_2|ID_3|MC_3|TAIE; 

TACCR0 = 62500; 



_enable_interrupts(); 

LPM1; 
} 

#pragma vector=TIMER0_A1_VECTOR 
__interrupt void Timer_A(void){ 

if (int i == 10) 
{ 
    switch(TAIV) 
     { 
      case 0x02: break; 
      case 0x04: break; 
      case 0x0A: RedLEDToggle|GreenLEDToggle;; 
      break; 
     } 
} 
else 
{ 
i++; 
} 
} 
+0

このコードは一回10秒の割り込みを呼び出します。一度だけ中断して、もう一度中断しませんか? 1秒ごとに連続していますか?あなたは、いくつかの共通のタイムベースで1割り込みをし、あなたのより高い時間までカウントアップしますか? – engineer14

+0

おそらく長いことですが、TIはマイコンに関する質問をする専用のフォーラムを持っていませんか?私は、MSP430コントローラの正確な知識を持つ多くの専用の組み込みプログラマはいないと思います。 –

+0

もう1つの質問が保留になっているので、私はこの回答にもお答えします。 1つ(または両方)を削除して、1つの質問で再開したい場合があります。 – kfx

答えて

1

を行くと、あなたが入力分周器を適用する必要がありますタイマーに送る。周辺機器のサポートなしで1分を達成することはできません(ソフトウェアカウンターで実装できます)。

問題は、msp430マイクロコントローラには16ビットのレジスタがあり、65535を超える数値を保持できないことです。32768Hzで動作する低周波発振器を使用します(典型的な - ハードウェアあなたのシステムのクロックソース、それらが異なる周波数を持っている場合は、入力除算器が適用されていない限り、レジスタは2秒に1回オーバーフローします)。 MSP430x2xxxファミリMCUの入力分周器の最大値は8であるため、ハードウェアタイマを将来8 * 2 = 16秒以上に設定することはできません。詳細はMSP430x2xxx family user's guideを参照してください。あなたはそれらの#define定数は、私は正確な問題に提供することができますヘルプが限られているので、何であるかを告げずに、最初のレジスタへの#define定数を使用している

#include <msp430.h> 

#define RedLED BIT0 
#define GreenLED BIT6 

#define RedLEDToggle (P1OUT ^= RedLED) 
#define GreenLEDToggle (P1OUT ^= GreenLED) 

// 10 seconds, assuming 32768 Hz ACLK source and divider 8 
#define TIMER_PERIOD (10u * (32768/8)) 

void main(void) 
{ 
    WDTCTL = WDTPW | WDTHOLD; 

    P1DIR = RedLED | GreenLED; 
    P1OUT = RedLED | GreenLED; 

    // reset timer A config (not strictly needed) 
    TACTL = TACLR; 

    // ACLK as clock source, divider 8, continuous mode, interrupt enabled 
    TACTL = TASSEL_1 | ID_3 | MC_2 | TAIE; 

    // set the period 
    TACCR1 = TIMER_PERIOD; 

    // enable capture/compare interrupts for CCR1 
    TACCTL1 = CCIE; 

    _enable_interrupts(); 

    LPM1; 
} 

#pragma vector=TIMER0_A1_VECTOR 

__interrupt void Timer_A(void) 
{ 
    switch (TAIV) { 
    case TA0IV_TACCR1: 
     // CCR1 interrupt 
     RedLEDToggle; 
     GreenLEDToggle; 
     // set the time of the next interrupt 
     TACCR1 += TIMER_PERIOD; 
     break; 
    } 
} 
関連する問題