- なぜ割り込みが必要なのですか?
- MSP430の割り込みの種類
- MSP430の割り込みプログラム制御
- GPIO割り込みをテストするMSP430回路
- 割り込み用のMSP430のプログラミング
- CCSからMSP430へのプログラムのアップロード
- MSP430の割り込みプログラム
時間を表示するようにプログラムされたシンプルなデジタル時計を考えてみましょう。タイムゾーンを変更したいとします。あなたならどうしますか?タイムゾーンを変更できるメニューに変わるボタンを押すだけです。ここでは、システムは時間管理プロセスへの外部割り込みを予測できず、時計の秒の値をインクリメントするのに忙しいため、待つように要求することはできません。これは、割り込みが便利な場所です。
割り込みは必ずしも外部である必要はありません。内部でもかまいません。ほとんどの場合、組み込み割り込みでは、CPUの2つの周辺機器間の通信も容易になります。プリセットされたタイマーがリセットされ、時間がタイマーレジスタの値に達すると割り込みがトリガーされると考えてください。割り込みハンドラは、DMAなどの他のペリフェラルを開始するために使用できます。
このチュートリアルでは、MSP430の外部割り込みを使用してさまざまなLEDを切り替えました。押しボタンを使用した状態変化によって外部割り込みが発生すると、制御がISRに転送(プリエンプト)され、必要な処理が実行されます。MSP430G2ランチパッドのCCS環境設定などの基本を知るには、このチュートリアルでは詳細を説明しないため、CCSを使用したMSP430の使用を開始するこのリンクをたどってください。リンクをたどって、EnergiaIDEとCCSを使用した他のMSP430ベースのチュートリアルも確認してください。
なぜ割り込みが必要なのですか?
組み込みシステムのポーリングオーバーヘッドを節約するには、割り込みが必要です。現在実行中のタスクをプリエンプトして、優先度の高いタスクを実行する必要がある場合に呼び出されます。また、CPUを低電力モードからウェイクアップするためにも使用できます。GPIOポートを介した外部信号のエッジ遷移によってウェイクアップされると、ISRが実行され、CPUは再び低電力モードに戻ります。
MSP430の割り込みの種類
MSP430の割り込みには、次のタイプがあります。
- システムリセット
- マスク不可割り込み
- マスク不可割り込み
- ベクトル化および非ベクトル化割り込み
システムリセット:
これは、供給電圧(Vcc)と、リセットモードが選択されたRST / NMIピンの信号低下が原因で発生する可能性があり、ウォッチドッグタイマーのオーバーフローやセキュリティキー違反などの理由で発生する可能性もあります。
マスク不可割り込み:
これらの割り込みは、CPU命令でマスクすることはできません。一般割り込みを有効にすると、マスク不可割り込みを処理からそらすことはできません。これは、オシレータ障害やRST / NMI(NMIモード)に手動で与えられたエッジなどのソースによって生成されます。
マスク不可割り込み:
割り込みが発生し、CPU命令でマスクできる場合は、マスク可能割り込みです。それらは常に外部である必要はありません。また、周辺機器とその機能にも依存します。ここで使用される外部ポート割り込みは、このカテゴリに分類されます。
ベクトル化された割り込みと非ベクトル化された割り込み:
ベクトル化:この場合、割り込みを行うデバイスは、割り込みベクトルアドレスを渡すことにより、割り込みのソースを提供します。ここでは、ISRのアドレスが固定され、制御がそのアドレスに移され、ISRが残りを処理します。
非ベクトル化: ここでは、すべての割り込みに共通のISRがあります。ベクトル化されていないソースから割り込みが発生すると、制御は共通のアドレスに移され、ベクトル化されていないすべての割り込みが共有されます。
MSP430の割り込みプログラム制御
割り込みが発生すると、MCLKがオンになり、CPUがオフ状態からコールバックされます。割り込み発生後、プログラムの制御がISRアドレスに移されると、プログラムカウンタとステータスレジスタの値がスタックに移されます。
続いて、ステータスレジスタがクリアされ、それによってGIEがクリアされ、低電力モードが終了します。プログラムカウンタに割り込みベクタアドレスを配置することにより、優先度の最も高い割り込みを選択して実行します。MSP430 GPIO割り込みサンプルコードに入る前に、それに関連するポートレジスタの動作を理解することが重要です。
MSP430のGPIO制御用のポートレジスタ:
PxDIR:ポート方向制御レジスタです。これにより、プログラマーは0または1を書き込むことにより、その機能を具体的に選択できます。ピンが1として選択されている場合、それは出力として機能します。ポート1を8ビットポートと見なし、ピン2と3を出力ポートとして割り当てる場合は、P1DIRレジスタに値0x0Cを設定する必要があります。
PxIN:これは読み取り専用レジスタであり、ポートの現在の値はこのレジスタを使用して読み取ることができます。
PxOUT:この特定のレジスタを使用して、ポートに直接値を書き込むことができます。これは、プルアップ/プルダウンレジスタが無効になっている場合にのみ可能です。
PxREN:プルアップ/プルダウンレジスタを有効または無効にするために使用される8ビットレジスタです。PxRENレジスタとPxOUTレジスタの両方でピンが1に設定されている場合、特定のピンがプルアップされます。
PxDIR |
PxREN |
PxOUT |
I / O構成 |
0 |
0 |
バツ |
抵抗を無効にした入力 |
0 |
1 |
0 |
内部プルダウンが有効になっている入力 |
0 |
1 |
1 |
内部プルアップが有効な入力 |
1 |
バツ |
バツ |
出力–PxRENは効果がありません |
PxSELおよびPxSEL2: MSP430のすべてのピンは多重化されているため、使用する前に特定の機能を選択する必要があります。特定のピンに対してPxSELレジスタとPxSEL2レジスタの両方が0に設定されている場合、汎用I / Oが選択されます。PxSELを1に設定すると、主要な周辺機能が選択されます。
PxIE:ポートxの特定のピンの割り込みを有効または無効にします。
PxIES:割り込みが生成されるエッジを選択します。0の場合、立ち上がりエッジが選択され、1の場合、立ち下がりエッジが選択されます。
GPIO割り込みをテストするMSP430回路
MSP430割り込みサンプルコードのテストに使用したMSP430回路を以下に示します。
ボードのアースは、LEDとボタンの両方をアースするために使用されます。押しボタンの対角線上の反対側は通常開いている端子であり、押しボタンを押すと接続されます。LEDによる高電流消費を回避するために、LEDの前に抵抗が接続されています。通常、100Ω〜220Ωの範囲の低抵抗が使用されます。
ポート割り込みをよりよく理解するために、3つの異なるコードを使用します。最初の2つのコードは、回路図1と同じ回路を使用しています。コードを詳しく見ていきましょう。接続が確立された後、私のセットアップは次のようになります。
割り込み用のMSP430のプログラミング
完全なMSP430割り込みプログラムはこのページの下部にあります。コードの説明は次のとおりです。
以下の行は、ウォッチドッグタイマーの動作を停止します。ウォッチドッグタイマーは通常、2つの操作を実行します。1つは、コントローラーをリセットすることによってコントローラーが無限ループになるのを防ぐことです。もう1つは、組み込みのタイマーを使用して定期的なイベントをトリガーすることです。マイクロコントローラがリセット(または電源投入)されると、タイマーモードになり、32ミリ秒後にMCUをリセットする傾向があります。この行は、コントローラーがそれを行うのを停止します。
WDTCTL = WDTPW + WDTHOLD;
設定P1DIRの値を0x07にセット出力としてPIN0、PIN1、PIN2との方向を登録します。設定P1OUTを0x30を設定し、それには内部プルアップ抵抗付き入力がPIN4とPIN5上で有効。P1RENを0x30に設定すると、これらのピンの内部プルアップが有効になります。P1IEは割り込みを有効にし、P1IESはこれらのピンの割り込みエッジとしてハイからローへの遷移を選択します。
P1DIR- = 0x07; P1OUT = 0x30; P1REN- = 0x30; P1IE- = 0x30; P1IES- = 0x30; P1IFG&= 〜0x30;
次の行では、低電力モードを有効にし、ステータスレジスタでGIEを有効にして、割り込みを受信できるようにします。
__bis_SR_register(LPM4bits + GIE)
プログラムカウンタは、マクロを使用してポート1ベクトルのアドレスで設定されます。
PORT1_VECTOR 。 #pragma vector = PORT1_VECTOR __interrupt void Port_1(void)
以下のコードは、ピン0、ピン1、ピン2に接続されている各LEDを1つずつ切り替えます。
if(count%3 == 0) { P1OUT ^ = BIT1; P1IFG&= 〜0x30; count ++; } else if(count%3 == 1) { P1OUT ^ = BIT1; P1IFG&= 〜0x30; count ++; } else { P1OUT ^ = BIT2; P1IFG&= 〜0x30; count ++; }
回路図2:
同様に、概念をよりよく理解するために別のピンを試してみましょう。したがって、ここではプッシュボタンがピン1.5ではなくピン2.0に接続されています。変更した回路は次のとおりです。この場合も、この回路はMSP430ボタン割り込みプログラムをテストするために使用されます。
ここでは、ポート2が入力に使用されます。したがって、異なる割り込みベクタを使用する必要があります。P1.4とP2.0が入力を受け取ります。
ポート2は入力専用であるため、P2DIRは0に設定されます。ポート2のピン0を内部プルアップ抵抗を有効にして入力として設定するには、レジスタP2OUTおよびP2RENを値1に設定する必要があります。ポート2のピン0で割り込みを行い、割り込みのエッジを選択するために、P2IEとP2IESに値1を設定します。ポート2のフラグをリセットするには、P2IFGをクリアして、フラグを再度設定できるようにします。割り込みの発生。
P2DIR- = 0x00; P2OUT = 0x01; P2REN- = 0x01; P2IE- = 0x01; P2IES- = 0x01; P2IFG&= 〜0x01;
割り込みソースがポート1からのものである場合、ポート1のピン1に接続されているLEDが点灯します。割り込みソースがポート2に属する場合、ポート1のピン2に接続されているLEDが点灯します。
#pragma vector = PORT1_VECTOR __interrupt void Port_1(void) { P1OUT ^ = BIT1; P1IFG&= 〜0x10; for(i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2(void) { P1OUT ^ = BIT2; P2IFG&= 〜0x01; for(j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
CCSからMSP430へのプログラムのアップロード
プロジェクトをランチパッドにロードしてデバッグするには、プロジェクトを選択し、ツールバーのデバッグアイコンをクリックします。または、F11キーを押すか、[実行]→[デバッグ]をクリックして、デバッグモードに入ります。
デバッグモードに入ったら、緑色の実行ボタンを押して、ロードされたコードをMCUに自由に実行します。これで、押しボタンを押すと、エッジの変化によって割り込みがトリガーされ、LEDの状態の変化が促されます。
MSP430の割り込みプログラム
コードが正常にアップロードされたら、プッシュボタンを使用するだけでテストできます。LEDパターンは、プッシュボタンを使用して割り込みが発生するたびに、プログラムに従って変化します。
完全な作業は、以下にリンクされているビデオで見つけることができます。チュートリアルを楽しんで、何か役立つことを学んだことを願っています。ご不明な点がございましたら、コメントセクションに残すか、フォーラムを使用してその他の技術的な質問をお寄せください。