[第1 章]

WIZ-C と CCS-C の違い，移植の際の注意事項などを説明

FED WIZ-C と CCS-C の二つの C 言語

本書では，FED WIZ-C と CCS-C の二種類の PIC 用 C コンパイラを使って C 言語でプログラミング
しています．この章ではプログラムを作成する上での相違点，注意点などを説明します．
マイコンの開発では，開発言語とデバッグ環境の使い勝手によって，その開発効率が左右されます．
パソコンなどでは使いやすい統合開発環境が入手できますし，GNU の C 言語を始めとする各種開発
言語も利用できます．しかし，マイコンの世界では，アセンブラは経験しておかないといけませんし，
メインに C 言語を使う場合，メーカによって仕様や利用環境が異なるので，自分にあったものを見つけなければスムースに開発は進みません．
とくに，I/O を扱うことが中心となる組み込み用マイコンでは，ビット単位の入出力などの記述方法が，コンパイラによって独自になっている場合もよくあります．したがって，本書では，開発を始める前に，筆者が使いやすいと感じている WIZ-C とこの業界でよく使われる CCS-C について特徴を説明をします．
数年前まで，16F シリーズではメモリの容量が少なく，C 言語での開発よりアセンブラが利用されることが多かったと思われますが，ここにきて，メモリの容量が拡大された製品が低価格になってきているので C 言語による開発が増えていきそうです．

1-1

WIZ-C と CCS-C の概要

WIZ-C
FED
（Forest Electronic Developments）
社の C コンパイラである WIZ-C は低価格ながら，12，16 シ
リーズだけでなく 18 シリーズも含めて多くの PIC に対応しています．標準でプロジェクト機能，エ
ディタやデバッガ（ソフトウェア・シミュレータ），I/O デバイス設定機能（アプリケーション・デザイナ）などを統合した開発環境（IDE）が用意されています．
スタンダード版はフロート（浮動小数点）演算がサポートされていませんが，PIC の開発にとってそれほど不自由はないと思います．フロート演算，マルチ・プロジェクト機能（複数の PIC を連携してシミュレーション，デバッグできる）がサポートされているプロフェッショナル版もあります．本書
ではスタンダード版（STD）Ver11.05 を使用しています（図 1-1）．

1-1 WIZ-C と CCS-C の概要

17シングル・ステップ（ステップ・オーバ）・ボタン
デバッガ表示更新
レート・スライダ

ウェーブ・フォーム・アナライザ起動ボタン
リセット・ボタンシミュレータ実行ボタン

アプリケーション・デザイナ・
ボタン（表示/隠蔽）

コンパイル・ボタン

デバッガ・ウィンドウ・
レイアウト切り替えボタン
ブレーク時の経過時間表示ファイル
切り替えタブ
このボタンで切り替えシミュレーション実行時の通過回数，通過時間，マシン・コード上でのアドレスが表示される（切り替え）

プロジェクトに含まれるソース・ファイルのリスト

エディタ・ウィンドLED（シミュレーション・デバイス）ピン・アウト（シミュレーション･
デバイス）
シミュレーション時に H / L レ
ベルに応じてピンの色が変わる
ブレーク・ポイントのある行の先頭にはブルーのドットが表示される。行頭をクリックすることで設定／解除が切り替わる

仮想シリアル通信ターミナル（シミュレーション・デバイス）

ブレークした行はブルーのラインで表示される

レジスタ・ウォッチ

この変数をウォッチしている
プロジェクト・ウィンドウ

コンパイル
状況やエラ
ーなどのイ
ンフォメー
ションが表
示される

図 1-1

PIC-KEYコネクト・ボタン（ICD 使用時）

この位置（右端から一つ戻したところ）が表示間隔が最小（更新頻度が高）になる

インフォメーション・
ウィンドウ

変数，レジスタ・ウォッチ

スタック・ウォッチ

FED WIZ-C のメイン画面（WIZ-C Ver.11.05）

WIZ-C の IDE 画面の一例．いくつかのレイアウトがあらかじめプリセットされている．左側はエディタ，プロジェクト，
インフォメーションの各ウィンドウ，右半分はシミュレータ（デバッガ）ウィンドウ．この画面は第 9 章のリモート・ポート開発時のもの．

FED WIZ-C スタンダード版（1 万数千円＊）（＊ 価格は参考値）

CCS-C
CCS（Custom Computer Services）社の C コンパイラである CCS-C は，PIC の種類によりコンパイ
ラにいくつかの種類があり，それらを使い分ける必要があります．また，それらを統合してさらにプ
ロジェクト機能，エディタや ICD 用デバッガ，内蔵デバイスの初期設定機能（プロジェクト・ウィザード）などを加えた統合環境（IDE）版の PCW，PCWH という製品も存在します．本書では PCWHを使用していますが，掲載のプログラムをコンパイルする場合は PCW，PCM も使用可能です．
PCB 12 ビット・コア用 コマンドライン・コンパイラ（3 万円弱＊）

18

第 1 章 FED WIZ-C と CCS-C の二つの C 言語

Column … 1-1

PCM を使ってコマンドラインでコンパイル（CCS-C）

PCW や PCWH は高価でなかなか手が出ないかを実行しま
dows 98，ME の場合は command ）もしれませんので，比較的安価な PCM 単体でコす．これでコマンドプロンプト・ウィンドウが開

ンパイルする方法を紹介します．PCM は MPLAB

きます．

に統合して使用できるほか，単体でもコマンドラ（2）コンパイル対象のソース・ファイルがあるドイン・コンパイラとして使用できます．ここで紹

ライブ，フォルダへ移ります．

介する方法は，MPLAB も必要ありません．
第 6 章のシンプル・タイマを例にして説明します．この例では，次のようなフォルダ構造になっているものとします（[]はフォルダを示す）．

C:¥>cd CCSC_SRC¥SmpTimer［ENT］（3）コンパイルします．

C:¥CCSC_SRC¥SmpTimer¥CCSC+P

SmpTimer.c［ENT］+P はコンパイル終了時にステータス・ウィ

C:

ンドウの表示を画面に残すというコンパイル・オ[CCSC_SRC]

プションです．ほかのオプションを指定する場合[SmpTimer]
SmpTimer.c ……ソース･ファイル
CommFunc.c ……共通関数ソース･
ファイル

reg12f683.h

は，スペースで区切ってソース・ファイル名の前に並べます．オプションが多い場合は，バッチ・[Common]

ファイルを作っておくと便利です．
（4）コンパイルを始めると，Windows 上に進行……レジスタなどの具合などを示すステータス・ウィンドウが表示さ

定義ファイル

れます．コンパイル結果は生成されたファイルでも確認できます． SmpTimer.err は，エ（1）まず，コマンドプロンプトを起動します．

ラー・ステータス， SmpTimer.lst はメモ

Windows の スタート ボタンをクリックしてリやスタックの使用量とアセンブリ・リストがファイル名を指定して実行入っています．

でcmd （WinPCM 12,16 シリーズ
（14 ビット・コア）
コマンドライン・コンパイラ（3 万円弱）
PCH 18 シリーズ
（16 ビット・コア）
コマンドライン・コンパイラ（3 万円強）PCW PCB ＋ PCM ＋ IDE（統合環境）付き（6 万円強）
PCWH PCB ＋ PCM ＋ PCH ＋ IDE（統合環境）付き（7 万円程度）（＊ 価格は参考値）

コマンドライン・コンパイラとは，Windows のコマンド・プロンプトからコマンドを入力してコンパイルするタイプのことで，バッチ・ファイルや makefile を利用する人にはこちらのほうが使いやすい場合があります（Column1-1 参照）．筆者も以前は PCM で MS-DOS 版の make を使って DOS 窓からコンパイルしていました．だだし，I/O を視覚的に設定してコードを自動生成するというような機能はないので，自分でコーディングしなければなりません．
また，コマンドライン・コンパイラは MPLAB に組み込んで，MPLABのプロジェクトから使用することもできます．
各コンパイラは CCS 社の Web サイトなどからダウンロード版を直接購入すれば安価に入手できま
このアイコンは，章末に用語解説があります
1-1 WIZ-C と CCS-C の概要

19

ファイルの新規作成
ファイルを開く
ファイルの保存

図 1-2

印刷

プロジェクトを開く
PICファミリの選択

やり直し

コンパイル

エディタ・ペイン

CCS-C のメイン画面（CCS-C PCW/PCWH）

CCSC（PCW/PCWH）の IDE 画面．ICD を使用すれば IDE のデバッガ機能が使用できる．単独ではソフトウェアによるシ
ミュレーションはできない．

すが，当然ながらサポートは CCS 社から直接受けなければなりません（図 1-2）．なお CCS-C は売り切りなので，1 ヵ月を過ぎるとバージョンアップはできません（次回は新規購入になる）．

1-2

開発環境の違い● プロジェクトの新規作成
プログラムを作成し始めるときに，まずしなければならないことは I/O ポートの割り付けやその入出力の定義，TIMER や USART などの内蔵モジュールの定義，設定です．
WIZ-C や CCS-C（PCW，PCWH）には，それらをサポートする機能が用意されています．
WIZ-C
WIZ-C ではアプリケーション・デザイナと呼ばれる，アイコンのドラッグ＆ドロップで I/O ポートやPIC内蔵モジュール，ライブラリ関数を登録，設定できる使いやすいツールが標準で用意されています．
このツールの特徴は，視覚的に I/O やモジュールをピンに割り当てたり，パラメータをプロパティとして定義できるところですが，さらに，いったんプログラムを自動生成したあとでも，モジュールの追加/削除，設定値の変更などの操作ができます（Windows アプリケーションの開発言語の IDE では一般的なことだが）．アプリケーション・デザイナで加えた変更は，再コンパイルのたびに自動的

20

第 1 章 FED WIZ-C と CCS-C の二つの C 言語

シミュレーション・デバイス登録ボタン（Ver.11〜）
使用するデバイス
クロック周波数（Hz）

割り込み使用（現在選択されている
エレメントで割り込みを使用するかどうか）

このボタンは機能しないので注意．アプリケーション・デザイナのウィンドウはコンパイ
ル時に自動で閉じるが，それ以外はメイン画
面のアプリケーション・デザイナ・ボタンで隠蔽（背面へ移動）することができる

コンパイル・
ボタン．コン
パイル直前に設定内容がソース・ファイルに反映される
デバイス変更
ボタン

ドラッグ＆
ドロップ

エレメントの
プロパティ

ほとんどの場合，エレメントの登録順序は関係な
い．I/Oポートは一つのポートにつき一つのエレメントの登録が必要

Element Storeペイン．
登録済みのエレメントが列挙される．エレメント・アイコンをクリックすると，カレント・エレメントに選択され，Pin Out
ペインやプロパティの表示が切り替わる

図 1-3

Pin Outペイン．
現在選択されているエレメントの結線状態や結線済みのピンなどが表示される

ブルーで表示されるピンはエレメントがリン
ク（接続）されていることを示す

WIZ-C のアプリケーション・デザイナ画面（WIZ-C Ver.11.05）

デバイスや I/O を視覚的に設定できる WIZ-C の標準ツール．Ver.11 ではシミュレーション・デバイスがワンタッチで登録できるボタンが追加されたため，キーパッドや LCD の登録が非常に便利になった．

にソース・ファイルに反映されます（図 1-3）．
CCS-C（PCW，PCWH）
CCS-C では，プロジェクト・ウィザード（PIC ウィザード）と呼ばれるキック・スタート用のツールが用意されています．これは，新規プロジェクト作成時に I/O やモジュールを定義するツールで，プログラムのテンプレート（雛型）を作成してくれます．モジュールやそれに関する初期化ルーチンも自動で組み込まれます．
このプロジェクト・ウィザードは，WIZ-C のアプリケーション・デザイナと違い，最初にコードを生成してくれるだけで，いったん確定すると，それ以降の変更はソース・ファイルを自分で書き換
1-2 開発環境の違い

21

デバイス選択プロジェクトのあるフォルダと
ソース･ファイル名が表示される

アドレス・ビット幅

クロック周波数

すべてのRAM領域が使用できるようにするには，16ビットにしておく必要がある

クロック・タイプ

コンフィギュレーション・
ビット

プレビュ・ボタン．
現在の設定がソース・ファイ
ルにどのように展開されるかをプレビュできる

コンフィギュレーション・ビットの設定内容はソース・ファイルと同名のヘッダー・ファイル（*.h）に書き出されるページ（設定項目）切り替えタブ

図 1-4

CCS-C の PIC ウィザード（CCS-C PCW/PCWH）

PCW または PCWH の IDE から呼び出されるウィザードの表示例． OK ボタンを押して確定させた後は変更できないので注意（手作業で修正が必要）．手修正の際は仮のプロジェクトを作って，修正した内容をプレビュ表示させ，その内容をコピーしてソース・ファイルに貼り付ければよい．

えるか，新規にプロジェクトを作成し直さなければなりません．なお，既存のプロジェクト名（ファイル）を指定して新規作成すると，既存のソース・ファイルが上書きされてしまうので注意してください（図 1-4）．

● デバッガ/シミュレータ
WIZ-C
WIZ-C には使いやすいソフトウェア・シミュレータが内蔵されています．これは，シミュレー
ション・デバイス（External Device）を使ったシミュレータで，パソコン上の仮想 PIC で動作する仮22

第 1 章 FED WIZ-C と CCS-C の二つの C 言語

想デバイスが，実機が動いているようにパソコンの画面上で動きます．このデバイスには LED をはじめ，7 セグメント LED，LCD（液晶表示器），4 × 4 キーパッド，仮想ターミナル（仮想 PIC とシリアル通信を模擬）などがあります．場合によってはこれだけで PIC にプログラムを書き込む前にデバッ
グが終わります（図 1-1 の右側参照）．
また，出力ポートの状態をロジック・アナライザのようにグラフ上に表示させるツール（Waveform Analiser）
も標準で付属しているので，シミュレーション実行した後に出力状態を確認し，パルス幅を測定するというようなこともできます（図 9-9 参照）．
WIZ-C では ICD（In-Circuit Debugger）として PIC-KEY が使用できます．これは PIC プログラマ（ICSP ； In-Circuit Serial Programming）
としても使用できます．PIC-KEY については第 11 章で説明します（写真 11-1 参照）．
CCS-C
他方，CCS-C の場合は C 言語ソース・レベルで動くシミュレータは内蔵されていません．MPLABを併用してアセンブラ・ソース・レベルでシミュレートしなければなりません．
ICD を使えばデバッガが使えます．その場合はマイクロチップ社純正か CCS 社の ICD を使用します．PIC-KEY は使用できません．CCS のデバッガ ICD-U40 については，第 11 章で説明します（写真11-2 参照）．

1-3

プログラムの構造，言語仕様上の違い● 自動生成されるテンプレート・ファイル
WIZ-C はアプリケーション・デザイナ，CCS-C（PCW，PCWH）ではプロジェクト（PIC）ウィザー
ドを使用すれば，テンプレート（雛型）
ファイルが自動で生成されます．
WIZ-C
WIZ-C ではアプリケーション・デザイナを使用する場合，プロジェクト新規作成時に xxx_
main.c と xxx_user.c という二つのファイルが自動生成されます． xxx の部分にはプロ
ジェクト名が入ります． xxx_main.c には main 関数と割り込みルーチンが作られますが，ユーザは通常は xxx_main.c のほうには手を加えることはありません． main 関数からはUserLoop 関数，割り込みルーチンからは UserInterrupt 関数がコールされるようになっていて，この二つの関数は xxx_user.c のほうに作られます．
ユーザは，これらの関数の中に処理を追加していきます．UserLoop 関数は main 関数の無限ルー（＊）
プの中からコールされているため，UserLoop 関数の中で処理をループさせる必要はありません．
なお，アプリケーション・デザイナを使う設定になっている場合は， xxx_main.c のほうはコンパイルのたびに上書きされるため，修正を加えても無効になります．修正したい場合はアプリ（＊）プログラムの説明でメイン・ループと表現している場合があるが，WIZ-C の場合，とくに注記がない場合はユーを指す．読み替えてください．
ザ・ループ（UserLoop）

1-3 プログラムの構造，言語仕様上の違い

23

ケーション・デザイナを OFF に切り替えてから修正します．
CCS-C
CCS-C ではプロジェクトの新規作成時に生成される xxx.c ファイルの中に main 関数とブランクの割り込みルーチンが作られます．ウィザードで設定している場合は設定に応じて main 関数の中に内蔵デバイスの初期化処理や I/O ポートの初期化処理などが自動で展開されます．ユーザはこの main 関数や割り込みルーチンの中に処理を追加していくことになります．
ウィザードで厳密に設定しなくても，PIC 種別，クロック周波数やコンフィギュレーション・ビッ
トなどを大雑把に設定しておいて，後から自分でソース・ファイルに処理を加えたり，修正していってもかまいません．

● 文字の扱い
WIZ-C
WIZ-C では標準で大文字，小文字を区別します．オプションで区別なしにも設定できます．コメントに日本語を使う場合は文字コードにユニコードが使われます．ほかのテキスト・エディタでソース・ファイルを閲覧，編集する場合はユニコードに対応したものが必要です．
また，コメント内の日本語で一部の文字がコンパイル・エラーを引き起こすものがあります．筆者が認識しているものを挙げておきますので，WIZ-C ではこの文字は使わないようにしてください（文脈によってはエラーにならない場合もある）．なお，原因がわからないコンパイル・エラーがある場
合は日本語文字を疑ってみてください．
「最」，「上」，漢数字の「一」，「言」
たとえば，「最上位」，「一致」，「宣言」などがだめです．最初の頃はこれでたいぶ泣かされました．
CCS-C
CCS-C ではデフォルトでは英文字の大文字，小文字を区別しません．BASIC などと違い，通常のC コンパイラは区別があるのが普通なので，プログラムを移植する際などに，大文字と小文字で区別しているような変数名，関数名がある場合は注意してください．

● 型（データ・タイプ）の違い
WIZ-C のスタンダード版は float が使えません（プロフェッショナル版では使用可）．
CCS-C は比較的高価なだけあって，標準で float（浮動小数点）が使えます．CCS-C の最初の頃は
long（32 ビット整数）がなかったのですが，Ver3 から追加されました．
その他，注意しなければならないのが，short です．CCS-C の short は 1 ビットですが，WIZC を含む通常のコンパイラでは short は 8 ビット（32 ビット・プロセッサの場合は 16 ビット）です．
CCS-C で普通の short int のつもりでうっかり short を使うとなかなか気づかないバグに悩まされることになります．short は混乱を避けるためにも使用しないほうがよいでしょう．型の対比

24

第 1 章 FED WIZ-C と CCS-C の二つの C 言語

表 1-1

主なデータ・タイプ（型，同じ型名でも WIZ-C と CCS-C でビット幅が違うものがあるので注意）

主なデータ・タイプ（型）

int
short
char
long
bit
int1
int8
int16
int32
float
BYTE ＊
WORD ＊

表現できる数値範囲

FED WIZ-C［ビット］（Ver.11 STD 版）

CCS-C［ビット］

データ長
［ビット］

signed16

88− 128 〜 127

0 〜 2558

1

16− 32,768 〜 32,767

0 〜 65,535

32− 2,147,483,648 〜 2,147,483,647

0 〜 4,294,967,295

8

8

32

16

1

−

−

1

−

8

−

16

−

32

−

32 浮動小数点8（unsigned）−

16（unsigned）−

unsigned＊ typedef で定義されているもの

は表 1-1 のようになります．

● CCS-C の関数の引数，ポインタの制約
CCS-C では，関数の引数やポインタに特殊な仕様があるので注意が必要です．
関数の引数でリテラル（定数）のポインタを渡せません．たとえば，次のような場合です．
void LCDString(char *str);というような関数がある場合，
LCDString("test");// × CCS-C○ WIZ-C

は，CCS-C ではコンパイル・エラーとなります．ROM 上にあるものがポインタで参照できないということです．C 言語の仕様としては規格外れですが，PIC では仕方がないのかもしれません（WIZ-C
では問題なし）．ただし，printf などの引数の中にはリテラルを含められます．
printf("%02d", val);// ○ CCS-C○ WIZ-C

strcpy(buf, "1234");// ○ CCS-C○ WIZ-C

また，ポインタの定義についても特殊な仕様があります．普通の C 言語では，初期値付きの変数は次のように定義できますが，CCS-C ではエラーになります．
char *Msg = "Hello";// × CCS-C○ WIZ-C

これは，次のように定義する必要があります．
char Msg[] = "Hello";
また，LCD の出力に lcd_putc という組み込み関数がありますが，
lcd_putc('a');// 1 文字の出力

この関数は，次のようにすれば文字列を出力することができます．
lcd_putc("bcd");// 文字列の出力

これもおかしなものですが，実際はコンパイラが次のように展開します．
lcd_putc('b');lcd_putc('c');

1-3 プログラムの構造，言語仕様上の違い

25

Column … 1-2

割り込みとその要因

割り込みとは，文字通り本来の処理に割り込ん

割り込みルーチンを抜けた後に再び割り込みが発で処理することで，一般には緊急度の高い処理を生し，これを永遠に繰り返して通常処理に戻らな

実行させますが，場合によっては発生頻度の低い

い，というようなことも起こります．他方，シリ（めったに起こらない）
処理に利用するという使い

アル・データの受信割り込みでは，受信データを方もあります．
割り込み処理は通常の処理からは独立したものになっていて，通常処理側はいつ割り込みが発生するかはわかりません．ただ，通常処理中に割り

RCREG から取り出すことで RCIF がクリアされるため，直接 RCIF をクリアする必要はないというものもあります．
なお，I2C モジュール使用時の＿
SSP

割り込み

込まれたくない場合は，あるプログラム区間を割など，同じ要因フラグでも状況により意味が変わ

り込み禁止にすることができます．XXIE フラグ

るものもあります．たとえば，SSPIF は I2C の通をクリアしておくと特定の要因に対する割り込み

信状況に応じてストップ・コンディション発行完を禁止することができます．ただし，禁止された

了，ACK 受信完了など違った意味でセットされ要因そのものでは割り込みは発生しませんが，要ます．

因フラグの XXIF はセットされていることがあ

WIZ-C の場合はこのような要因の特定，要因

る，ということに注意してください． INTCON

フラグのクリアなどの処理は，ユーザがプログラの GIE をクリアしておくとすべての割り込みをミングする必要があります．CCS-C の場合はコ一括して禁止/許可することもできます（グローバ

ンパイラが自動で要因を特定してそれに応じた割

ルな割り込みの禁止/許可）．

り込みルーチンへジャンプし，要因フラグは自動● 割り込み要因でクリアされるようになっています．

割り込みは，複数の要因が OR された結果としどちらが優れているとはいえませんが，WIZ-Cて発生します（複数のうちのいずれかの要因が発の方法はプログラムの手間はかかりますが，自由生したら割り込みが発生）．したがって，複数の度が高いということはいえるでしょう．

要因が同時に発生しても起こるのは一つ※の割り● おもな割り込みの種類

込みだけです．
そこで割り込みルーチンでは，まず初めにどの要因の割り込みが発生しているかを特定しなければなりません．また，割り込み要因によっては，

次に，おもな割り込みの種類を示します．デバイスによっては実装されていないものもあります．
◆ タイマ（カウンタ）のオーバフロー，

比較一致

割り込みを受け付けたことを PIC の割り込み回路◆ CCP の比較一致，キャプチャ完了

へ知らせるために，明示的に要因フラグをクリア◆ RB0 の外部割り込みする必要があります．クリアするのを忘れると，◆ RB3 〜 RB7 の状態変化◆ シリアル通信の 1 バイト送受信完了（※）18 シリーズでは高優先と低優先の二つの割り込
み種別があるため，割り込みルーチンも二つもてる．また，要因ごとに高優先にするか低優先にするかを選択できる．

26

第 1 章 FED WIZ-C と CCS-C の二つの C 言語

◆ SSP(I2C，SPI)の各種動作完了◆ A-D 変換完了
◆ データ EEPROM 書き込み完了◆ その他

lcd_putc('d');このように展開してくれるのは，この lcd_putc だけのようです．

● 割り込み処理の記述方法の違い
WIZ-C
WIZ-C の場合は割り込み発生時は UserInterrupt 関数が呼び出されるだけなので，その中で割り込み要因を自分で判断し，場合によってはその要因フラグをクリアしてやらなければなりません（割り込みの復帰処理は自動で組み込まれる）．
WIZ-C には割り込みの種別に「クイック割り込み」と「通常割り込み」の 2 種類ありますが，アプリ
ケーション・デザイナを使う場合はクイック割り込みに固定されています．両者の違いは割り込み発
生時/終了時に退避/復帰させるレジスタやワーク・エリアの数の違いで，クイック割り込みのほうが退避/復帰数が少なく，オーバヘッドが小さくなります（処理速度が向上）．
その代わりに，割り込み処理の中で実行できることに制限がでます．処理できるのは単純なビット演算や加減算，比較などに制限されます（剰余算など不可）．ローカル変数の使用や C 言語の関数の呼び出しはできない（アセンブラで作成した関数は可）とされていますが，実際には使用できる場合もあります．ただ，たまたま動いているだけかもしれないので，使わないようにしたほうがよいでしょう．
処理が複雑になる場合は，通常割り込みを使用してください．第 3 章のイルミネータ（拡張版），第9 章のリモート・ポートでは，通常割り込みを使用しています．
CCS-C
CCS-C の場合は，割り込み要因ごとのプリプロセッサ（#int_XXX）の直後に書かれた関数がその要因に対する割り込みルーチンとなります．割り込み要因ごとに分かれた関数がコールされるように

Column … 1-3

WIZ-C の割り込みタイプの変更方法

WIZ-C でアプリケーション・デザイナを使用（3） xxx_main.c の Interrupt 関数のしている場合は，割り込みタイプはクイック割り直前にあるステートメントを次のように修正し込みに固定されています．これを，通常割り込み

ます．

に変更する手順を説明します．
（1）アプリケーション・デザイナで一通り設定が終わったら，一度（Generate Application）
でコンパイルします．

const int QuickInt=1;→ const int NormalInt=1;（4）最後にコンパイルし直します．
なお，再びアプリケーション・デザイナを ON（2）メイン画面に戻り，メニューの Project -にしてコンパイルすると，この変更は元に戻ってUse Application Designer をクリックして同項しまうので注意してください．その場合は，もう目のチェックを外し，アプリケーション・デザイ

一度同じ作業が必要です．

ナを使用しないように設定します．

1-3 プログラムの構造，言語仕様上の違い

27

なります．要因フラグ（XXIF）のクリアは不要です．
WIZ-C のほうが多少面倒ですが，割り込みの順序や複数の割り込みが関係するような処理を作るときは WIZ-C のほうが自由度があって都合がよい場合もあります．なお，
CCS-C にも同等の機能が用意されています．
PIC の割り込みで注意すべきことがあります．それは特定の要因の割り込みを個別にプログラムの中で許可，禁止する場合に起こることです．PIC の場合，xxIE フラグを 0 に設定して割り込みが発生しないように設定したつもりでも，割り込みの起動がかからないだけで，xxIF はセットされていることがあります．この状態で，ほかの要因の割り込みが発生すると，xxIE でマスクしたはずのxxIF の処理が動いてしまいます．
たとえば，TIMER0 は割り込みを禁止（TMR0IE=0）していてもオーバフローするたびに TMR0IF
がセットされます．リセットしない限りセットされたままになるので，TIMER0 の割り込み処理で要因の判断に TMR0IF だけをチェックしていると，ほかの要因の割り込みが発生した際に TIMER0の割り込み処理が誤って動いてしまいます．
これを防止するには，要因のチェック時に xxIF だけでなく，xxIE もセットされているかを調べる必要があります．気が付きにくい問題なので，おかしいと思ったときにはチェックしてみてください．グローバル（一括）で許可/禁止する場合は問題ありません．なお，CCS-C の現在のバージョンではこの問題はありません．

● EEPROM の書き込みの違い（ライブラリ）WIZ-C，CCS-C ともに PIC に内蔵されている EEPROM の読み書きができるライブラリ関数が用意されていますが，書き込みの処理に相違があります．
WIZ-C
WIZ-C の WriteEEData は，EEPROM へ書き込んでも書き込みの終了は待たずに関数を抜けます．EEPROM の書き込みには数 ms かかるので，続けて書き込もうとすると直前の書き込みが終了していないため書き込みは失敗します．
CCS-C
CCS-C の write_eeprom は書き込みが完了するまで先に進まないため，続けて書き込んでも書き込みに失敗することはありません．
使うときには少し注意が必要ですが， read_eeprom ， write_eeprom はマクロなので，多用するとプログラム量が増大します．多用する場合は別に関数を作って，その中で

read_eeprom ， write_eeprom をコールするようすればよいでしょう．
一見，WIZ-C のほうが使いにくいように見えますが，書き込みの完了を待たないということはその次の処理（EEPROM の書き込み以外の処理）にすぐ移れるということです．
CCS-C の場合は書き込みが完了するまで数 ms の間，ほかの処理ができません．本書で今28

第 1 章 FED WIZ-C と CCS-C の二つの C 言語

回掲載したプログラムでは WIZ-C でも書き込みを完了するまでは次の処理に移らないように簡易的な作りになっていますが，全体の処理効率を上げたい場合は，この数 ms のむだ
時間が問題になる場合もあります．とくに書き込むバイト数が多い場合はなおのことです．
この場合は 1 バイトのデータを書き込んだら，メイン・ループまたは割り込み処理でそのデータの書き込み完了を検知して，次のデータを書き込むという処理が必要です．こういう用途には CCS-C の write_eeprom は使用できないので，独自に関数を作成しなけ
ればなりません．

● インライン・アセンブラ
C 言語の中にアセンブリ・コードを記述することができます．WIZ-C と CCS-C では記述方法に違いがあるので注意してください．また，コメントの付け方にも注意してください．

Column … 1-4

WIZ-C のライブラリ拡張

標準のインストールをしただけでは，WIZ-C（2）WIZ-C を立ち上げてメニューから File -の一部のライブラリはインストールされません

Libraries をクリックします．図 1-A のような

（WIZ-C Ver.11 以前）．本書でも使用しているウィンドウが表示されるので， 14 Bit Core のatoi はその一つです．そのため拡張ライブ

ページを表示させた上で Add ボタンをクリッ

ラリをあらかじめインストールしておかなければクし，追加したいライブラリ・ファイル（ *.c ）

なりません
（製品に付属）．

を選択します．本書では stdlib.c を追加

追加の手順を次に示します．
（ 1） WIZ-C の セ ッ ト ア ッ プ CD-ROM か ら
Library Extensions をインストールします．

しています．WIZ-C が C ドライブの標準的な位置にインストールされている場合は，ライブラリ・
ファイルは C:¥Program

Files¥FED¥

PIXIE¥Libs にあります．
（3）16 ビット版
（18Fxxx など）でも使用する場合
は， 16 Bit Core のページでも同様の操作でライブラリを追加します．ライブラリによっては
14 ビット版と 16 ビット版の二つが供給されている場合があります．そのときは，対応するページにそれぞれ追加してください．16 ビット版はxxx16.c というファイル名になっています．
（4）最後に OK をクリックしてウィンドウを閉
じます．

図 1-A

ライブラリの追加画面

ライブラリを追加するためのウィンドウ．14 ビット，
16 ビットそれぞれのシートに必要に応じてライブラ
リ・ソース・ファイル（*.c）
を追加する．

なお，Ver.12 からは，標準的なライブラリはすでに登録されているので，あらためて登録する
必要はありません．

1-3 プログラムの構造，言語仕様上の違い

29

WIZ-C// 複数行#asm
NOP; no operation

CLRWDT// clear WDT#asmend#asmline NOP// no operation(単一行)#asmline CLRWDT// clear WDT(単一行)

pragma は省略しています．
CCS-C// 複数行#asm
NOP// no operation

CLRWDT// clear WDT#endasm
CCS-C の場合，コメントの開始にアセンブラのようなセミコロン ; は使用できません．

● WIZ-C の Occurrence（イベント・ハンドラ）
WIZ-C では，エレメントによっては Occurrence と呼ばれるイベント処理が実装できます．たとえば，シリアル通信でデータを受信したときに Occurrence 関数がコールされるというものです．キーパッドの場合はキーが押されたときにそれに応じた Occurrence 関数がコールされます．
この Occurrence 関数は，いわゆるイベント・ハンドラと呼ばれるものです．このような処理は
割り込み処理などでフラグを立てて，それをメイン・ループでチェックするようなことで独自に作ることも容易ですが，アプリケーション・デザイナを使用すればこのしくみが main 関数の中に自動で組み込まれ，ユーザ・プログラムから分離・隠蔽されるため，ユーザ・プログラムではOccurrence 関数を記述するだけで済むという，プログラム的にすっきりしたものになります．
場合によっては UserLoop 関数は空で Occurrence 関数だけでプログラムができあがるというケースもあります．
この Occurrence を使うかどうかの設定（Occurrence が発生したときコールされる関数の登録）は，アプリケーション・デザイナで行えます．

● WIZ-C のスタック
WIZ-C は一般的な C 言語のようにオプションでスタック・エリアを RAM 上に確保することができます．そのため，12，16 シリーズの PIC がもつスタックの 8 レベルを超えたスタック・エリアを使うこともできます．その代償としてスタック用のメモリ・エリアが必要になるのと，その PUSH-POP
処理に伴うオーバヘッド（プログラムの増加や処理速度の低下）が発生します．デフォルトでは PIC 内
蔵のスタックを使用するようになっています．
なお，アプリケーション・デザイナを使用して作成したプログラムは， main 関数から User

30

第 1 章 FED WIZ-C と CCS-C の二つの C 言語

Loop 関数をコールした時点でスタックを 1 レベル消費しているので注意してください．

1-4

エレメント，ライブラリの比較

WIZ-C
WIZ-C のライブラリ関数は，アプリケーション・デザイナによりエレメントの一部として使用されます．一つのエレメントには複数のライブラリ関数を含んでいるものもあります．たとえば，
EEPROM エレメントは WriteEEData ， ReadEEData の二つのライブラリ関数を含んでいます．アプリケーション・デザイナを使用しない場合は，ライブラリ関数として直接使用することもできます．
WIZ-C は現行バージョン（Ver.11.05）ではアナログ・コンパレータ関係のものが皆無なので，使用する場合は自分でレジスタを操作しなければなりません．また，シミュレーションもできません．本書ではアナログ・コンパレータは使用していませんが，PIC16F648A ではリセット直後はアナログ・
コンパレータが ON になっているため，PORTA をディジタル I/O ポートとして使用する場合には，コンパレータを OFF にしなければなりません．
このために，UserInitialise 関数の初めに CMCON=7; というコードを入れていますが，第 5 章のシリアル端末では，main 関数で先に LCD の初期化処理が実行された後に UserInitia

lise 関数が実行されるため，LCDの初期化が失敗します（PORTAがまだアナログ入力のままのため）．
そこで 16F648A 用にアナログ・コンパレータを OFF するエレメントを作成しました．このエレメン
トは一番最後に登録してください．16F877A の場合は初期状態がコンパレータ OFF となっているので，使わないときは何もする必要はありません（ADC ピンをディジタル I/O に設定する処理は必要）．
PIC 内蔵のモジュール（TIMER や CCP，ADC，USART など）もエレメントという形で登録します．
エレメントを登録するとそれに必要なヘッダー・ファイルなどは自動的にインクルードされます．また，内蔵モジュールを使用するためのライブラリ関数も使用できるようになります．
LCD エレメントの DB7 〜 DB（データ）
信号は上位 4 ビット（b7 〜 b4）にアサインするという制限は4ありますが，PORTB 〜 PORTD のどのポートにもアサインできます．また， RS ， E ， RW の制御信号は，任意のポートにアサインできます．キーパッド・エレメントは 4 × 4 の範囲で任意の行，

Column … 1-5

WIZ-C のスタック・オプションの変更

WIZ-C では，標準環境では PIC 内蔵のスタックを使用するようになっていますが，オプションでクリックして Compiler Options for xxx ダイア
ログ・ボックスを開きます．

RAM エリア上にスタック・エリアをもたせて， （2） Optimisations のページで Use PIC Call
スタック・サイズを増やすことができます．そのStack のチェックを外します．

手順を説明します．

（3）最後にコンパイルし直します．

（1）メニューで Project - Project Options を

1-4 エレメント，ライブラリの比較

31