画像をクリックすると拡大表示されます。
拡大画像からはブラウザの「←戻る」ボタンで戻ってください。
私が趣味でマイクロコンピューターを使って何かを作る場合、現在、殆どPIC16F876を使っています。
その他、時々、オークス電子のM16ボード、秋月電子のSH2 7045ボードを使います。
PICは試作に便利なDIPパッケージの品種が多く、秋月電子から安く、簡単に入手出来ます。
書籍や情報、資料も多く、安心感があります。
CCSコンパイラも組み込み関数が多く、便利でした。
尚、仕事では現在、H8と東芝のTLCS870Cを使用した物件を依頼されています。
こちらは純正のツールやデバッガーを、お客様から借用しています。
私が初めてPICを手にしたとき、既にAVRも出ていました。
PICを使うかAVRを使うか悩んだ記憶があります。
PICは癖の有るアーキテクチャですが、後から出たAVRは欠点も改善され、使い易くなっているという話でした。
ただし、当時、田舎ではAVRは手に入りません。
さらに、初期のAVRはクロック発生回路の違いで同一のCPUに3種類のチップが存在すると書かれていました。
PICではクロック発生方式がプログラム出来るようです。(これは何年も前の話で、今では常識ですが。)
決め手となったのは、秋月電子がPICを扱っていて、田舎でも、通信販売で手に入るという事です。
ついでにPICプログラマーも購入し、こちらも便利に使用しています。
一旦、PICに慣れてしまうとAVRを使ってみようと言う気もおこらず、現在に至っています。
その後、PICもAVRも進化しましたが、後発の有利さから、性能的にはAVRが一歩進んでいたようです。
ただし、PICは品種の豊富さと入手性の良さが欠点を補っていました。
現在ではPICも16ビットのPIC24FやDSPICが簡単に手にはいるので、こちらを使えば性能的にも
AVRを越えると思います。
今までPIC16FとCCSCコンパイラを使ってきましたが、新しいチップが次々に発表され、バージョンの古い
CCSCでは対応出来なくなってきた事が原因の一つです。
CCSCでは基本的にバージョンアップが出来ず、新しいバージョンを購入するしかありません。
何とかCCSCを止める方法が無いかと考えました。
PIC18FにすればマイクロチップのC18コンパイラの評価版が使えます。
C18を使えば今後使うであろうPIC24FのC30コンパイラを使うときもスムースに入り込めると思いました。
最初からPIC24Fにする手もありますが、個人的な用途ではPIC18Fで十分であるし、現時点では
使い易いと考えました。
PIC24は電源電圧が3.3Vということ、データEEPROMが付いていないのが、やや使いにくいと思います。
ただ、PIC24Fも一部のチップは趣味でコレクションしています。
PIC16FとPIC18Fを比較した場合、ハード的にも進化が見られます。
PIC16Fはメモリが少なく、メモリ不足になる事がありました。
さらに、プログラムメモリが4つのバンクに分かれているので、バンク毎に余りが発生し、プログラムの構造が合わないと、
メモリが余っているのに入らないという現象が発生しました。
ハードウエアスタックも8レベルで余裕がありません。
PIC18Fではプログラムメモリのバンクが無くなり、メモリ量も多い品種があるので、この点有利です。
その他、周辺機能の細部や消費電力の面でも改善されています。
PIC18Fが出た後、新品種はPIC18Fに移行すると思ったのですが、その後もPIC16Fの新品種が
出続け、秋月でも、扱っている品種の多くはPIC16Fです。
参考書もPIC16Fを扱った物が多く、最近ではPIC24FやDSPICの参考書が目に付きますがPIC18F
を扱ったものは少ないです。
後閑氏の出している書籍も基本的にCCSCを使っているので、C18の具体的な使い方は説明がありません。
ただ、「PICで楽しむUSB機器」はC18で説明されています。
これは、マイクロチップのUSBライブラリーを使うため、C18が必須であるためです。
CQ出版社が出している「PICマイコンのインターフェース101」はC18で説明されているので、お勧めです。
この書籍に付属しているCDにはMPLAB7.60とC18の評価版が収録されているるのでダウンロードの
手間が省けます。
追補) その後、後閑氏の出しているPIC18Fの参考書が改訂され、コンパイラをC18に変更して説明されています。
PIC18FにはUSBやLANなど、他のシリーズに無い周辺機能を持った物が存在します。
パッケージの種類も豊富ですが、8PIN、6PINと言った小さな物が無く、最も小さな物が18ピンです。
秋月で扱っている種類も現状では少ないので、もう少し増やして欲しいところです。
価格は16Fに比べ、少し高いのですが、性能アップを考えれば安いと思います。
使い方は、むしろ易しくなっていると思います。
前述の書籍「PICマイコンのインターフェース101」に付属していたものをインストールしました。
マイクロチップのウエブサイトからもダウンロード出来るようです。
MPLAB、C18の順でインストールします。
インストールはXPのノートパソコンに行いましたが、特に問題はありません。
ただ、C18をインストールするとき、環境変数を書き換えるか聞いてきました。
私は書き換えてしまったのですが、コマンドラインで操作しなければ書き換えなくても良いような気もします。
ここら辺は良く判りませんが、とにかく無事に動いています。
開発環境であるMPLABは頻繁にバージョンアップされるので、使い方に戸惑います。
今まで秋月のライターを使っていましたがPIC18Fに関しては対応が悪いです。
今後、使うであろうPIC24Fの書き込みも考えて純正のICD2を購入しました。
ACアダプタ無しで27000円と結構、高価です。
今までデバッガー無しで苦労していましたが、これでインサーキットデバッグも出来るようになりました。
ただし、インサーキットデバッグする為にはターゲットボードに6ピンのモジュラージャックを付けなければなりません。
それでは不便なので、ストレートの基板コネクタに変換するケーブルを作りました。(左端)
それにしても、丸くて派手な塗装は目立ちますが、慣れれば気にならなくなります。
丸い形状も角が無い分、とり回しが良いようです。
ある人は「浅田飴」と言っていました。
先にMPLABがインストールされている必要があります。
バージョンが古いと動作しない可能性があります。
ICD2とPCをUSBケーブルで接続すると新しいハードウエアと認識され、ドライバーの場所を聞いてきます。
このとき必ずドライバーの場所を指定します。
場所はMPLAB IDEのサブフォルダICD2¥Driversにあります。
フォルダ名称はMPLABのバージョン等で多少、変わっている可能性があります。
実験用の簡単な基板等で、デバッグ用のコネクタを付けるのが面倒な事が有ります。
そこでチップに直接書き込む為のアダプタを作りました。
ICD2のACアダプタを購入しなかった為、チップの電源はアダプタ側で用意しました。
電源はオークス電子のM16開発セットに付属していた9V500mAのACアダプタを流用しました。
このACアダプタは無負荷では12V以上の電圧が出ます。
結線図
とりあえずコンパイラやデバッガーの動作を確認するために基板を試作しました。
まず、キャラクタ液晶に文字を表示するだけのテストプログラムを作ってみます。
この基板は、後で換気扇のコントローラとして使うためにサーミスタやスイッチ、SSRが接続されるように
なっていますが、今回はキャラクタ液晶のみを使います。
CPUは18ピンのPIC18F1320を使いました。
インサーキットデバッグ用のコネクタも付けてあります。
回路図
テストプログラムは液晶の1行目に”POWER ON”と2秒間表示し、2秒間消去。
次に液晶の2行目に”POWER OFF”と2秒間表示し、2秒間消去。
上記を無限に繰り返します。
簡単な内容ですが、コンパイラやデバッガーの操作方法や動作は確認出来ると思います。
左はそのときのプロジェクトの内容です。
ファームウエアのダウンロード (ZIP圧縮されています。)
注)コンパイラのバージョンにより、プロジェクトに若干の変更が必要になります。
複数のソースファイルで参照する定数、変数、関数の宣言、型指定等は、まとめて、ここに記述してあります。
デバイス定義のヘッダや標準ライブラリーのヘッダは、この中でインクルードされています。
従って各ソースファイルでは必ずglobal.hをインクルードします。
PIC18FはPIC16Fに比べ、コンフィグレーションが複雑になりました。
ここではPIC18F1320に関するコンフィグレーションを記述しています。
コンフィグレーションの詳細を品種毎に説明したPDFファイルがマイクロチップサイトからダウンロード
出来るので参考にします。
2011年2月現在、チップ別のコンフィギュレーションの詳細説明はMPLABの最新版 v8.63 の
ヘルプファイルに組み込まれています。
今まで、コンフィギュレーションを説明していたPDFファイルは廃止されました。
私の場合は書籍の付録CDに収録されていたものを利用しました。
尚、このようにプログラムで書き込まなくても、ICD2で個別に書き込む事も出来ます。
C18には1mS単位のディレー関数が無いので作成しました。
ただし、時間には上限があって、クロック8MHzでは最大1280mS、クロック40MHzでは最大250mS
となります。
引数は符号無し16ビットですが、大きい数値を入力しても最大値で飽和します。
内部でサイクルタイム基準のライブラリーディレー関数を使っているので、global.h 内で delays.h を
インクルードしています。
global.h 内で定数 CONFIG_MHZ に値(クロック周波数)を入れているので、この値により関数は条件コンパイル
されます。
定数の値は4、8、10、16、20、24,32,40、48が選べます。
値が入力されていなかったり、これ以外の値の時は8MHzに固定されます。
一般的なキャラクタ液晶表示用のライブラリーとして作成しました。
16文字2行のものか20文字4行のキャラクタ液晶表示器が使えます。
PICのポートの下位4ビットに接続します。
R/Wの制御線は使わず、W固定です。
ポートと制御線の位置は global.h 内で定義してあります。
PICの特徴として、ROMとRAMが別空間にあります。
文字列を表示するとき、表示データがRAMにある場合とROMにある場合があります。
この両者ではポインタに互換性がありません。
このため、文字列表示の関数を2種類、作成しました。
別の方法として、ROM内のデータを一旦、RAMにコピーしてから表示する方法もあると思います。
今回はROM内の文字列定数を表示する関数を使用しました。
簡単なメイン関数です。
リンカーの動作を制御するスクリプトファイルで、チップの種類毎にあります。
予め、用意されているので、プロジェクトに追加するだけですが、収納場所にパスを通しておく必要があります。
標準ライブラリーのヘッダファイルもパスを通しておく必要があります。
これらをプロジェクトフォルダにコピーして、ユーザー定義のヘッダーファイルとしても動作するとは思いますが。
尚、リンクスクリプトファイルには名前の最後にiの付くものと付かないものがあります。
ICD2でデバッグするときはiの付く方を使います。
デバッガが多少、メモリを消費するため、メモリ配置が若干異なる為です。
C18の新しいバージョン(現時点でVer3.31)ではスクリプトファイルは一つにまとめられているようです。
ファイル名は 18f1320_g.lkr となっていました。
PIC18F1320はRAMが256バイトです。
デホルトのデータセグメントは上位128バイトにあり、半分をソフトウエアスタック、10バイト程度をICD2が
使用するので、スタティック変数として確保出来るのは残り48バイト程度です。
デバッグ終了後、リンクスクリプトをi無しの物に変更すれば、デバッガの分は増やすことが出来ると思います。
下位128バイト(アクセスバンク)の方はシステム的に僅かな量を使っている様ですが、大部分は未使用です。
デホルトのデータセグメントでは、この部分をアクセス出来ませんが、データセグメントをアクセスバンクに変更すれば、
メモリを確保出来るようです。
ただ、この部分を使って良いかどうか判断出来ません。
一部のライブラリー関数がバッファとして、この部分を使うかもしれません。
いずれにせよ、RAMの多い品種では、この辺りは気にならなくなると思います。
2009年10月10日 追記
私が使用した環境はMPLAB Ver7.60 C18 Ver3.11(評価版)です。
新しいC18 Ver3.31ではリンク時にエラーが発生しました。
電子回路 > PIC18Fを使う > C18のバージョン を読んでください。
2010年4月5日 追記
液晶表示サブルーチン(lcdlib4l.c)において、表示器のストローブ信号のパルス幅には最低値が存在します。
このため、表示関数やコマンド書き込み関数では2サイクルのウエイト信号を入れてあります。
しかしながら、初期化コマンドの書き込み関数にはウエイトが入っていませんでした。
チップ内蔵のクロックで動作させている今回の例では問題ありませんでしたが、クロックスピードが速い場合は、初期化出来ない
可能性があります。
又、ストローブをONして、すぐにOFFしているので、コンパイラの最適化で無くなってしまう可能性もあります。
(評価版では最適化が働かないので問題ありませんが。)
もし、ソースファイルをダウンロードした場合、以下の修正をお願いします。
(PIC18Fを使う(1)〜(4)全て)
///////// 初期化コマンドの書込 void lcd_incmd(int cmd){ //cmd: 初期化コマンド lcd_port = (cmd >> 4 & 0x0f) | (lcd_port & 0xf0); //初期化コマンド(ポート上位保存) lcd_rs = 0; //コマンドの書込操作 lcd_stb = 1; //ストローブ立ち上げ lcd_stb = 0; //ストローブの立ち下げ delay_ms(5); }修正後
///////// 初期化コマンドの書込 void lcd_incmd(int cmd){ //cmd: 初期化コマンド lcd_port = (cmd >> 4 & 0x0f) | (lcd_port & 0xf0); //初期化コマンド(ポート上位保存) lcd_rs = 0; //コマンドの書込操作 lcd_stb = 1; //ストローブ立ち上げ Delay1TCY(); //NOP Delay1TCY(); //NOP lcd_stb = 0; //ストローブの立ち下げ delay_ms(5); }