2002/11/11 【ソフトウエア編TOPに戻る】
MPLABによるアセンブラでのプログラム開発環境については、301.PICソフトウエア開発環境のページでご紹介しました。実際、PICのアセンブラ言語は全部で35個と少なく比較的簡単です。しかもPICの動作が良く分かり、なかなか楽しいものです。しかし、ちょっと複雑なプログラムを組もうとしたり、シリアル通信やI2C通信など、複雑な手続きを必要とするプログラミングを行ったり、修正したりしようとすると、少しゲンナリしてしまうのも確かです。
そこでC言語による開発環境を整えると、複雑なI/Oが既に関数として準備されていたり、煩雑な条件判断による分岐命令などが簡単に行えたりと、とても快適な開発が行えるようになります。PICはもともとメモリー領域が少なかったりI/Oに限界があったりとリソース面での制限がありますが、それらを踏まえた上でのC言語での開発は、きっとアセンブラ環境には無い楽しみがあると思います。
303−1.PICのCコンパイラの導入
PIC用のCコンパイラにはいくつかあり、もちろん本家のマイクロチップテクノロジーでもリリースされています。しかし、PIC18とPIC17のシリーズ用で、PIC12/14/16の各シリーズ版はリリースされていないようです。特にPIC16のシリーズに対応していないのは致命的なので、今回は見送ることになります。で、採用したのがCCSのPIC-C Compiler(PCM)です。
このコンパイラを知ったのは、力弥の座右の書である「PIC活用ガイドブック」後閑哲也氏著(技術評論社)での解説記事です。更に、CCSのコンパイラを購入したのと同時に、同氏著「C言語によるPICプログラミング入門」も新たに参考書として加えました。なので、これから力弥がご紹介して行くPICによるC言語のプログラミングは、基本的にはこれら後閑哲也氏の著書に基づくものです。また、後閑さんのホームページ「電子工作室の実験室」も、良く参考にさせて頂いている情報源です。
本来であれば、CCSのCコンパイラを使った開発環境の整え方などについて、このページで詳しくご紹介するところでしょうが、力弥がここでご紹介するまでもなく、上記の情報源に全て詳しい解説がされていますので、今回は省略することにします。
とりあえず、今回は導入の概略について、簡単にご紹介させて頂くことにします。m(_ _)m
303−2.CCSのCコンパイラ
CCSとはCustom Computer Servicesという会社の略称です。日本ではアイピイアイが、その代理店をつとめており、力弥はそこを経由して通販で購入しました。アイピイアイでは、PICのデバイスを始め関連商品や、AVRの関連商品などを通販で扱っています。
CCSのCコンパイラには以下のような種類があり、力弥の場合はPIC16シリーズに対応するPCM版を選定しました。以下、説明文はアイピイアイのホームーページからの無断転載です。(アイピイアイさん、すみません...) なお、価格は2002年11月現在のものです。
| グレード |
説 明 |
価 格 |
| PCB |
PIC16C5X, PIC12C5XXの内部12ビットコア用のCコンパイラです。512バイトROMにも十分対応可能な効率の良いコードを生成してくれます。 |
25,000円 |
| PCM |
PIC16C6XからPIC16F87Xなど内部14ビットコアの多種多様なI/Oの関数が利用できます。FLOAT(実数計算)も使用できます。Ver3からは32ビットのLONGも可能です。 |
25,000円 |
| PCH |
PIC18CXXX,PIC18FXXXなど内部16ビットコアの多種多様なI/Oの関数が利用できます。FLOAT(実数計算)も使用できます。Ver3からは32ビットのLONGも可能です。 |
30,000円 |
| PCW |
PCBとPCMを併せてIDE(開発統合環境)でまとめたものです。強力なプロジェクト機能で、割込みや内部I/Oの設定がグラフィカルに設定できます。基本的なコードが生成され驚くほど短期間でプログラムの開発が可能です。 |
59,000円 |
| PCWH |
PCB+PCM+PCHを併せてIDE(開発統合環境)でまとめたものです。強力なプロジェクト機能で、割込みや内部I/Oの設定がグラフィカルに設定できます。基本的なコードが生成され驚くほど短期間でプログラムの開発が可能です。 |
67,000円 |
PCBとPCMとPCHは、扱えるPICの種類によって分けられたコンパイラです。PCWとPCWHは、これらのコンパイラを含めた統合的な開発環境を提供します。
今回は、統合開発環境としてマイクロチップテクノロジー純正のMPLABをベースとして、Cコンパイラ機能だけをプラグインするので、PCWおよびPCWHは必要ありません。なので、PCMのみを購入します。
|
PCM版を購入すると、左のようなセットが届きます。カラフルな冊子が英語版のリファレンスマニュアルで、真中の冊子が日本語版のクリックリファレンスです。Cコンパイラ自体は2枚組みのフロッピーディスクで収められています。 右のCD-ROMはMPLABが収録されていますが、2002年11月に購入時点では、Ver5.62でした。この時点でマイクロチップから公開されているMPLABはVer5.70.40が最新版ですので、これは直接ダウンロードしたほうが良いでしょう。ダウンロード方法については301.PICソフトウエア開発環境のページを参照して下さい。 |
さて、インストール方法やMPLAB上でのコンパイラの設定方法などは、後閑さんの著書やホームページを参考にして頂くとして、以下に超簡単な導入事例をご紹介しておきましょう。きっとCコンパイラが欲しくなりますよ。(^o^
303−3.Cコンパイラ導入例
310.PIOで入出力する(PIC16F84A)のページで、PAポートからの入力を、そのまんまPBポートから出力させてLEDを点灯させるためのアセンブラプログラムをご紹介しました。そのときのアセンブラソースを、もう一度以下に掲載致します。こんな感じでした。
| ;********************************************************************** ;PIOTEST1 2001.11.30 ;DEVICE : PIC16F84A ;CLOCK : 20MHz ;PORT-Aの入力データをPORT-Bに出力する ;********************************************************************** list p=16F84A #include <p16F84A.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ;********************************************************************** ORG 00H ; processor reset vector GOTO MAIN ; go to beginning of program MAIN BSF STATUS,RP0 ;メモリーバンクを1にセット MOVLW 0FFH ;WレジスタにFFHをセット MOVWF TRISA ;TRISAにFFHをセットPORT-Aを入力にセット CLRF TRISB ;TRISBをクリア PORT-Bを出力にセット MOVLW 080H ;Wレジスタに80Hをセット MOVWF OPTION_REG ;OPTION_REGに80Hをセット PORT-B PULL UPなし BCF STATUS,RP0 ;メモリーバンクを0にセット ;*********************************************************************** ;PORT-Aの入力データをPORT-Bに出力 ;*********************************************************************** LOOP MOVF PORTA,W ;WレジスタにPORTAのデータ取り込む MOVWF PORTB ;PORTBにPORTAのデータを出力する GOTO LOOP ;ラベルLOOPにジャンプ END |
この程度のアセンブラであれば、PICがどのように動いているのかが手に取るように分かりますね。また、PICのアーキテクチャとあわせて、その動作を勉強したいという学生の方々にはお薦めです。
さて、上のアセンブラ言語と同じことをCCSのC言語で記述すると、以下のようなものになります。
| #include <16f84a.h> #fuses HS , NOWDT , PUT , NOPROTECT main(){ while(1){ output_b (input_a()); } } |
ち、ちょっと待て!と言いたくなるくらい、簡単だと思いませんか?これは#includeの部分で読み込んでいる16f84a.hというヘッダファイルでI/O部分が定義されているために、ソース上での余計な記述が極力必要なくなっているためです。しかも、動作の内容をひとめで掴むことができます。Cコンパイラ恐るべしといったところでしょうか。コンパイルを実行すると、アセンブルと同様にHEXファイルを生成しますので、PICデバイスへの書き込みは従来通りの手順で行うことになります。
ところで、Cコンパイラでマシン語に変換されたソースは以下のようになりました。マシン語の後にアセンブラ表記されているので、上で力弥が作成したアセンブラソースと比較するのも楽しいかも知れません。興味のある方は追いかけてみてください。
| 0000 3000
movlw 0x0 0001 008A movwf 0xA 0002 2804 goto main 0003 0000 nop 0004 0184 main clrf 0x4 0005 301F movlw 0x1F 0006 0583 andwf 0x3 0007 30FF movlw 0xFF 0008 1683 bsf 0x3,0x5 0009 0085 movwf 0x5 000A 1283 bcf 0x3,0x5 000B 0805 movf 0x5,W 000C 008F movwf 0xF 000D 3000 movlw 0x0 000E 1683 bsf 0x3,0x5 000F 0086 movwf 0x6 0010 1283 bcf 0x3,0x5 0011 080F movf 0xF,W 0012 0086 movwf 0x6 0013 2807 goto 0x7 0014 0063 sleep |
C言語による開発環境を整えたからと言って、PICでのアセンブラ言語が全く不要になるわけではありません。外部デバイスとの接続において、細かなタイミング処理が必要な部分などは、やはりアセンブラで組むのが有利でしょう。またCコンパイラにも、C言語ソース中にアセンブラ命令文を挿入できる機能が付いているようです。なにより、PICのアーキテクチャを理解するにはアセンブラが一番だと思います。なので、アセンブラのお勉強も継続して行うべきではないかと、勝手に思っています。
とはいえ、人間は楽なほうに流れていくのが世の常です。(^^; C言語での開発環境を手に入れてしまったら、アセンブラの世界が面倒に思えてくるかもしれませんね。
今後も、PICにはある特定部分での機能を分担させて行きたいと思います。それはパッケージ化された機能になると思いますが、そこで処理する内容は高度で複雑になって行くでしょう。そんなプログラム開発に、C言語での開発環境は強い味方になると思いますし、なにより楽しさが倍増するのではないかと思います。(^^