第1回 PICマイコンのハードウェア

■1.1 概要
◆1.1.1 特徴
 PICマイコンは,米国の Microchip Technology社がリリースしたワンチップ・マイコンである.PIC とは Peripheral Interface Controller の略であり,その名の通り,コンピュータとそれに接続される周辺機器とのインタフェースを制御するために開発されたものである.
 PIC は非常にコンパクトな設計であり,メモリ領域も他の高性能マイコンに比べると非常に少ない.しかし,ロジック IC で構成するには規模が小さくないものの,高性能マイコンを使うほど大規模ではない様な用途は,実は非常に多い.それが世界中で百億個以上も使用されている所以である.

メリット
メモリやタイマ,I/O回路等を内蔵しており,周辺回路として電源回路とクロック発信回路のみで動作する.
RISCアーキテクチャおよびハーバード・アーキテクチャにより高速に動作する.
命令数が少ないので(33~58)修得が容易である.
不揮発メモリを持つタイプでは何度でもプログラムを修正できる.
低電圧(およそ 1.8~6.0),低消費電力で動作するため,バッテリ駆動に適する.
I/Oポートの出力電流が大きいため(20~25mA),LED等を直接駆動できる.
メモリの大きさや組み込み機能等のバリエーションが豊富である.
ハードウェア,ソフトウェア共に互換性が高い.
8~40 ピンのパッケージであり,小型である.
価格が安い(数百円~).
開発ソフトが無償で提供されている等開発コストがあまりかからない.
デメリット
全てを 1 チップに納めたため,用途が限定される.
メモリ容量が少ないため,プログラムステップに制限があり,複雑な制御が出来ない.
非ノイマン・アーキテクチャであるため,メモリ管理に慣れが必要.

◆1.1.2 ラインナップ
 PIC は,大きく分けて DSP(Digital Signal Processor)がついた dsPIC と DSP のついていない PIC に分類できる.
 また,DSPのつかない PIC は,命令のビット長から 5 つのファミリー(PIC10/12,PIC16,PIC18,PIC24,PIC32)に分類できる.

 PIC のラインナップ例
ファミリー 代表的
PIC
データ長
(bit)
命令長
(bit)
最大
動作
周波数
(Hz)
CPU
SPEED
(MIPS)
メモリ 内蔵モジュール ピン数
プログラム
メモリ
(word)
データ
メモリ
(byte)
内蔵
クロック
周波数
(Hz)
不揮発
データ
メモリ
(byte)
I/O
ポート
A/D
変換器
(ch)
PWM タイマ
8/16bit
/32bit
非同期
シリアル
通信
同期
シリアル
通信
PIC10/12 10F222 8 12 8M 2 512 23 8M - 4 2(8bit) - 1/0/0 - - 6
12F629 8 12 20M 5 1024 64 4M 128 6 - 1 1/1/0 - - 8
12F683 8 12 20M 5 2048 128 8M 256 6 4(10bit) 1 2/1/0 - - 8
PIC16 16F84A 8 14 20M 5 1024 68 - 64 13 - - 1/0/0 - - 18
16F88 8 14 20M 5 4096 368 8M 256 16 7(10bit) 2 2/1/0 1 1 18
16F877A 8 14 20M 5 8192 368 - 256 33 8(10bit) 2 2/1/0 1 1 40
16F886 8 14 20M 5 8192 368 8M 256 24 11(10bit) 1 2/1/0 1 1 28
PIC18 18F1320 8 16 40M 10 4096 256 8M 256 16 7(10bit) 1 1/3/0 1 0 28
18F4550 8 16 48M 12 16k 2048 8M 256 35 13(10bit) 1 1/3/0 1 1 40
PIC24 24FJ64GA002 16 24 32M 16 64k 8192 8Mx4 - 21 10(10bit) 5 0/5/0 2 4 28
dsPIC 30F3013 16 24 160M 30 24k 2048 7.37Mx16 1024 20 10(12bit) 2 0/3/1 2 2 28
PIC32   PIC32MX110F016B 32 32 40M 80 19k 4096 8M   21 10(10bit) 5 0/5/0  2 2 28
(MIPS:コンピュータの処理速度をあらわす単位.1MIPS のコンピュータは 1 秒間に 100万回の命令を処理できる)

◆1.1.3 パッケージ
 例として,8 ピンおよび 40 ピンの PIC のピン配置図を示す.図中,矢印は信号の方向を示す.
 


外観
 
■1.2 構成(hardware architecture)
◆1.2.1 全体構成
 PIC の内部構成はハーバード・アーキテクチャ(Harvard architecture)と呼ばれるアーキテクチャを採用している.
 ハーバード・アーキテクチャは,メモリがデータ用とプログラム用にそれぞれ専用に設定されており,演算処理部とプログラムメモリ,演算処理部とデータメモリ間がそれぞれ別のデータバスで接続されている.
 ハーバード・アーキテクチャは内部構造が簡単であり,パイプライン処理(pipeline)等が比較的容易に構成できることから,高速動作が可能となり,チップが小さくできるため,価格も低くできる.また,プログラムバスデータバスが独立しているため,命令長をデータバス幅にとらわれることなく任意に設定でき,全ての命令を 1 word で構成できる

 一方,1 つのメモリ(メインメモリ)中にデータとプログラムが混在するアーキテクチャはノイマン・アーキテクチャ(von Neumann architecture)と呼ばれ,演算処理部とメモリ間は 1 種類のデータバスで接続されるため,動作速度の向上は容易ではない.


ハーバード・アーキテクチャ
  
ノイマン・アーキテクチャ

◆1.2.2 各部の機能
プログラムメモリ
program memory
プログラムを格納するメモリ.
スタックメモリ
stack memory
サブルーチンや割り込みの戻り番地を格納する専用メモリ.
命令では操作できない.
プログラムカウンタ
program counter
プログラムの実行を制御するカウンタ.プログラムカウンタの内容がアドレスとなり,そのアドレスで指定されたプログラムメモリ内の命令が,次に実行される命令となる.
レジスタファイル
file register
レジスタ群により構成されるデータ格納用メモリ.
PIC 特有のアーキテクチャ.
2 つの領域からなり,1 つは汎用のデータ領域であり,プログラム内で使う変数領域として使用する(GPR:General Purpose Register).
もう 1 つは特別なレジスタ領域であり,SFR(Special Fanction Resister)と呼ばれ,内蔵周辺回路の動作を制御するために使用される.入出力ポートも SFR に属する.
STATUSレジスタ
STATUS register
演算結果の状態,ゼロ,Carry 等を保持するレジスタ.
条件分岐時等のフラグとして使用する.
命令レジスタ
instruction register
プログラムメモリから読み出された命令がセットされ,命令の種類の解読と処理が行われる.
MUX
mutiplexer
各命令の指示に従って各種レジスタや Wreg の内容との演算がなされる部分.
演算結果は Wreg や入出力ポートやタイマ,プログラムカウンタ等に格納される.
ALU
arithmetic logic unit
Wreg
working register
演算データ一時保管用レジスタ.
データバス
data bus
命令実行に関係するデータを運ぶ通信路.
8 bit のデータを扱うため,8 本の線で構成されている.
入出力ポート
I/O port
PIC 内部に外部からデータを入力,もしくは内部のデータを外部に出力するためのポート.

◆1.2.3 命令実行手順
 加算命令を例として,PIC の内部で命令が実行される手順を以下に示す.

<Step 0>
電源 ON もしくはリセット
各構成部分が全て初期化される.プログラムカウンタも 0 となる.
<Step 1>
命令フェッチ
プログラムカウンタの示すアドレス(最初は 0 番地)から命令を取り出す.
<Step 2>
命令実行
取り出された命令を解読し,命令の種類により決められた演算等を実行する.
<Step 3>
演算データ転送
演算に関するデータは,レジスタファイルからデータバスを経由して読み書きされる.
ALU には Wreg の内容と,命令で指定されたレジスタファイル内のレジスタ値が入力される.Wreg とレジスタの加算結果が ALU の出力となる.
<Step 4>
結果転送および格納
ALU 演算結果の出力は,Wreg に上書きされるか,データバス経由でレジスタファイル内の指定レジスタに書き込まれる.
なお,演算実行結果の状態は STATUS レジスタに記憶され,正負やゼロ等の判定に使用される.
<Step 5>
周辺回路の制御
結果の格納を指定されたレジスタが,入出力ポートやタイマなどの特殊レジスタの場合は,周辺回路内の各レジスタが使用されることになる.
PIC では,同じ命令で,レジスタと周辺回路の制御が可能である.
<Step 6>
次の命令の準備
命令実行が完了すると,プログラムカウンタが自動的にインクリメント(+1)され,1 項目に戻って次の命令が実行される.このようにして,順次命令が実行されることでプログラムが動作する.
ジャンプ命令等,命令によっては,プログラムカウンタ自身にデータを上書きするものもある.

◆1.2.4 パイプライン・アーキテクチャ
 PIC の内部動作は,プログラムメモリから命令をフェッチする動作と,その命令を実行する動作の 2 種類に分けることが出来る.したがって,通常,1つの命令の実行には,フェッチサイクル実行サイクルという 2 サイクルが必要となる.
 PIC は,パイプライン・アーキテクチャを採用しているため,この 2 段階の動作を並行して同時に行うことができる.

 前の命令を実行しながら,次の命令を先読みする事で,外見上,各命令の実行は 1 サイクルで完了するように見える.
 ただし,ジャンプ命令は,実行時に先読みが無駄になり,次の命令のフェッチサイクルを改めてやり直す必要があり,2 サイクルを要する.
 
■1.3 命令構造(instruction architecture)
 PIC の命令は 1 word で構成される.1 word の長さは PIC のシリーズによって異なり,ローレンジシリーズでは 12 bit,ミッドレンジシリーズでは 14 bit,ハイレンジシリーズでは 16 bitである.
 ここでは,実習で使用する PIC16F84A が属するミッドレンジシリーズの命令アーキテクチャを解説する.

 ミッドレンジシリーズの命令はすべて 14 bit長を 1 単位,すなわち 1 word として構成されている.
 これがプログラムメモリの 1 つの番地につき1つずつ格納される.
 このような構造を持ったマイコンは RISC(Reduced Instruction Set Computer)構造マイコンと呼ばれる.このようなアーキテクチャは構造が簡単であるため小型のマイコンに適している.

 PICの命令は,命令レジスタの構造により,以下のように分類できる.

バイト処理命令 演算が中心となる命令.レジスタファイルのf番地にあるデータレジスタが演算対象となる.d bitで結果の格納場所を指定する(0:Wreg,1:レジスタファイルのf番地).
 レジスタファイルの番地を指定する f は 7 bit であるため,レジスタファイルは 0 から 127 番地までの 128 個のレジスタとなる.これでは足りない場合は Bank という考え方により対応することができる.
ビット処理命令 ビット演算の命令.レジスタファイルのf番地のデータの b bit目を対象とした演算を実行する.データとして使用されるレジスタは 8 bit であるため,3 bit で全て指定することができる.
リテラル処理命令他 定数kを演算の対象とした命令.k は 8 bitであるため,0~255 までのデータを扱うことができる.
ジャンプ命令 定数kで指定されたアドレスへジャンプする.k は 11 bit であるため,直接ジャンプできる範囲は 11 bit(2 kword)である.2 kword を越えて,2048 番地以上にジャンプする場合は,Page という考え方により対応することができる.
 
■1.4 メモリ構造(memory architecture)
 PIC のメモリは,プログラムメモリとデータメモリが独立している.データメモリはレジスタファイルとして扱われる.
 PIC のメモリアーキテクチャは,命令のアーキテクチャによる制限のため,直接アクセスできるメモリ範囲が小さい(プログラムメモリ:最大 2 kword,データメモリ:最大 128 byte).
 そのため,以下に示すような,それら制限を越えてアクセスするための機構が備わっている.

◆1.4.1 プログラムメモリの拡張
 プログラムメモリの拡張には,Page という方法が採用されている.Page は PCLATH という SFR を利用することで実現する.
 ジャンプ命令等に含まれている定数 k により 11 bit のアドレス(2 kword)が指定できるが,これに PCLATH レジスタ中の 2 bit を追加することで合計 13 bit のアドレスがプログラムカウンタに指定できる.

 従って,プログラムメモリは Page により,直接アクセスできるメモリ範囲の 4倍である 8 kword まで拡張できる.なお,プログラムメモリが 2 kword 以下の PIC では PCLATH レジスタの 2 bit の内容は常に 0 となる.
 

◆1.4.2 データメモリの拡張
 データメモリの拡張には,Bank という方法が採用されている.Bank は STATUS レジスタの RP0 および RP1 の 2 bit を利用することで実現する.
 PIC は,128 byteを1セットとして最大で 4 セットのデータメモリを内蔵している.各セットは Bank0 から Bank3 と呼ばれ,PR0 と PR1 により 1 つを選択することができる.

 従って,直接アクセスできる 128 byte の 4倍(512 byte)のデータメモリが使用できる.内蔵している Bank 数は,各 PIC で異なるため使用の際には確認が必要である.


◆1.4.3 間接アドレッシング
 データメモリのアクセスには,直接レジスタのアドレスを指定する直接アドレッシング以外に,間接アドレッシングと言う方法がある.間接アドレッシングには,プログラムで書き換え可能な SFR である FSR レジスタと STATUS レジスタの IRP ビットを使用する.

 間接アドレッシングで指定されたデータメモリは,INDF レジスタを経由してアクセスできる.FSR レジスタの第 6~0 ビットでデータメモリのアドレスを,FSR レジスタの最上位ビットと IRP ビットの組み合わせでデータメモリの Bank を指定すると,INDF レジスタを読めば指定されたアドレスのデータメモリの内容が読み出せ,INDF レジスタに書き込めば指定されたアドレスのデータメモリに書き込まれる.

 間接アドレッシングは,データメモリの連続した領域を順にアクセスする場合に便利である.また,RP0,RP1 を用いずに任意の Bank を直接アクセスできる.

◆1.4.4 特別なメモリ
 PIC には,プログラムメモリの範囲外に,ID ワードコンフィギュレーションビットという2種類の特別なメモリがある.通常のプログラム実行時はアクセスできず,ライタでプログラムを書き込む時にのみアクセスできる.

▼IDワード
 2000H~2003H 番地にある 4 word の領域.使い方はユーザの自由であり,プログラムの製造年月日,バージョン番号,管理番号等の記録に用いられることが多い.

 各 ID ワードは 1 word 全体を使用できるが,プログラムメモリにプロテクトをかけた場合は,各 ID ワードの下位 4 bit のみが有効となる.従って,通常は各 ID ワードの下位 4 bit のみを使用する.
 
▼コンフィギュレーションビット
 2007H 番地の 1 word で構成される.各ビットにそれぞれ機能が割り振られているが,PIC の種類でビット位置や内容が異なるので使用する際には注意が必要である.
 本実習で用いる 16F84A のコンフィギュレーションビットの配置と内容を以下に示す.



CP コードプロテクションビット
 1:コードプロテクションしない
 0:プログラムメモリをコードプロテクションする
PWRTE パワーアップタイマイネーブルビット
 1:パワーアップタイマを動作させない
 0:パワーアップタイマを動作させる
WDTE ウォッチドッグタイマイネーブルビット
 1:ウォッチドッグタイマを動作させる
 0:ウォッチドッグタイマを動作させない
FOSC1
FOSC0
発振素子選択ビット
FOSC1 FOSC0 モード
0 0 LP モード(200 kHz 以下,低電力/水晶発振)
0 1 XT モード(4 MHz 以下,水晶/セラミック発振)
1 0 HS モード(4 MHz~20 MHz,高周波水晶/セラミック発振)
1 1 RC モード(1 MHz 以下,RC 発振)
 
■1.5 PIC16F84A
◆1.5.1 仕様
構成 RISC 型ハーバードアーキテクチャ
実行速度 最大 1 命令 400 ns(分岐命令は 800 ns)
命令数 35 個.全命令 1 word.
動作電圧 2~6 V
消費電流 平均:2 mA,最小:15~30 μA
メモリ プログラムメモリ:1 kword(Flash)
データメモリ(File resistor):68 byte
不揮発データメモリ:64 byte(EEPROM)
入出力ピン 13 ポート
入力/出力個別プログラマブル
シンク電流 25 mA(max) LED 直接駆動可
発振回路 クリスタル/セラミック振動子
リセット パワーオンリセット回路内蔵
異常監視 独立発振回路のウォッチドッグタイマ内蔵
割り込み タイマ,外部端子による割り込み可
タイマ 8 bit プリスケーラ付きタイマ内蔵
動作モード アイドル時パワーダウンモード(スリープ)に設定可
価格 500 円前後
資料 PIC16F84A.pdf(英文)
PIC16F8Xj.pdf(和文)

最小構成

◆1.5.2 SFR(Special Fanction Register)
 SFRCPU の機能動作を指定したり,周辺デバイスの機能,動作を指定するためのレジスタである.PIC16F84A には以下の SFR が実装されている.

▼全 SFR
Address Bank0    Bank1 Address  
00
01
02
03
04
05
06
07
08
09
0A
0B
0C


4F
INDF
TMR0 OPTION_REG
PCL
STATUS
FSR
PORTA TRISA
PORTB TRISB
未使用 未使用
EEDATA EECON1
EEADR EECON2
PCLATH
INTCON

GPR






80
81
82
83
84
85
86
87
88
89
8A
8B
8C


CF
 
INDF 間接アドレスによるレジスタの内 容
TMR0 タイマーカウンター
OPTION_REG 各種モード設定
PCLATH プログラムカウンタの上位 5 bit
PCL プログラムカウンタの下位 8 bit
STATUS 演算結果の各種フラグ
FSR 間接アドレッシング用レジスタ
PORTA PORTA データ入出力
TRISA PORTA のモード設定
PORTB PORTB データ入出力
TRISB PORTB のモード設定
EEDATA EEPROM 用データ
EEADR EEPROM 用アドレス
EECON1 EEPROM 用制御レジスタ
EECON2 EEPROM 書込保護レジスタ
INTCON 割り込み制御

▼STATUS レジスタ
R 読み出し可能ビット
W 書き込み可能ビット
S セット可能ビット
U 使用しないビット.0 として読み出し
-n リセットでの値
IRP 間接アドレッシングでの Bank 指定ビット
 PIC16F84A では使用しないため,0 に固定する.
RP1 直接アドレッシングでの Bank 指定ビット
 PIC16F84A では RP0 のみを使用し,PR1 は 0 に固定する.
RP0 直接アドレッシングでの Bank 指定ビット
 1:Bank1 を指定.
 0:Bank0 を指定.
TO タイムアウトフラグビット
 1:電源 ON,CLRWDT または SLEEP命令実行時.
 0:ウォッチドッグタイマのタイムアウト発生時.
PD パワーダウンモード復旧フラグビット
 1:電源 ON,CLRWDT 命令実行時.
 0:SLEEP 命令実行時.
Z ゼロビット
 1:演算結果がゼロの時.
 0:演算結果がゼロでない時.
DC デジットキャリービット
 1:演算結果の下位 4 ビットからのオーバーフローが発生した時.
 0:演算結果の下位 4 ビットからのオーバーフローが発生しない時.
C キャリービット
 1:演算結果の最上位ビットからのオーバーフローが発生した時(引き算の場合は結果が正).
 0:演算結果の最上位ビットからのオーバーフローが発生しない時.

▼OPTION_REG レジスタ
R 読み出し可能ビット
W 書き込み可能ビット
S セット可能ビット
U 使用しないビット.0 として読み出し
-n リセットでの値
RBPU PORTB プルアップ抵抗イネーブルビット
 1:プルアップ抵抗を使用しない.
 0:プルアップ抵抗を使用する.
INTEDG INT ピン割り込みエッジ選択ビット
 1:RB0/INT ピンの立ち上がりエッジで割り込み.
 0:RB0/INT ピンの立ち下がりエッジで割り込み.
TOCS TMR0 のクロックソース選択ビット
 1:RA4/T0CKI ピンをクロック入力に使用.
 0:内部命令サイクルクロックを使用(CLKOUT).
TOSE TMR0 のクロックソースエッジ選択ビット
 1:RA4/T0CKI ピンの立ち下がりエッジでインクリメント.
 0:RA4/T0CKI ピンの立ち上がりエッジでインクリメント.
PSA プリスケーラー割り当てビット
 1:ウォッチドッグタイマに割り当て.
 0:TMR0 に割り当て.
PS2
PS1
PS0
プリスケーラのレート選択ビット
PS2 PS1 PS0 TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128

◆1.5.3 EEPROM(Electrically Erasable Programmable Read Only Memory)
 EEPROM は電源を切っても内容が保持されるタイプのメモリの一種であり,プログラムによって書き換えることができるものである.
 ただし,EEPROM の書き換え回数には制限があり(約 100 万回),プログラムの変数などを格納用としては不適当であり(100 万回というのは多いようであるが,プログラムの実行速度から見ればあっという間に達してしまう場合がある),変更頻度の少ないデータの格納用として使用する.なお,記憶した内容は約 40 年間保持可能である.

 PIC16F84A には 64 byte の EEPROM が搭載されている.