5.1 LED の制御

「図解 PIC マイコン実習(第 2 版)」
サンプルページ
この本の定価・判型などは,以下の URL からご覧いただけます.
http://www.morikita.co.jp/books/mid/078332
※このサンプルページの内容は,第2版 1 刷発行時のものです.
前付(念).indd
1
2014/09/12
14:36:40
i
第 2 版 ま え が き
本書の初版発行から 10 年が過ぎましたが,幸いにして多くの読者からご好評を賜
りました.その間,増刷の機会に,統合開発ソフトウェア MPLAB のバージョンアッ
プに対応するなどの改訂を加えてきました.しかしながら,近年では,PIC をとり
まく開発環境が大きく変わってきました.たとえば,パソコンのインタフェースの主
流は USB となり,統合開発ソフトウェアは,MPLAB X へと大きなバージョンアッ
プを遂げました.これらの変化に対応するため,本書の第 2 版を発行する運びとなり
ました.
本書で扱っている PIC16F84A は,現在も工業高校や,高専,大学など多くの教育
機関において,PIC を学ぶ教材に採用されています.それは,扱いやすい PIC であ
るのと同時に,より高性能な PIC を扱うための基礎を学ぶのにたいへん適したアー
キテクチャをしているからです.一方で,現在では,より多くの機能を搭載した高性
能な PIC が,たいへん安価に入手できるようになっています.このため,本書では,
PIC16F84A と互換性の高い PIC16F648A についての解説を加筆しました.PIC16F648A は,PIC16F84A よりも高性能な PIC ですが,より安価に入手できること
が多い好都合な PIC です.
本書の実習環境は,OS に Windows 8.1,統合開発ソフトウェアに MPLAB X,
PIC ライタ装置に PICkit3 を採用しました.また,入手しにくくなった電子部品な
どを更新し,内蔵タイマを使用するプログラミング実習などについて加筆しました.
さらに,第 7 章を新設して,マイクロチップテクノロジー社が提供する C コンパイ
ラ(XC8)を用いた開発についても解説しました.一方で,初版が多くの読者に受
け入れられた事実を考慮して,扱うレベルや範囲については初版と同程度としました.
本書が,初版と同様に PIC をマスターする最初の一歩を踏み出すための入門書とし
てお役に立つことを心より願っています.
最後になりましたが,第 2 版発行の機会を与えてくださった森北出版の森北博巳氏,
並びに編集でお世話になった加藤義之氏にこの場を借りて厚く御礼申し上げます.
2014 年 8 月
著 者 前付(念).indd
1
2014/09/12
14:36:40
ii
ま え が き
PIC(ピック)は,1 個の小さなパッケージにマイコン制御に必要なすべての機能
を収めてあるコンピュータ(マイコン)です.私たちは,その姿を直接見ることはほ
とんどありませんが,家電製品や自動車など,身の回りの多くの製品の内部には
PIC が使われています.
PIC は,以前から工業製品には多く使用されていたものの,一般にはあまり馴染
みのないマイコンでした.筆者も,マイコン制御では 6809 や Z80,H8 といった
CPU を使用してきました.これらの CPU は,高機能なのですが,初心者が使いこ
なすのはそう簡単ではありません.また,マイコン制御が必要な分野では,それほど
高機能な CPU を要求しない処理もたくさんあるのです.たとえば,ロボットを動か
す場合,単にいくつかのモータとセンサを制御するだけでよいなら,Z80 や H8 といっ
た CPU でなくても,PIC で十分に対応できます.
PIC は,安価,小型,扱いが簡単なわりに高性能な制御用マイコンです.したがっ
て,用途によっては PIC が簡単にその目的を達成してくれます.初心者でも簡単に
使い方をマスターできるので,ホビーで電子工作をする方々の中にも,PIC に関心
を寄せる人が増えています.
本書では,初めて PIC を学習しようとする方々を対象に,PIC の中でも特に扱い
やすい 16F84A を選び,その原理と使い方をやさしく解説しました.実際に,はん
だごてを握って回路を製作しながら,本書を読み進めば,次第に PIC のことがわかっ
てくることでしょう.
読者の方々が本書によって PIC 技術をマスターし,目的の制御を実現されること
をお祈りしています.
最後になりましたが,本書執筆の機会を与えてくださった森北出版の森北博巳氏,
並びに編集にご尽力をいただいた石田昇司氏,貴重な資料をご提供頂いたマイクロ
チップ・テクノロジー・ジャパンの中尾真治氏にこの場を借りて厚く御礼申し上げま
す.
2003 年 1 月
本書は,2003 年 2 月に初版を発行して以来,ご好評をいただいておりますが,3
刷を機に,開発ソフト MPLAB のバージョン 6.50 に対応させました.
2004 年 5 月
著 者 前付(念).indd
2
2014/09/12
14:36:40
iii
目 次
第 1 章 マイコン制御の基礎 ……………………………………………………… 1
1.1 マイコンとは ……………………………………………………………………… 2
1.1.1 コンピュータによる情報処理の流れ 2
1.1.2 コンピュータの基本構成 3
1.1.3 CPU の発達 4
1.1.4 各種のコンピュータ 6
1.2 マイコン制御とは ………………………………………………………………… 7
1.2.1 コンピュータを使った制御 7
1.2.2 制御に使うコンピュータ 8
1.3 マイコン制御の例 ………………………………………………………………… 9
1.3.1 あやつり人形どらきゅら 9
1.3.2 マジックピエロ 10
1.3.3 相撲ロボット 12
演習問題………………………………………………………………………………… 14
第 2 章 PIC マイコンの基礎 …………………………………………………… 15
2.1 PIC とは ………………………………………………………………………… 16
2.1.1 PIC の生い立ち 16
2.1.2 PIC の特徴 17
2.1.3 PIC の種類 18
2.2 PIC の構成 ……………………………………………………………………… 20
2.2.1 16F84A の概要 20
2.2.2 アーキテクチャ 21
2.2.3 16F648A の概要 22
2.2.4 命令の形式 23
2.2.5 プログラムメモリ 24
2.2.6 W レジスタ 25
2.2.7 16F84A のファイルレジスタ 25
2.2.8 特殊レジスタ(SFR) 27
2.2.9 16F648A のファイルレジスタ 28
2.2.10 間接アドレッシング方式 29
2.2.11 データメモリ(EEPROM) 31
前付(念).indd
3
2014/09/12
14:36:41
iv 目 次
2.2.12 スタック 33
2.2.13 タイマ 0 34
2.2.14 ウオッチドッグタイマ(WDT) 36
2.2.15 割込み 37
2.2.16 スリープ 38
2.3 命令の実行 ……………………………………………………………………… 40
2.3.1 命令実行サイクル 40
2.3.2 命令実行の流れ 41
2.3.3 プログラムカウンタ(PC) 42
2.4 PIC のプログラム開発 ………………………………………………………… 44
2.4.1 プログラム開発の流れ 44
2.4.2 開発ツール 45
演習問題………………………………………………………………………………… 48
第 3 章 マイコンでのデータ表現 ……………………………………………… 51
3.1 2 進数 …………………………………………………………………………… 52
3.1.1 2 進数と 10 進数 52
3.1.2 補 数 54
3.1.3 負数の表現 54
3.2 16 進数 …………………………………………………………………………… 56
3.2.1 10 進数と 16 進数 56
3.2.2 2 進数と 16 進数 57
3.3 ディジタル回路 ………………………………………………………………… 59
3.3.1 基本ゲート回路 59
3.3.2 算術演算と論理演算 59
3.3.3 マスク操作 60
3.3.4 シフト操作とローテイト操作 61
演習問題………………………………………………………………………………… 62
第 4 章 アセンブラ言語 …………………………………………………………… 63
4.1 PIC のアセンブラ言語 ………………………………………………………… 64
4.1.1 マシン語とアセンブラ言語 64
4.1.2 命令の種類 65
4.1.3 コンフィグレーションビット 66
4.2 プログラムの書き方 …………………………………………………………… 68
4.2.1 アセンブラ言語の書式 68
4.2.2 プログラムの基本スタイル 69
4.3 PIC の命令 ……………………………………………………………………… 71
4.3.1 命令のフォーマット 71
前付(念).indd
4
2014/09/12
14:36:41
目 次 v
4.3.2 16F84A の全命令 73
演習問題………………………………………………………………………………… 110
第 5 章 プログラミング実習 …………………………………………………… 111
5.1 LED の制御 ……………………………………………………………………… 112
5.1.1 LED 実習回路の製作 112
5.1.2 LED 点灯プログラム 116
5.1.3 LED 点滅プログラム 119
5.1.4 光が流れるプログラム 124
5.1.5 スイッチ入力による LED の制御 128
5.2 各種の制御 ……………………………………………………………………… 131
5.2.1 リレーの制御 131
5.2.2 DC モータの制御 134
5.2.3 パルスモータの制御 138
5.3 割込み制御 ……………………………………………………………………… 149
5.3.1 割込みプログラム 149
5.3.2 電子サイコロ 152
5.3.3 タイマ割込みを使用した LED の点滅制御 156
演習問題………………………………………………………………………………… 159
第 6 章 MPLAB X の使い方 …………………………………………………… 161
6.1 MPLAB X の基本操作 ………………………………………………………… 162
6.1.1 インストールと初期設定 162
6.1.2 プログラム開発 165
6.2 MPLAB X の応用 ……………………………………………………………… 175
6.2.1 デバッグモード 175
6.2.2 ブレークポイントの設定 176
6.2.3 各種メモリの表示 177
6.2.4 ストップウオッチ 179
演習問題………………………………………………………………………………… 182
第 7 章 C によるプログラム実習 ……………………………………………… 183
7.1 PIC プログラム用 C 言語 ……………………………………………………… 184
7.1.1 C コンパイラの種類 184
7.1.2 XC8 コンパイラの入手 185
7.2 C によるプログラム開発 ……………………………………………………… 186
7.2.1 C を用いた開発手順 186
7.2.2 C プログラミング 190
演習問題………………………………………………………………………………… 198
前付(念).indd
5
2014/09/12
14:36:41
vi 目 次
演習問題解答 …………………………………………………………………………… 199
付 録 ………………………………………………………………………………… 200
発展問題 200
PIC 情報の収集 200
LED 実習回路の製作 201
プログラミングの際によく使う一覧表 204
参考文献 ………………………………………………………………………………… 206
索 引 ………………………………………………………………………………… 207
前付(念).indd
6
2014/09/12
14:36:41
20
2.2 PIC の構成
ここでは,PIC の基本形である 16F84A を取り上げて,その構成を学習しましょう.
2.2.1 16F84A の概要
図 2.5( a )
に 16F84A の外観,図( b )にピン配置,表 2.2 にピンの説明を示します.
PDIP,SOIC
SOIC 型
( a )外観
PIC16F84A
PDIP 型
・1
2
3
4
5
6
7
8
9
RA2
RA3
RA4/T0CKI
MCLR
VSS
RB0/INT
RB1
RB2
RB3
18
17
16
15
14
13
12
11
10
RA1
RA0
OSC1/CLKIN
OSC2/CLKOUT
VDD
RB7
RB6
RB5
RB4
( b )ピン配置
図 2.5 16F84A
表 2.2 16F84A のピンの説明
ピン番号
第二章(念).indd
20
名 称
説 明
1
RA2
双方向 I/O ポート(ポート A の 2 ビット目)
2
RA3
双方向 I/O ポート(ポート A の 3 ビット目)
3
RA4/T0CKI
双方向 I/O ポート(ポート A の 4 ビット目),タイマクロック入力
4
MCLR
リセット
5
VSS
接地(電源のマイナス端子へ)
6
RB0/INT
双方向 I/O ポート(ポート B の 0 ビット目),外部割込み
7
RB1
双方向 I/O ポート(ポート B の 1 ビット目)
8
RB2
双方向 I/O ポート(ポート B の 2 ビット目)
9
RB3
双方向 I/O ポート(ポート B の 3 ビット目)
10
RB4
双方向 I/O ポート(ポート B の 4 ビット目)
11
RB5
双方向 I/O ポート(ポート B の 5 ビット目)
12
RB6
双方向 I/O ポート(ポート B の 6 ビット目)
13
RB7
双方向 I/O ポート(ポート B の 7 ビット目)
14
VDD
電源のプラス端子へ
15
OSC2/CLKOUT
クロック端子 2
16
OSC1/CLKIN
クロック端子 1
17
RA0
双方向 I/O ポート(ポート A の 0 ビット目)
18
RA1
双方向 I/O ポート(ポート A の 1 ビット目)
2014/09/10
16:49:21
2.2 PIC の構成 21
図 2.6 に示すように,16F84A は,入出力を行う 2 個のポート A,B をもつマイコ
ンです.ポートのピン数は,ポート A が 5 本,ポート B が 8 本の計 13 本で,ピン
ごとに入力モードまたは出力モードの設定が可能です.ポートのピンには,およそ
20 mA の電流を流すことができますので,LED の点灯程度ならば,特別なドライブ
回路は必要ありません.
ひとつのピンで
最大 20 mA の直
接ドライブ可能!
入出力
電源5V
ポート A
VDD,VSS
RA0∼4
PIC
16F84A
クロック
OSC1,OSC2
リセット
ポート B
MCLR
RB0∼7
図 2.6 16F84A の概要
2.2.2 アーキテクチャ
図 2.7 に,16F84A のアーキテクチャを示します.
14 ビット
プログラム
カウンタ
13
プログラムメモリ
1K (フラッシュ ROM)
プログラム
バス
8
データバス
8
データメモリ
(EEPROM)
13
14
スタック
8 レベル
ファイルレジスタ
(RAM)
命令レジスタ
64
68
7
アドレス選択
5
直接アドレス
7
FSR
8
デコード,
制御
パワーオン
リセット
ウオッチドッグ
タイマ
選択
ALU
W
OSC1,OSC2
タイマ
STATUS
パワーアップ
タイマ
クロックスタート
アップタイマ
タイミング
発生
間接
アドレス
MCLR
RA4/T0CKI
I/O
ポート
RA0∼4
RB0∼7
VDD,VSS
図 2.7 16F84A のアーキテクチャ
第二章(念).indd
21
2014/09/10
16:49:22
22 第 2 章 PIC マイコンの基礎
第 1 章で学んだノイマン型コンピュータでは,プログラム(命令)とデータが同じ
メモリ(主記憶装置)上に共存していました.したがって,CPU とメモリをつなぐ
転送路(バス)においてプログラムとデータの転送が競合(混雑)してしまいます.
これは,フォン・ノイマンのボトルネックとよばれ,コンピュータ全体の性能を左右
してしまうほどの欠点なのです(図 2.8( a )).
プログラム
メモリ
データ
混雑
バス
プログラム
メモリ
フォン・ノイ
マンのボトル
ネック
CPU
プログラム
バス
( a )ノイマン型
データ
メモリ
データバス
CPU
( b )ハーバード型
図 2.8 フォンノイマンのボトルネック
しかし,PIC では,プログラムを格納するメモリ(プログラムメモリ)とデータ
を格納するメモリ(データメモリ)が独立しています.このような構造を,ハーバー
ドアーキテクチャとよびます.これにより,プログラムバスとデータバスを個別に用
意できるので,命令長(ビット数)とデータ長を別々に設定できる利点があります.
16F84A では,命令長は 14 ビット,データ長は 8 ビットで設計されています.
コンピュータのアーキテクチャを設計する際には,次の二つの考え方があります.
( 1 )RISC(Reduced Instruction Set Computer)
命令を基本的なものだけに限定して,ハードウェアを簡単化します.高速化が可能
になりますが,高度な処理を行う場合には,少ない命令を組み合わせてプログラムを
作成することが困難になってきます.
( 2 )CISC(Complex Instruction Set Computer)
高度な処理にも柔軟に対応できるように,多くの命令を用意します.ハードウェア
が複雑になってしまい,高速化しにくいのが欠点です.
PIC は,RISC の考え方によって設計されたコンピュータです.高速化のために,
後で学ぶパイプライン処理方式を採用しています.
2.2.3 16F648A の概要
前に概要を説明した 16F84A と同じ 18 ピンのミッドレンジ PIC は,新製品が次々
と発売されています.本書では,16F84A の使用を基本としますが,ここでは一例と
して,より高性能な 16F648A を紹介します.16F648A は,プログラムメモリが
第二章(念).indd
22
2014/09/10
16:49:22
2.2 PIC の構成 23
4 KB,SRAM が 256 バイトと 16F84A に比べて大容量であり,3 系統のタイマを備
えるなど,機能も充実しています.さらに,動作電圧も 2.0∼5.5 V の範囲で動作し
ます.RA5∼RA7 も用意されています.価格は,16F84A と同程度ですが,より安く
購入できることもめずらしくありません.ピン配置は基本的に 16F84A と同じですが,
汎用レジスタのアドレスなどが異なるため,完全な互換性はありませんので注意が必
要です.しかし,若干の変更を行えば 16F84A と同じように使用できます.図 2.9 に
16F648A の外観とピン配置を示します.
PDIP,SOIC
( a )外観
・1
18
2
17
3
16
4
5
6
7
PIC16F648A
RA2/AN2/VREF
RA3/AN3/CMP1
RA4/T0CKI/CMP2
RA5/MCLR/VPP
VSS
RB0/INT
RB1/RX/DT
RB2/TX/CK
RB3/CCP1
15
14
13
12
8
11
9
10
RA1/AN1
RA0/AN0
RA7/OSC1/CLKIN
RA6/OSC2/CLKOUT
VDD
RB7/T1OSI/PGD
RB6/T1OSO/T1CKI/PGC
RB5
RB4/PGM
( b )ピン配置
図 2.9 16F648A
2.2.4 命令の形式
プログラムメモリに格納しておく命令は,図 2.10 に示すような形式をしています.
全長は 14 ビットで,命令を記述する上位のオペコード部と,アドレスや値を記述す
る下位のオペランド部から構成されています.
14 ビット(1 ワード)
オペコード
オペランド
命令
アドレス,値
ビット位置,レジスタ指定
図 2.10 命令の形式
命令の種類によって,オペコード部は 3∼6 ビット,オペランド部は 8∼11 ビット
になります.また,命令によってはオペランド部の上位ビットに,ビット位置や転送
先レジスタの指定を記述することがあります.命令長 14 ビットのことを 1 ワード
(Word)とよびます.
第二章(念).indd
23
2014/09/10
16:49:23
24 第 2 章 PIC マイコンの基礎
2.2.5 プログラムメモリ
プログラムメモリは,プログラムを格納しておく 14 ビット幅のメモリです.
16F84A では,プログラムメモリの大きさは,1 K ワードですから,最大 1 K ワード
=1024 個までの命令を使ってプログラムを作成することができます.その際のアド
レスは,16 進数で 0 番地∼3FFH 番地となります(図 2.11).16F648A のプログラ
ムメモリは 4 K ワード,アドレスは 0 番地∼FFFH 番地です.
14 ビット
アドレス
リセットベクタ
0004
割込みベクタ
∼
0000
割込み発生時
∼
1K ワード
電源投入,リセット時
03FF
図 2.11 プログラムメモリ
PIC に電源を投入すると,プログラムメモリの 0 番地に入っている命令を取り出
して実行します.これは,PIC にリセット信号を入力(MCLR ピンをローレベルに)
しても同じです.したがって,最初に実行すべき命令は,必ず 0 番地に格納しておく
必要があります.
割込み処理を行う場合には,割込み信号の入力によって,プログラムメモリの 4 番
地にある命令が実行されます.しかし,割込み処理を使わない場合には,4 番地を特
別に意識する必要はありません.
プログラムメモリのアドレスは,プログラムカウンタ(PC)によって指定されます.
PC は,13 ビットの長さなので,この点からは 213=8192=8 K ワードまでのプログラ
ムメモリサイズが扱えます.しかし,GOTO や CALL などのジャンプ命令のアドレス指
定用のオペランド部は 11 ビットなので,この点からは 211=2 K ワードまでのプログ
ラムメモリしか直接アクセスすることはできません.したがって,8 K ワードの領域
を 4 個のページに分割して,ページを切り替えることで,最大 8 K ワードのプログ
ラムメモリを扱えるようにした PIC があります(図 2.12).ただし,16F84A につい
ては,実装しているプログラムメモリサイズが 1 K ワードなので,ページの概念は
必要ありません.
16F84A では,プログラムメモリに,フラッシュメモリとよばれる ROM を採用し
ています.フラッシュメモリは,ブロック単位(たとえば,512 B,1 KB,4 KB など)
でデータの書込みを行うメモリで,書込みには ROM ライタ装置を使用します.プ
ログラムを書き込んだ後は,電源を切っても記憶内容を保持します.記憶内容の消去
も電気的に行えます.
第二章(念).indd
24
2014/09/10
16:49:23
2.2 PIC の構成 25
アドレス
0000
PC:13 ビット
213=8K
8K
07FF
0800
0FFF
1000
17FF
1800
ページ 0
2K
ページ 1
2K
ページ 2
2K
ページ 3
2K
ジャンプ命令
オペランド部 11 ビット
211=2K
他のレジスタ
(2 ビット)を使って
切り替える
1FFF
図 2.12 ページの概念
2.2.6 W レジスタ
W レジスタ(Working Register)は,ALU(算術論理演算装置)の近くにある 8 ビッ
トのレジスタです.レジスタとは,データを格納しておく小規模ながら高速なメモリ
のことで,置数器ともよばれます.W レジスタは,演算や転送命令を実行する際に,デー
タを一時的に保管しておくなど,ALU と連携しながら,重要な働きをします.図 2.13
に,例として,2 と 6 の加算を行う命令を実行した場合の動作を示します.W レジス
タは,Z80CPU の A レジスタ(アキュムレータ)に相当します.
2
①
2 +6 の計算例
6
ALU
②
③
W レジスタ 6
8
図 2.13 ALU と W レジスタ
2.2.7 16F84A のファイルレジスタ
ファイルレジスタは,データを格納する 8 ビットの高速なメモリです.このメモリ
のアドレスは,アドレス選択装置から出ている 7 ビットのアドレスバスで指定されま
すので,最大 27=128 領域,16 進数では,0 番地∼7FH 番地までになります.しかし,
16F84A では,4FH 番地までしか実装されていません(図 2.14).
第二章(念).indd
25
2014/09/10
16:49:24
26 第 2 章 PIC マイコンの基礎
8 ビット
00
特殊機能レジスタ群
SFR
0B
0C
汎用レジスタ
4F
50
(68)
10 個
実装なし
7F
図 2.14 ファイルレジスタ
また,上位 0 番地∼0BH 番地までの 12 個の領域は,SFR(Special Function Register)とよばれる特殊機能をもつレジスタに割り当てられています.したがって,ユー
ザが汎用レジスタとして使用できるのは,0CH 番地∼4FH 番地までの 68 個の領域
です.
ファイルレジスタは,バンクという概念を使って切り替えることで,より大きなサ
イズのメモリとして扱うことができます.ページと同様に,他のレジスタ 2 ビットを
使用して最大 4 個のバンク,つまり,128×4=512 個の領域を扱うことができます.
ただし,16F84A については,2 個のバンクを切り替えるようになっています(図 2.15).
バンクの切替えは,SFR の中にある STATUS(ステータス)レジスタの RP0(5 ビッ
ト目)を 0 か 1 に設定することで行います.
これにより,バンク 0 では 0 番地∼4FH 番地,バンク 1 では 80H 番地∼CFH 番
アドレス バンク 0
SFR
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
4F
バンク 1 アドレス
INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
INDF
OPTION_REG
PCL
STATUS
FSR
TRISA
TRISB
EEDATA
EEADR
PCLATH
INTCON
EECON1
EECON2
PCLATH
INTCON
汎用レジスタ
68 個
( )
汎用レジスタ
未使用
未使用
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
バンク 0 と同じ
CF
図 2.15 16F84A のファイルレジスタ
第二章(念).indd
26
2014/09/10
16:49:24
2.2 PIC の構成 27
地までが有効なアドレスになります.ただし,バンク 0 とバンク 1 で同じ名前の SFR
については,同一のレジスタ(バンク 0)を参照することになります.同様に,汎用
レジスタについてもバンク 1 専用のレジスタはありません.バンク 0 の汎用レジス
タが,バンク 1 にも割り当てられています.
ファイルレジスタには,RAM が使用されていますので,電源を切ると記憶内容は
消失してしまいます.ファイルレジスタのことを,データメモリとよぶことがありま
すが,後で学ぶ EEPROM を使用したデータメモリと混同してしまう危険がありま
すので,本書ではファイルレジスタとデータメモリを区別することにします.
2.2.8 特殊レジスタ(SFR)
ファイルレジスタの上位 0∼0BH 番地と 80H∼8BH 番地までは,SFR とよばれる
特殊機能をもつレジスタが存在します.表 2.3(次ページ)に,16F84A の SFR の一
覧を示します.
SFR は,PIC の各種設定などを行う重要な働きをもっています.たとえば,ポート
A,B を入力と出力のどちらにするか,割込み処理を行うか否か,どのバンクを参照
するかなどの設定には,SFR を使用します.実際の設定は,SFR の特定ビットを 0 か
1 にすることによって指定するようになっています.
たとえば,SFR の 86H 番地にある TRISB レジスタの各ビットは,ポート B(16F84A
のピン番号 6∼13 番)に対応していて,TRISB レジスタに「0」を書き込んだビット
に対応するピンは出力用に,
「1」を書き込んだピンは入力用に設定されます(図 2.16).
バンク 1
0:出力ピン
1:入力ピン
となる
ビット 7 ビット 6 ビット 5 ビット 4 ビット 3 ビット 2 ビット 1 ビット 0
RB7
RB6
RB5
RB4
10
11
12
13
RB3
16F84A
SFR 86H TRISB
RB2
RB1
RB0
9
8
7
6
図 2.16 TRISB レジスタによるポート B の設定
第二章(念).indd
27
2014/09/10
16:49:25
28 第 2 章 PIC マイコンの基礎
表 2.3 16F84A の SFR 一覧(204 ページにも掲載)
アドレス
名 称
ビット 7 ビット 6 ビット 5 ビット 4 ビット 3 ビット 2 ビット 1 ビット 0
バンク 0
00H
INDF
FSR の内容のアドレスのデータメモリ(物理的には存在しない)
01H
TMR0
8 ビットリアルタイム・クロック/カウンタ
02H
PCL
PC の下位 8 ビット
03H
STATUS
04H
FSR
05H
PORTA
06H
PORTB
IRP
RP1
RP0
TO
PD
Z
DC
C
RA3
RA2
RA1
RA0
RB3
RB2
RB1
RB0/INT
TOIF
INTF
RBIF
間接データメモリアドレスポインタ
−
−
−
RB7
RB6
RB5
RA4/
TOCKI
RB4
使用しない,「0」としてリードされる
07H
08H
EEDATA
EEPROM データレジスタ
09H
EEADR
EEPROM アドレスレジスタ
0AH
PCLATH
−
−
−
0BH
INTCON
GIE
EEIE
TOIE
PC の上位 5 ビット
INTE
RBIE
バンク 1
80H
INDF
81H
OPTION_
REG
82H
PCL
83H
STATUS
84H
FSR
85H
TRISA
86H
TRISB
RBPU
INTEDG
TOCS
TOSE
PSA
PS2
PS1
PS0
RP0
TO
PD
Z
DC
C
PC の下位 8 ビット
IRP
RP1
間接データメモリアドレスポインタ
−
−
−
PORTA データ入出力設定レジスタ
PORTB データ入出力設定レジスタ
使用しない,「0」としてリードされる
87H
88H
FSR の内容のアドレスのデータメモリ(物理的には存在しない)
EECON1
−
−
−
EEIF
WRERR
WREN
WR
RD
EEPROM 制御レジスタ 2(物理的には存在しない)
89H
EECON2
8AH
PCLATH
−
−
−
8BH
INTCON
GIE
EEIE
TOIE
PC の上位 5 ビットへの書き込みバッファ
INTE
RBIE
TOIF
INTF
RBIF
2.2.9 16F648A のファイルレジスタ
参考のため,図 2.17 に 16F648A のファイルレジスタの構成を示します.16F648A
は,バンクが 0∼3 まであります.たとえば,バンク 0 の汎用レジスタは,アドレス
20H 番地からですから,16F84A 用のプログラムを動作させる場合には注意が必要で
す.
第二章(念).indd
28
2014/09/10
16:49:25
2.2 PIC の構成 29
バンク 0
バンク 1
INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
アドレス
00
01
02
03
04
05
06
07
08
09
PCLATH
0A
INTCON
0B
0C
PIR1
0D
TMR1L
0E
0F
TMR1H
T1CON
10
TMR2
11
12
T2CON
13
14
CCPR1L
15
16
CCPR1H
17
CCP1CON
18
RCSTA
19
TXREG
1A
RCREG
1B
1C
1D
1E
1F
CMCON
20
INDF
OPTION
PCL
STATUS
FSR
TRISA
TRISB
汎用レジスタ
80 個
PCLATH
INTCON
PIE1
PCON
PR2
TXSTA
SPBRG
EEDATA
EEADR
EECON1
EECON2
VRCON
アドレス
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
90
91
92
93
94
95
96
97
98
99
9A
9B
9C
9D
9E
9F
A0
汎用レジスタ
80 個
6F
70
16 個
7F
バンク 0 と
同じ
バンク 2
INDF
TMR0
PCL
STATUS
FSR
PORTB
PCLATH
INTCON
アドレス
100
101
102
103
104
105
106
107
108
109
10A
10B
10C
10D
10E
10F
バンク 3
INDF
OPTION
PCL
STATUS
FSR
TRISB
PCLATH
INTCON
アドレス
180
181
182
183
184
185
186
187
188
189
18A
18B
18C
18D
18E
18F
11F
120
汎用レジスタ
80 個
EF
F0
FF
バンク 0 と
同じ
16F
170
17F
バンク 0 と
同じ
1EF
1F0
1FF
図 2.17 16F648A のファイルレジスタ(空欄は未使用)
2.2.10 間接アドレッシング方式
メモリのアドレスを指定して直接的に内容をアクセスするのは,直接アドレッシン
グ方式とよばれています.これに対して,ある操作によって間接的にメモリをアクセ
スするのが間接アドレッシング方式です(図 2.18).
第二章(念).indd
29
2014/09/10
16:49:25
112
番号!!!!
5.1 LED の制御
0
1
2
ここで学ぶことは,マイコン制御の基本となります.スイッチから入力データを取
り込んで,LED を自在に点滅できるように実習してください.
5.1.1 LED 実習回路の製作
図 5.1 ∼ 5.3 に,LED 実習回路のブロック図,回路図,外観を示します.実際の
製作にあたっては,付録(201 ページ)を参考にしてください.
スイッチ
×2
入力
5V
電源
RB0 ∼ 7
RA0 ∼ 1
MCLR
PIC
VDD
出力
LED×8
リセット
OSC1 ∼ 2
セラロック
発振
(10 MHZ)
16F84A
図 5.1 LED 実習用回路のブロック図
390 Ω×8
10
RB4
11
RB5
RB6
13
RB7
14
VDD
12
セラロック
(10 MHz)
15
OSC2
OSC1
17
RA0
18
RA1
16
10 kΩ
×2
電源 SW
9V
3
RB3
RB2
RB1
RB0
GND
MCLR
RA4
RA3
RA2
LED7
LED6
9
8
LED5
LED4
7
LED3
6
LED2
5
LED1
4
LED0
3
2
1
PIC16F84A
SW0
78L05
+
2
47µF
SW1
+5 V
1
+
47µF
78L05
0.1µF
123
1:出力
2:GND
3:入力
セラロック
1:出力
2:GND
1 2 3 3:出力
図 5.2 LED 実習回路図
第五章(念).indd
112
2014/09/11
11:31:25
5.1 LED の制御 113
図 5.3 実習回路の外観
各部の説明
( 1 )電源回路
PIC は 5 V で動作します.ここでは,3 端子レギュレータ IC(78L05)を使用して,
9 V の乾電池(006P)から 5 V を得る回路を構成しました.78L05 は,7 ∼ 20 V の
入力電圧から 5 V(Max 100 mA)を得ることができます(図 5.4).
( a )78L05(Max 100mA) ( b )7805(Max 1A)
図 5.4 3 端子レギュレータ IC
( 2 )発振回路
PIC は,内部に RC 発振回路を内蔵しており,簡単にクロック信号を作ることが
できます.しかしここでは,安定度を向上させるために,セラロックとよばれる村田
製作所の外付け型のセラミック振動子(10 MHz)を使いました(図 5.5( a )).この
振動子は,コンデンサを内蔵しており,3 本ピンの真ん中をグランドに接続します.
さらに発振の安定度を上げたい場合には,水晶振動子を用います(図 5.5( b )).水
晶振動子を使用する場合には,セラロックと同様の回路構成で,2 個のコンデンサの
値を 20 pF 程度にするとよいでしょう.
第五章(念).indd
113
2014/09/11
11:31:26
114 第 5 章 プログラミング実習
( a )セラロック
( b )水晶振動子
図 5.5 外付け振動子
(3)リセット回路
PIC は,電源を投入するとプログラムメモリの 0 番地から実行を開始します.また,
電源投入後に,リセット信号を入力しても,0 番地から実行を始めます.リセット信
号は,PIC の MCLR ピンに入力(グランドに接続)するとイネーブル(有効)となり
ます.ところで,マイコンに電源を投入した瞬間に電圧 VDD が,加えた 5 V になるわ
けではありません.0 V から 5 V になるまで立上りの時間を必要とします.したがっ
て,誤動作を防ぐために,電源電圧が PIC(16F84A)の最低動作電圧 4.5 V に達す
るまでのあいだには,PIC をリセットしておくことが必要です(図 5.6( a )).この
ためのリセット回路には,図 5.6( b )に示す遅延回路がよく使われます.しかし,
実習回路では,リセット回路を省略し,MCLR ピンを VDD ライン(+5 V)に接続しま
した.
5V
4.5 V
+5V
1S1588
0V
10 kΩ
t
1 kΩ
スイッチ ON 規定電圧
リセットしておく
リセット
SW
( a )電源電圧の立上り
+
10µF
MCLR
( b )リセット回路
図 5.6 リセット
( 4 )入力回路
入力回路は,ポート A に 2 個のスナップスイッチを用意しました.スイッチ ON で,
RA0 と RA1 ピンに信号“1”
(+5 V)を入力します.信号入力を行う場合には,入力
ピンがハイインピーダンスの状態にならないように注意する必要があります.図 5.7
( a )に示す回路では.スイッチ ON で“1”がピン X に入力されますが,スイッチ
OFF では,どこにも接続していない(ハイインピーダンス)状態となってしまいます.
このような状態を避けるために,今回はプルダウン抵抗を接続して,スイッチが
OFF のときには,入力ピンへの信号が“0”となるようにしてあります(図 5.7( b )).
第五章(念).indd
114
2014/09/11
11:31:28
5.1 LED の制御 115
+5V
+5V
ピン X
ピン X
10 kΩ
プルダウン抵抗
( a )よくない回路例
( b )正しい回路例
図 5.7 スイッチ入力回路
( 5 )出力回路
出力回路は,ポート B に 8 個の LED(発光ダイオード)を接続しました.LED
と直列につながっている抵抗は,電流制御用です.LED での電圧降下は,およそ
2 V ですから,この抵抗には,電源電圧(5 V)−LED での電圧降下(2 V)=3 V の
電圧がかかります.一方,LED はおよそ 10 mA の電流を流せば十分な輝度で発光し
ます.ここでは,LED におよそ 8 mA の電流を流すことを想定して,抵抗値を 3 V
÷8 mA=375≒390 Ωとしました(図 5.8).
5 V(VDD)
3V
2V
I(A)
3
R =_(Ω)
I
R(Ω)
図 5.8 電流制御用抵抗
PIC では,1 本の入出力ピンにおよそ 20 mA までの電流を流すことができます.
したがって,LED 程度なら,ドライブ回路なしで直接接続することが可能です.
この実習回路では,プログラムを書き込んだ PIC を何度も装着・脱着しますので,
IC ソケットが必要となります.ここでは,レバー操作で簡単に PIC を取り外しでき
る TEXTOOL とよばれるソケットを使用しました.このソケットは,たいへん便利
ですが,高価なので予算に応じて採用してください(図 5.9).
( a )TEXTOOL(ゼロプレッシャ)型
( b )通常型
図 5.9 PIC の 18 ピンソケット
第五章(念).indd
115
2014/09/11
11:31:29
116 第 5 章 プログラミング実習
5.1.2 LED 点灯プログラム
初めは,8 個の LED を点灯する信号出力用のプロ
グラムを作成しましょう.図 5.10 にフローチャート,
リスト 5.1 にプログラムを示します.点灯データは,
疑似命令 EQU で LEDD=55H と設定しています.
ポートを入力,出力のどちらにするのかは,SFR(特
殊レジスタ)の 85H(ポート A 用 TRISA レジスタ),
86H(ポート B 用 TRISB レジスタ)で設定します.
スタート
インクルード
ファイルの設定
点灯データ
55H→LEDD
LIST
INCLUDE
EQU
これらのレジスタのピン番号に対応するビットに
“0”を書き込めば出力用,
“1”を書き込めば入力用
ピンに設定できます.このプログラムでは,TRISB
レジスタのすべてのビットをクリア(CLRF 命令)し
て出力ピンとしています.
バンク 1
BSF
ポート B 出力モード CLRF
バンク 0
00H→ポート B
BCF
CLRF
TRISB レジスタは,ファイルレジスタのバンク 1
側にありますので,SFR の STATUS レジスタ RP0(イ
ンクルードファイルで,5 ビット目と記述してある)
に“1”を設定(BSF 命令)することでバンク 1 を選
択しています.
LEDD→W
W→ポート B
MOVLW
MOVWF
待機
図 5.10 フローチャート
リスト 5.1
LED 点灯プログラム 1
; *******************************************************
; リスト 5.1
; LED 点灯プログラム 1
; *******************************************************
LIST
P=PIC16F84A
; 使用する PIC を指定
INCLUDE "P16F84A.INC"
; 読み込む設定ファイルを指定
; *******************************************************
LEDD
EQU
55H
; LED 点灯データの設定
; *******************************************************
ORG
0
; プログラムを格納する先頭アドレス
WAIT
BSF
CLRF
BCF
CLRF
MOVLW
MOVWF
GOTO
STATUS,RP0
TRISB
STATUS,RP0
PORTB
LEDD
PORTB
WAIT
END
; バンク 1 を選択
; ポート B をすべて出力モードに設定
; バンク 0 を選択
; ポート B を 0 にクリア(LED 消灯)
; 点灯データを W レジスタにセット
; 点灯データをポート B に出力
; 待機
; プログラムの終わり
データを出力する POPTB レジスタは,ファイルレジスタのバンク 0 側にあります
ので,再びバンクの切替えを行ってから,点灯データ LEDD を W レジスタ経由でポー
ト B から出力します(図 5.11).
第五章(念).indd
116
2014/09/11
11:31:29
5.1 LED の制御 117
プログラムメモリ
バンク 1
∼
80
入力か出力かを指定
STATUS
∼
SFR
バンク 0
∼
00
03
05
06
∼
TRISA
TRISB
∼
PORTA
PORTB
85
86
(7F) 4F
CF
入力 / 出力
データ
RB0
∼
W
∼
∼
汎用レジスタ
ポートB
8B(9F)
8C(A0)
(1F) 0B
(20) 0C
*
RB7
*( )は,16F648A
切替
STATUS レジスタ
0:バンク 0
RP0
1:バンク 1
図 5.11 16F84A のポート B のモード設定とデータ転送
終わりに GOTO 命令を使って,PIC を待機状態にしています.
プログラムを記述したら,アセンブルを行い,PIC ライタ装置を用いて PIC に書
き込みます.書込み時には,コンフィグレーションビットを,FOSC(OSC)を「HS」,
WDTE(WDT)を「OFF」
,PWRTE を「ON」,CP を「OFF」と指定してください(67 ペー
ジ参照)
.
プログラムの書込みが終われば,PIC を実習回路に装着して動作を確認します.
点灯データが 55H なので,LED が図 5.12 のように点灯すれば成功です.
0 1 0 1 0 1 0 1 B = 55H
消灯
点灯
図 5.12 LEDD = 55H のときの点灯
たとえば,すべての LED を点灯させるデータは 0FFH です.このように,アルファ
ベットで始まる 16 進数の先頭には 0 を記述することに注意してください.
練習問題 5.1 リスト 1 で,点灯データ LEDD の値を変えて動作を確認しなさい.
第五章(念).indd
117
2014/09/11
11:31:29
149
5.3 割込み制御
PIC16F84A には,4 種類の割込みモードがあります.どのモードも基本的な制御
の流れは同じです.ここでは,INT(RB0)ピンによる割込みについて実習しましょう.
5.3.1 割込みプログラム
割込みとは,実行中の処理 A を中断して,他の処理 B を行った後,もとの処理 A
の実行に戻る手法です(37 ページ参照).PIC では,プログラムメモリの 04H 番地
が割込みベクタです.割込み信号が入力されると PC(プログラムカウンタ)は 04H
番地を示し,そこに格納されている命令を実行します.割込み処理からの回復には,
RETFIE 命令を用います.
図 5.55 に,割込みを使用する場合のプログラム実行の流れを示します.PIC に電
源を投入すると,プログラムメモリ 00H 番地(リセットベクタ)から命令の実行を
開始します.割込み信号がないときは,そのまま 04H 番地(割込みベクタ)まで実
行が進まないように,GOTO 命令を用いて,割込み処理プログラムをジャンプします.
図 5.56 に,割込み制御を行う場合のプログラム記述の手順を示します.
アドレス プログラムメモリ
リセット
00
ベクタ
04
割込み発生!
∼
割込み
ベクタ
GOTO 命令で
割込み処理を
ジャンプ
割込みから戻る
RETFIE
∼
∼
∼
∼
∼
3FF
図 5.55 割込みを使用するプログラムの流れ
第五章(念).indd
149
2014/09/11
11:31:34
150 第 5 章 プログラミング実習
(1)
割込みが発生
すると,自動的
に実行される
割込みモードの設定
割込みフラグの変化
INTCON (T0IF,INTF,RBIF)
(2)
割込みベクタヘジャンプ
(04H番地)
(3)
W レジスタ,STATUS (Z,DC,C)
などの待避
(4)
割込み禁止
(5)
割込み処理
割込みフラグの回復
(6)
INTCON (T0IF,INTF,RBIF)
(7)
割込み許可
(8)
W レジスタ,STATUS
(Z,DC,C)などの回復
(9)
RETFIE
割込みから戻る
図 5.56 割込みプログラム記述の手順
プログラム記述の手順
① 割込みモードの設定
プログラムに,許可する割込みの種類と割込み信号のエッジ設定を記述します.
許可する割込みの種類は INTCON レジスタで設定します.たとえば,INT(RB0)ピ
ンによる割込みを許可する場合には,INTCON レジスタに 90 H を書き込みます
(図 5.57).
すべての割込み
RB0/INT ピンによる割込み
0BH
INTCON
ビット 7 ビット 6 ビット 5 ビット 4 ビット 3 ビット 2 ビット 1 ビット 0
GIE
EEIE
T0IE
INTE
RBIE
T0IF
INTF RBIF
0:禁止
1:許可
1
0
0
1
0
0
0
0
90H:許可
0
0
0
1
0
0
0
0
10H:禁止
図 5.57 許可する割込みの種類の設定
割込み信号のエッジ設定は,OPTION_REG レジスタを用いて行います.エッジ
設定とは,割込み信号を有効にするタイミングを,信号の立上り時か立下り時か
第五章(念).indd
150
2014/09/11
11:31:34
5.3 割込み制御 151
に指定することです.たとえば,立上りエッジを指定する場合には,OPTION_
REG レジスタの 6 ビット目に“1”を書き込みます(図 5.58).
割込み信号のエッジ
81H
OPTION_REG
0:立下り
1:立上り
ビット 7 ビット 6 ビット 5 ビット 4 ビット 3 ビット 2 ビット 1 ビット 0
RBPU INTEDG T0CS
T0SE
PSA
PS2
PS1
PS0
“1”
t
“0”
立上り
立下り
図 5.58 割込み信号のエッジ設定
② 割込みフラグの変化,割込みベクタへジャンプ
有効な割込み信号が入力された場合,PIC は割込みフラグを設定して 04H 番
地へジャンプします.たとえば,INT(RB0)ピンによる割込み信号が有効になっ
た場合には,INTCON レジスタの 1 ビット目 INTF が“1”になります.これは,
プログラムで“0”にリセットしないと次の割込みを受け付けることはできませ
ん(37 ページ図 2.29 参照).
③ W レジスタ,STATUS(Z,DC,C)などの待避
割込み処理のプログラムで,W レジスタやフラグを使用すると,それらのデー
タが変化してしまいます.それで,割込みから戻ったときに,もとの内容に回復
できるようにデータを待避しておきます.
④ 割込み禁止
割込み処理の途中で,次の割込みを受け付けないように,割込みを禁止してお
きます.
⑤ 割込み処理
必要な割込み処理を記述します.
⑥ 割込みフラグの回復
次の割込みを受け付けられるように,INTCON レジスタの割込みフラグをリセッ
トします.
⑦ 割込み許可
次の割込みを許可します.この設定と⑥割込みフラグの回復は,どちらも
INTCON レジスタに対して行いますので,同時に設定することができます.
⑧ W レジスタ,STATUS(Z,DC,C) などの回復
③で待避してあったデータを回復します.
⑨ 割込みから戻る
RETFIE 命令を使用して割込みから戻ります.戻った後は,次の割込み信号を
監視しながらもとの処理を再開します.
第五章(念).indd
151
2014/09/11
11:31:34
152 第 5 章 プログラミング実習
5.3.2 電子サイコロ
INT(RB0)ピンによる割込みモードを使用して電子サイコロプログラムを作成しま
しょう.サイコロの目と同じように 7 個の LED を配置して 1 ∼ 6 までの目を発光さ
せます.
プログラムでは,6 種類の発光データを順次 W レジスタに格納する処理を繰り返し
ます.そして,割込み信号が入力された時点で,W レジスタのデータをポート B(LED)
に出力します.発光データは高速で変化していますので,人がデータを予想すること
は困難ですから,ランダムな目が出ると考えてよいでしょう.
図 5.59 に割込み制御実習回路の回路図を,図 5.60 に外観を示します.割込み信号
はポート B の RB0/INT に接続した押しボタンスイッチから取り込みます.サイコロ
の目 LED はポート B の RB1 ∼ 7 に接続してあります.
390 Ω×7
10
11
12
13
14
15
16
セラロック
(10 MHz)
17
18
電源 SW
9V
3
1
78L05
+
2
47µF
RB4
RB3
RB5
RB2
RB6
RB1
RB7 RB0/INT
VDD
GND
OSC2
MCLR
OSC1
RA4
RA0
RA3
RA1
RA2
PIC16F84A
+
47µF
9
8
7
6
10 kΩ
5
4
3
SW0
2
1
+5V
0.1µF
図 5.59 割込み制御実習回路
第五章(念).indd
152
2014/09/11
11:31:34
5.3 割込み制御 153
図 5.60 外 観
RB
3
2
目
5
4
1
6
7
RB
16 進
1
7 6 5 4
0 0 0 1
3 2 1
0 0 0
0
0
2
0 0 1 0
0 0 1
0
3
0 0 1 1
0 0 1
0
32
4
1 0 1 0
1 0 1
0
AA
5
1 0 1 1
1 0 1
0
6
1 1 1 0
1 1 1
0
BA
EE
10
22
図 5.61 LED の配置と発光データの関係
MAIN :
メインルーチン
割込みルーチン
スタート
INT
初期設定
W の待避
割込み許可
(INT ピン)
割込み禁止
割込み信号
設定(立上り)
W の復帰
ポート B 設定
RB0:入力
RB1∼7:出力
00H→ポート B
AGAIN :
NUM1∼6→W
W→ポート B
タイマ
00H→ポート B
割込み許可
戻る
図 5.62 フローチャート
第五章(念).indd
153
2014/09/11
11:31:34
154 第 5 章 プログラミング実習
図 5.61 に,LED の配置(サイコロの目)と発光データの関係を示します.
図 5.62 にフローチャート,リスト 5.13 にプログラムを示します.
リスト 5.13
電子サイコロのプログラム
; ***************************************************************
; リスト 5.13
; 割込み制御プログラム
; 電子サイコロ
; ***************************************************************
LIST
P=PIC16F84A
; 使用する PIC を指定
INCLUDE
"P16F84A.INC"
; 読み込む設定ファイルを指定
; ***************************************************************
PB_D
EQU
01H
; ポート B 入出力設定データ
NUM1
EQU
10H
; 目データ
NUM2
EQU
22H
NUM3
EQU
32H
NUM4
EQU
0AAH
NUM5
EQU
0BAH
0EEH
NUM6
EQU
INT_OK EQU
90H
; INT(RB0) ピン割込み許可データ
INT_NG EQU
10H
; 割込み禁止データ
TMP
EQU
0CH
; W レジスタ待避用
CNT1
EQU
0DH
; タイマ 1 用カウント変数
CNT2
EQU
0EH
; タイマ 2 用カウント変数
CNT3
EQU
0FH
; タイマ 3 用カウント変数
; ***************************************************************
ORG
0
; プログラムを格納する先頭アドレス GOTO
MAIN
ORG
4
; 割込みベクタ
MOVWF
TMP
; W レジスタの待避
MOVLW
INT_NG
; 割込み禁止データ
MOVWF
INTCON
; 割込み禁止
割込み処理 **************************************************
MOVF
TMP,W
; W レジスタの回復
MOVWF
PORTB
; ポート B へ出力
CALL
TIMER3
; 1 秒タイマ呼出し
CLRF
PORTB
; ポート B をクリア(LED 消灯)
; ***************************************************************
;
第五章(念).indd
154
MOVLW
MOVWF
RETFIE
INT_OK
INTCON
; 割込み許可データ
; 割込み許可
; 割込みから戻る
MAIN
BSF
MOVLW
MOVWF
BSF
MOVLW
MOVWF
BCF
CLRF
STATUS,RP0
INT_OK
INTCON
OPTION_REG,INTEDG
PB_D
TRISB
STATUS,RP0
PORTB
; バンク 1 を選択
; 割込み許可データ
; 割込み許可
; 割込み信号の立上りで動作
; ポート B 設定データ
; RB0 を入力,RB1 ∼ 7 を出力モードに設定
; バンク 0 を選択
; ポート B をクリア(LED 消灯)
AGAIN
MOVLW
NOP
NOP
MOVLW
NOP
NOP
MOVLW
NOP
NUM1
; 目データの格納
NUM2
NUM3
2014/09/11
11:31:34
5.3 割込み制御 155
NOP
MOVLW
NOP
NOP
MOVLW
NOP
NOP
MOVLW
GOTO
TIMER1
LOOP1
TIMER2
LOOP2
TIMER3
LOOP3
NUM4
NUM5
NUM6
AGAIN
MOVLW
MOVWF
NOP
DECFSZ
GOTO
RETURN
D
‘62’
CNT1
MOVLW
MOVWF
NOP
CALL
DECFSZ
GOTO
RETURN
D
‘100’
CNT2
MOVLW
MOVWF
NOP
CALL
DECFSZ
GOTO
RETURN
D
‘100’
CNT3
; 0.1 ミリ秒タイマサブルーチン
CNT1,F
LOOP1
; 10 ミリ秒タイマサブルーチン
TIMER1
CNT2,F
LOOP2
; 1 秒タイマサブルーチン
TIMER2
CNT3,F
LOOP3
END
; プログラムの終わり
RB0/INT に割込み信号が入力されると,そのときの W レジスタのデータで LED を
点灯します.そして,タイマを用いておよそ 1 秒間点灯させた後,もとの処理(点灯
データを繰り返し W レジスタに格納する)に戻ります.図 5.61 に示した点灯データは,
NUM1 ∼ 6 に割り付けて使用しています.タイマルーチンは,これまでに使用したの
と同じプログラムです.
点灯データ NUM1 ∼ 6 を W レジスタに格納する場合,最後の NUM6 の格納が終了す
ると GOTO 命令で NUM1 の格納にジャンプします.このとき,GOTO 命令の実行に 2 サ
イクル必要ですから,W レジスタには NUM6 が格納されている時間が,NUM1 ∼ 5 より
も長くなってしまいます.この問題を解決して,少しでもランダム性を高めるために,
NOP 命令を使用して,各データの格納時間を同一にしています.
練習問題 5.24 INTCON レジスタに,90H と 10H を書き込む設定について説明しなさい.
練習問題 5.25 リスト 5.13 の,ラベル NUM1 と CNT1 に割り当てられたデータは,プ
ログラム中で異なった意味合いをもつ.このことについて説明しなさい.
練習問題 5.26 リスト 5.13 のプログラムを変更して,割込み信号を入力すると,
第五章(念).indd
155
2014/09/11
11:31:35
207
索 引
英 数
10 進数
52
1 2 相励磁方式
145
16F648A
22
16F84A
20,118
16 進数
56,57
1 相励磁方式
141
2SD1828
140
2 進数
52,57
2 相励磁方式
143
7805
140
8 進数
58
ADDLW
98
ADDWF
78
ALU
25
AND
59
ANDLW
100
ANDWF
82
BCF
93
Binary
52
BSF
94
BTFSC
95
BTFSS
96
C
72
CALL
33,103
CCS コンパイラ
184
CISC
22
CLRF
90
CLRW
91
CLRWDT
36,108
COMF
84
_CONFIG
65
CPU
4
C コンパイラ
184
DC
72
DC モータ
134
DECF
81
DECFSZ
89
Decimal
52
_ _delay_ms()
190
dsPIC
19
EEPROM
31
索引(念).indd
207
EEPROM 割込み
37
Encoding
167,187
END
65
EQU
65
59
EX−OR
F
69,75
F1 エンハンストミッドレ
ンジ
18
FSR
30
GOTO
104
hex
70,173
Hexadecimal
56
INCF
80
INCFSZ
88
INCLUDE
65
INDF
30
INTCON 38,150,156
INT ピン割込み
37
IORLW
101
IORWF
83
LED
115
LED 実習回路 112,201
LIFO 方式
33
LIST
65
MCLR
114
mikroC コンパイラ
184
MOVF
41,75
MOVLW
97
MOVWF
76
MPASM
65
MPLAB ICD3
47
MPLAB X
45,162
MPU
4
NOP
92
NOT
59
Octal
58
OPTION_REG
35,150,156
OR
59
ORG
65
PC
42
PIC
8,16
PIC18
19
PICkit3
46
PIC ライタ
45,46
RETFIE
107,149
RETLW
106
RETURN
33,105
RISC
22
RLF
87
RRF
86
RS フリップフロップ 148
SFR
26,27,28,179,204
SLEEP
38,109
STATUS
72
Step Info
177
Step Over
177
SUBLW
99
SUBWF
79
SWAPF
77
TA7291P
134
TEXTOOL
115
TRISA
128
TRISB
27
W
69,75
WDT
36,66
W レジスタ
25
XC8
162
XC8 C コンパイラ
185
XC コンパイラ
162
XORLW
102
XORWF
85
Z
72
あ 行
秋月電子通商
49
アーキテクチャ
21
アキュムレータ
25
アセンブラ
44,64
アセンブラ言語
64
アセンブラ言語の書式 68
アセンブリ言語
64
アセンブル 44,64,171
アンダーフロー 61,126
2014/09/11
11:20:41
208 索 引
インクルードファイル
69,118
インサーキットデバッガ
47
インタフェース
2
ウオッチドッグタイマ
36,66
エッジ設定
150
オシレータモード
66
オーバーフロー 61,126
オープンドレイン
130
オペコード
68
オペコード部
23
オペランド
68
オペランド部
23
か 行
間接アドレッシング 145
間接アドレッシング方式
29
疑似命令
65
基数変換
52
逆起電力
133
キャリービット
61
繰返し制御
123
クロック
5
ゲート
59
コードプロテクト
66
コメント
68
コンパイル
189
コンフィグレーションビッ
ト 66,118,169,189
さ 行
サイクル
40,120
サブルーチン
33,120
算術演算
59
時間かせぎ
120
シフト
61
シミュレーション 44,176
シミュレータ
44
出力回路
115
シュミットトリガゲート
148
真理値表
59
水晶振動子
113
スタック
33
ステップ角
140
ストップウオッチ
179
相撲ロボット
12
スリープ
38
制御文
123
索引(念).indd
208
正数
54
赤外線センサ
160
セラミック振動子
113
セラロック
113
選択制御
123
全命令
73,205
ソケット
115
ソースファイル 168,187
ソースブースト C コンパ
イラ
184
ソースプログラム
188
ソフトウェア
2
た 行
タイマ
119
タイマ 0
34,156
タイマ 0 割込み
37
タイマ関数
190
ダーリントンパワートラン
ジスタ
140
逐次処理
3
置数器
25
チャタリング
147
中央処理装置
4
超音波センサ
12
直接アドレッシング方式
29
ディジタル I/O
118
ディジタル回路
59
デコーダ
4
データメモリ 27,31,118
デバッグモード
175
電源回路
113
電源供給
172
電子サイコロ
152
トランジスタスイッチ 132
な 行
ニーモニックコード
64
入力回路
114
ネスト
33,120
ノイズ
138
ノイマン型
3
は 行
排他的論理和
59
パイプライン方式
41
パソコン
8
発振回路
113
ハードウェア
2
ハーバードアーキテクチャ
22
パルスモータ
138
パワーアップタイマ
66
バンク
26,28
汎用レジスタ
118
ヒートシンク
143
ビルド
171,189
ファイルレジスタ
25,28,178
フォン・ノイマン
3
フォン・ノイマンのボトル
ネック
22
負数
54
フラグ
72
フラッシュメモリ 17,24
プリスケーラ
34
プルアップ抵抗
130
プルダウン抵抗
114
ブレークポイント
176
プログラム開発
44
プログラムカウンタ 4,42
プログラム転送
173
プログラムメモリ 24,178
プログラムモード
175
プロジェクト
165,186
ページ
24
ベースライン
18
ヘッダファイル
190
補数
54
ポート
21
ポート B 割込み
37
ま 行
マイクロコントローラ 16
マイ ク ロ チ ッ プ テ ク ノ ロ
16,200
ジー社
マイコン
6
マイコン制御
8
マシン語
64
マスク
60
ミッドレンジ
18
無限ループ
69
命令実行サイクル 3,40
命令の形式
23
命令のフォーマット
71
命令レジスタ
4
メモリ
34
メモリの内容
177
ら 行
ラベル
リセット回路
リセットベクタ
68
114
38,149
2014/09/11
11:20:41
索 引 209
リレー
ローテイト
論理演算
論理式
論理積
索引(念).indd
209
131
61,124
60
59
59
論理否定
論理和
59
59
わ 行
ワード
割込み
37,149,156
割込みベクタ
38,149
ワンチップマイコン
8
23
2014/09/11
11:20:41
著 者 略 歴
堀 桂太郎(ほり けいたろう)
日本大学大学院 理工学研究科
博士後期課程 情報科学専攻修了
博士(工学)
現在 国立明石工業高等専門学校
電気情報工学科 教授
<主な著書>
図解 ModelSim 実習
図解 LabVIEW 実習
図解 Verilog HDL 実習
図解 VHDL 実習 第 2 版
図解コンピュータアーキテクチャ入門 第 2 版
(以上,森北出版)
編集担当 加藤義之(森北出版)
編集責任 石田昇司(森北出版)
組 版 dignet
印 刷 丸井工文社
製 本 〃 図解 PIC マイコン実習 第 2 版
-ゼロからわかる電子制御-
2003 年 2 月 7 日 第 1 版第 1 刷発行
2013 年 2 月 5 日 第 1 版第 10 刷発行
2014 年 10 月 20 日 第 2 版第 1 刷発行
© 堀桂太郎 2014
【本書の無断転載を禁ず】
著 者 堀桂太郎
発 行 者 森北博巳
発 行 所 森北出版株式会社
東京都千代田区富士見 1⊖4⊖11(〒 102⊖0071)
電話 03⊖3265⊖8341 / FAX 03⊖3264⊖8709
http://www.morikita.co.jp/
日本書籍出版協会・自然科学書協会 会員
<(社)出版者著作権管理機構 委託出版物>
落丁・乱丁本はお取替えいたします.
Printed in Japan / ISBN978 4 627 78332 4
奥付(念).indd
1
2014/09/10
10:14:02