• 検索結果がありません。

レッスン 10: 割り込みとプルアップ

ドキュメント内 PICkit 3 Starter Kit User’s Guide (ページ 74-79)

Chapter 3. レッスン

3.11 レッスン 10: 割り込みとプルアップ

3.11.1 レッスンの紹介

このレッスンでは割り込みとその有用性について学びます。また、ほとんどの PIC MCU デバイスに内蔵されている弱プルアップについても説明します。このレッスン はこれまでのレッスンを発展させたものですが、主にレッスン9と3をベースにして います。

3.11.2 ハードウェアの動作

LEDが一定の速度でローテートし、スイッチを押すと方向が反転します。

3.11.3 概要

このレッスンでは割り込みと弱プルアップという2つの新しい概念を学びます。

3.11.3.1 割り込み

割り込み機能を使うと、特定のイベントが通常のプログラムフローに割り込む事が できます。つまり、マイクロコントローラが外部の状況を認識できるように設定で きます。外部イベント発生時にルーチンを実行できます。ファームウェアによって割 り込み要因を判断し、それに基づいて処理を実行します。どの割り込みもMCUをス リープから復帰させるように設定できます。

ほとんどの周辺モジュールが割り込みを生成できます。I/O ピンによっては、状態変 化時に割り込みを生成するように設定できます。周辺モジュールがサービスの実行を 要求する場合、そのモジュールの割り込みフラグをセットします。各モジュールの割 り込みフラグビットとイネーブルビットを AND演算し、これを全ての周辺モジュー ルでOR演算した結果をマスタ割り込みとします。このマスタ割り込みとグローバル 割り込みイネーブル(GIE)ビットをAND演算します。各モジュールのイネーブルビッ トを使う事で、特定の周辺モジュールのみを割り込み要因に設定できます。詳細は、

各 PICMCU のデータシートで割り込みロジックの図を参照してください。以下に、

簡単な図を示します。

3-11: 割り込みフローの概要

PIC18の割り込み構造はやや異なり、割り込み優先度を設定できます。エンハンスト

ミッドレンジ コアには割り込みベクタが 1 つしかありません。つまり何らかの割り 込みが発生すると、プログラム カウンタはアドレス0x0004の割り込みサービスルー チンにジャンプします。PIC18では、ほとんどの割り込み要因に対して高または低優 先レベルを割り当てできます。高優先度ベクタアドレスは 0x0008、低優先度ベクタ アドレスは0x0018です。高優先度割り込みイベントは、低優先度割り込み処理中で も割り込む事ができます。このレッスンでは割り込み優先度は使いません。その代わ り、IPENビットをクリアしてエンハンスト ミッドレンジと同等の割り込み機能を使 います。すなわち、どちらのデバイスも1つのベクタからのみサービスを実行します。

割り込み処理が始まるとグローバル割り込みイネーブル (GIE) ビットがクリアされ、

以降の割り込みは無効になります。戻りアドレスがスタックにプッシュされ、プログ ラム カウンタには割り込みベクタのアドレスが書き込まれます。エンハンスト ミッ

Ms

Global Interrupt Enable

Other Interrupt Sources Interrupt Flag

Interrupt Enable

ドレンジとPIC18 MCUのどちらもWREG、STATUS、BSRレジスタのコンテクスト を自動で待避します。FSRレジスタとPCLATHレジスタは、エンハンスト ミッドレ ンジ デバイスの場合のみ自動で待避されます。PIC18 でコンテクストを復元するに は、retfie, fast命令を実行する必要があります。

割り込みサービスルーチン (ISR) のファームウェアでは、割り込みフラグビットを ポーリングして割り込み要因を判断します。同じ割り込み動作の繰り返しを避けるた め、ISRから抜ける前に割り込みフラグビットをクリアする必要があります。ISR実 行中に発生する割り込みは全て割り込みフラグで記録されますが、GIEビットがクリ アされているためretfie命令を実行してGIEビットがセットされるまではプロセッ サがその割り込みベクタにリダイレクトする事はありません。

3.11.3.2 弱プルアップ

このチュートリアルで使うエンハンスト ミッドレンジとPIC18 MCUはどちらも一部 のピンで内部プルアップ抵抗を有効にできます。これにより、外付けハードウェアの 必要性が大幅に減少します。

3-12: 弱プルアップの回路図

図3-12に示したように、弱プルアップを有効にすると他の外部回路をRA2に接続し なくてもピンは常に「1」として読み出されます。この少ピン開発ボードは、抵抗が スイッチを経由してグランドに接続されています。スイッチを押すと RA2 の電圧は VDDでなくなり、0 V (グランド)に近い値になります。

電気的仕様にはプルアップ抵抗値ではなく電流値Ipurを記載しています。PIC16F1829 では、この値は140 µA (Typ.)です。電流がこの仕様上の代表値の場合、スイッチを 閉じた時のRA2の電圧は下式で求める事ができます。

3-4:

この抵抗を使ってもピンはすぐにはVDDに達しないため、「弱」プルアップと呼ばれ ます。より強いプルアップの方が抵抗値が低く、ピンはすぐに VDD に達します。ピ ンの静電容量が大きい場合、PIC MCU内部でピンの状態が論理Highになるまでには 時間がかかります。これは弱プルアップであるため、1~10k (typ.)の外付け抵抗を 使ってこの内部設定を容易にオーバーライドし、ピンの状態を変更できます。

VDD

R2

Rpull-up

To PIC® MCU SW1

GND

Irp

RA2

V = I * R

VA3 = 140 * 106 * 2k=28mV

PICkit™ 3 スタータキット ユーザガイド

DS41628B_JP - p.76  2015 Microchip Technology Inc.

3.11.4 新しく学ぶレジスタ

3.11.4.1 両デバイス共通

PORTAの各ピンの内部プルアップ回路を個別に有効にする

3.11.4.2 エンハンストミッドレンジ

3.11.4.2.1 IOCAN/IOCAF

PIC16F1829 は立ち上がりおよび立ち下がりエッジの状態変化割り込みを検出でき

ます。IOCAN レジスタには立ち下がりエッジ検出イネーブルビットがあり、IOCAF

レジスタには割り込みフラグビットがあります。このレッスンでは、IOCAN レジス タを使ってスイッチ入力を状態変化割り込みピンとして有効に設定しており、割り込 みサービスルーチン内でIOCAFレジスタのフラグを全てクリアしています。

このレッスンでは状態変化割り込み機能を利用して、RA2の状態がHighからLowへ 遷移するとPIC MCUをアドレス0x0004 (割り込みベクタ)へジャンプさせます。

3-13: 立ち上がり/立ち下がりエッジ

3.11.4.3 PIC18

3.11.4.3.1 IOCA

PIC18F14K22 の状態変化割り込みには立ち上がりエッジと立ち下がりエッジの区別

はなく、1つのビットで両方の検出が有効になります。どちらのエッジが発生したか を判定するために、より多くのコード行が必要です。

3.11.4.3.2 RCON

RCONレジスタには、PIC MCUのリセット要因を検出するためのビットと優先割り 込みイネーブルビットがあります。このレッスンでは、このレジスタを使って優先割 り込みを無効にしています。

3-32: 新しく学ぶ両デバイス共通のレジスタ

レジスタ 目的

WPUA 弱プルアップイネーブル

3-33: 新しく学ぶエンハンストミッドレンジのレジスタ

レジスタ 目的

IOCAN PORTA立ち下がりエッジ状態変化割り込み

IOCAF PORTA状態変化割り込みフラグ

3-34: 新しく学ぶPIC18のレジスタ

レジスタ 目的

IOCA PORTA状態変化割り込み(両エッジ)

RCON 割り込み要因の検出

Rising Edge

Falling Edge

3.11.5 新しく学ぶ命令 3.11.5.1 両デバイス共通

3.11.5.1.1 RETFIE

retfie 命令は、割り込み前に実行していたアドレスをスタックからポップし、GIE ビットをセットしてISRを終了します。PIC18では、待避したコンテクストを復元す るにはretfie, fast命令を実行する必要があります。エンハンスト ミッドレンジ にはこの区別はありません。

3.11.6 アセンブリ

3.11.6.1 両デバイス共通 例3-37:

割り込みを使うと、メインループは数値演算やLCDへの書き込み等、他の処理に命令 サイクルを費やす事ができます。これまでのレッスンのように、プログラムはフラグ がセットされるのを待たずに処理を継続できます。ただし、このサンプルコードは割 り込みを待つ間何も処理を実行せず、MainLoopへの分岐を無限に繰り返すだけです。

3.11.6.2 エンハンスト ミッドレンジ 例3-38:

これで割り込みサービスルーチンへジャンプします。割り込みベクタアドレスの直後 にgoto文がある事に注意してください。

3-39:

割り込みサービスルーチンの中で、割り込み要因を調べています。割り込み要因が分 かったら、その割り込みに応じた分岐先で割り込みフラグをクリアして、割り込み サービスルーチンから抜けられるようにしています。retfie命令を実行すると、待 避したコンテクストを復元してGIEビットを再びセットして割り込みサービスルーチ ンを抜け、割り込み発生時に実行していた命令の次の命令へ戻ります。

3-35: 新しく学ぶ両デバイス共通の命令

命令 英語名 目的

retfie Return from interrupt 通常のプログラム実行に戻る

MainLoop:

bra MainLoop ;can spend rest of time doing something critical here

Org 0x0 ;Reset Vector starts at 0x0000 bra Start ;main code execution

ORG 0x0004 ;Interrupt Vector starts at address 0x0004 goto ISR

;Enter here if an interrupt has occurred

;First, check what caused the interrupt by checking the ISR flags

;This lesson only has 2 flags to check ISR:

banksel IOCAF ;bank7

btfsc IOCAF, 3 ;check the interrupt-on-change flag bra Service_SW1 ;switch was pressed

bra Service_TMR0 ;Timer0 overflowed

ドキュメント内 PICkit 3 Starter Kit User’s Guide (ページ 74-79)