このチュートリアルでは、PICマイクロコントローラーで外部割り込みを使用する方法と、それらが必要な理由/場所について学習します。これは、PICマイクロコントローラーを最初から学び始めた一連のPICチュートリアルの一部です。したがって、このチュートリアルは、MPLABXを使用してPIC MCUをプログラムする方法と、LCDをPICに接続する方法に精通していることを前提としています。そうでない場合は、それぞれのリンクに戻ってそれらを読んでください。すでにそこで説明されている情報のほとんどをスキップします。
必要な材料:
- PIC16F877Aパフォーマンスボード
- 16x2LCDディスプレイ
- ボタンを押す
- 接続線
- ブレッドボード
- PicKit 3
割り込みとは何ですか、どこで使用するか:
PICマイクロコントローラの割り込みをプログラムする方法に入る前に、割り込みが実際に何であるか、そしてそれらをどこで使用する必要があるかを理解しましょう。さらに、マイクロコントローラには多くの種類の割り込みがあり、PIC16F877Aには約15種類あります。今のところ、それらすべてを私たちの頭の中に混同しないようにしましょう。
そう!マイクロコントローラーの割り込みとは何ですか?
ご存知のとおり、マイクロコントローラーは、入力に基づいて必要な出力をトリガーする一連の事前定義された(プログラムされた)アクティブ化を実行するために使用されます。ただし、マイクロコントローラーが1つのコードの実行で忙しい間、コードの他の部分にすぐに注意を払う必要がある緊急事態が発生する可能性があります。すぐに注意が必要なこの他のコードは、割り込みとして扱う必要があります。
例:あなたが携帯電話でお気に入りのゲームをプレイしていて、電話内のコントローラー(仮定)がゲームを楽しむために必要なすべてのグラフィックを投げるのに忙しいとしましょう。しかし、突然あなたのガールフレンドがあなたの番号に電話をかけます。さて、起こる最悪の事態は、あなたがゲームをするのに忙しいので、あなたのガールフレンドの呼び出しを無視するあなたの携帯電話コントローラーです。この悪夢の発生を防ぐために、割り込みと呼ばれるものを使用します。
これらの割り込みは、発生する特定のアクションに対して常にアクティブなリストになり、発生するとコードの一部を実行してから通常の機能に戻ります。このコードは、割り込みサービスルーチン(ISR)と呼ばれます。割り込みが必須の実用的なプロジェクトの1つは、「PICマイクロコントローラーを使用したデジタル速度計と走行距離計回路」です。
マイクロコントローラには、2つの主要なタイプの割り込みがあります。それらは外部割り込みと内部割り込みです。内部割り込みは、タイマー割り込み、ADC割り込みなどのタスクを実行するために、Microntroller内で発生します。これらの割り込みは、ソフトウェアによってトリガーされ、それぞれタイマー操作またはADC操作を完了します。
外部割り込みは、ユーザーによってトリガーされる可能性のある割り込みです。このプログラムでは、プッシュボタンを使用して割り込みをトリガーすることにより、外部割り込みを使用する方法を学習します。LCDを使用して、0から1000まで増加する番号を表示します。割り込みがトリガーされたら、割り込みサービスルーチンISRから通知してから、番号の増加に戻る必要があります。
回路図と説明:
PIC16F877割り込みを使用するための回路図は上の画像に示されています。LCDチュートリアルのインターフェースで行ったように、LCDをPICに接続するだけです。
割り込みピンを接続するには、データシートを見て、PICのどのピンが外部割り込みに使用されているかを確認する必要があります。この場合、PIC16F877Aでは、33番目のピンRBO / INTが外部割り込みに使用されます。このピン以外のピンは使用できません。この回路図のピン接続を次の表に示します。
S.No: |
ピン番号 |
ピン名 |
に接続されています |
1 |
21 |
RD2 |
LCDのRS |
2 |
22 |
RD3 |
LCDのE |
3 |
27 |
RD4 |
LCDのD4 |
4 |
28 |
RD5 |
LCDのD5 |
5 |
29 |
RD6 |
LCDのD6 |
6 |
30 |
RD7 |
LCDのD7 |
7 |
33 |
RBO / INT |
ボタンを押す |
ポートBで内部プルアップ抵抗を有効にしているため、プッシュボタンを介してRB0ピンをグランドに直接接続できます。したがって、このピンがLOWになると、割り込みがトリガーされます。
以下に示すように、接続はブレッドボード上で行うことができます。
私たちのチュートリアルに従っているのであれば、私がここで使用したこのパフォーマンスボードに精通しているはずです。そうでない場合は、回路図に従うだけでそれについてあまり考える必要はなく、物事が機能するようになります。
PICマイクロコントローラーの割り込みのシミュレーション:
このプロジェクトのシミュレーションは、Proteusを使用して行われます。
プロジェクトをシミュレートすると、LCDディスプレイに一連の数字がインクリメントされているのがわかります。これはメインループ内で発生し、プッシュボタンが押されるたびにLCDにISRに入ったことを表示する必要があります。コードに変更を加えて、ここでテストしてみることができます。
コードの説明:
このプロジェクトの完全なコードは、このチュートリアルの最後にあります。ただし、プログラムは重要なチャンクに分割されており、理解を深めるために以下で説明します。
すべてのプログラムと同様に、プログラムで使用するピンのピン構成を定義することからコードを開始する必要があります。また、ここでは、RB0 / INTを入力または出力ピンとしてではなく、外部割り込みピンとして使用していることを定義する必要があります。以下のコード行は、7番目のビットを0にすることにより、ポートBの内部プルアップ抵抗を有効にします。
OPTION_REG = 0b00000000;
次に、グローバル/ペリフェラル割り込みを有効にし、RB0を外部割り込みピンとして使用していることを宣言します。
GIE = 1; //グローバル割り込みを有効にするPEIE = 1; //ペリフェラル割り込みを有効にするINTE = 1; // RB0を外部割り込みピンとして有効にする
RB0ピンが外部割り込みピンとして定義されると、ローになるたびに外部割り込みフラグINTFが1になり、割り込みサービスルーチン(ISR)が呼び出されるため、void割り込み関数内のコードが実行されます。
void interrupt ISR_example(){if(INTF == 1)//外部割り込みが検出されました{Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Print_String( "Entered ISR"); INTF = 0; //割り込みフラグをクリアした後、それをクリアします__delay_ms(2000); Lcd_Clear(); }}
ご覧のとおり、割り込み関数にISR_exampleという名前を付けました。希望に応じて名前を付けることができます。割り込み関数内で、INTFフラグが高いかどうかを確認し、必要なアクションを実行します。ルーチンが終了したら、割り込みフラグをクリアすることが非常に重要です。その場合にのみ、プログラムはvoidmain関数に戻ります。このクリアは、ラインを使用してソフトウェアで行う必要があります
INTF = 0; //完了後、割り込みフラグをクリアします
main関数内では、500ミリ秒ごとに数値をインクリメントし、LCD画面に表示します。RB0ピンのステータスをチェックするための特定のラインはありません。割り込みは常にアクティブなままであり、プッシュボタンが押されると、void mainからジャンプして、ISRの行を実行します。
Lcd_Set_Cursor(2,1); Lcd_Print_String( "メインループ内"); Lcd_Set_Cursor(1,1); Lcd_Print_String( "Number:"); Lcd_Print_Char(ch1 + '0'); Lcd_Print_Char(ch2 + '0'); Lcd_Print_Char(ch3 + '0'); Lcd_Print_Char(ch4 + '0'); __delay_ms(500); 番号++;
PIC16F877A割り込みの動作:
割り込みがどのように機能するかを理解したら、ハードウェアで試して、いじくり回すことができます。ここに示すこのプログラムは、割り込みが検出されたときにLCD画面の表示を変更するだけの外部割り込みの非常に基本的な例です。
プロジェクトの完全な動作は、以下のビデオで見つけることができます。割り込みとそれらを使用する場所/方法について理解したことを願っています。疑問がある場合は、フォーラムまたはコメントセクションから私に連絡できます。