303.PICのC言語開発環境


2002/11/11 【ソフトウエア編TOPに戻る】

MPLABによるアセンブラでのプログラム開発環境については、301.PICソフトウエア開発環境のページでご紹介しました。実際、PICのアセンブラ言語は全部で35個と少なく比較的簡単です。しかもPICの動作が良く分かり、なかなか楽しいものです。しかし、ちょっと複雑なプログラムを組もうとしたり、シリアル通信やI2C通信など、複雑な手続きを必要とするプログラミングを行ったり、修正したりしようとすると、少しゲンナリしてしまうのも確かです。

そこでC言語による開発環境を整えると、複雑なI/Oが既に関数として準備されていたり、煩雑な条件判断による分岐命令などが簡単に行えたりと、とても快適な開発が行えるようになります。PICはもともとメモリー領域が少なかったりI/Oに限界があったりとリソース面での制限がありますが、それらを踏まえた上でのC言語での開発は、きっとアセンブラ環境には無い楽しみがあると思います。


303−1.PICのCコンパイラの導入

PIC用のCコンパイラにはいくつかあり、もちろん本家のマイクロチップテクノロジーでもリリースされています。しかし、PIC18PIC17のシリーズ用で、PIC12/14/16の各シリーズ版はリリースされていないようです。特にPIC16のシリーズに対応していないのは致命的なので、今回は見送ることになります。で、採用したのがCCSPIC-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円

PCBPCMPCHは、扱えるPICの種類によって分けられたコンパイラです。PCWPCWHは、これらのコンパイラを含めた統合的な開発環境を提供します。

今回は、統合開発環境としてマイクロチップテクノロジー純正の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言語での開発環境は強い味方になると思いますし、なにより楽しさが倍増するのではないかと思います。(^^

 

【ソフトウエア編TOPに戻る】


【表紙に戻る】