PIC用Cコンパイラ

  1. クロスCコンパイラ


    1. 特長

      PICにも各種のCコンパイラが利用できます。ここでは、CCS社の14ビット長(ミドルレンジ)PIC用のコンパイラであるPCMの利用法を紹介します。
       PCMのCコンパイラはWindowsで実行できるクロスコンパイラで、C言語からPICで実行できるプログラムを生成します。このように、他の計算機で実行できるプログラムを生成するコンパイラをクロスコンパイラといいます。


    2. 組み込み

       PCMは2枚のFDDで提供されます。setup.exeを起動して、PCMをインストールします。インストールされたフォルダを記録しておいて下さい。
       MPLABと結合するには、MPLABを立ち上げ、Projectメニューの Set Language Location を選択し、メニューで CCS C Compiler のExecutableを選択し、LocationをBrowseして、先にインストールした Ccsc.exe のフォルダを指定します。

  2. PCMの特殊な表現(プリプロセッサ)


    1. PICの記号に関する定義

      #includeで、利用するPICに対応するヘダファイルを組み込みます。

       例: #include <16F873AA.h>

      このヘダファイルには、SFR(入出力用の特殊レジスタ)やそのビット、割り込みのタイプなどを定める多くの記号が定義されています。ヘダファイルは コンパイラのあるプログラムフォルダの
      Devices(\Program Files\PICC\Devices)にあります。
      プリプロセッサの記述は、プログラムの先頭だけでなく、C言語プログラムの途中でも記述できます。

    2. 構成(fuses)

      構成(コンフィグ)を指定するには、#fuses を利用します。利用できるオプションは使用するデバイスの.hファイルの先頭に表示されます。発振子の指定は必須です。HSはセラミック発振子、INTRCは内部発振子を選択します。NOBROUNOUT は電池など5V電源以外を使用する場合指定します。
           例 #fuses HS,NOWDT,NOPROTECT,NOBROUNOUT

    3. 入出力機能に関する指定

      CCSCコンパイラでは、ミリ秒単位で遅延時間を指定する関数 delay() がありますが、このためには、CPUのクロックの速さを知る必要があります。このため、次の use 文で利用するクロックを指定します。
      #use delay(clock=val)
      標準入出力にはシリアルを利用します。このためには、事前にシリアルの速度や端子を設定する必要があります。UARTの機能がない場合、ソフトで行うシリアルの制御を自動的に追加します。以下は、通信速度を9600BPS,送受信のピンとして、A2,A3を利用することを宣言しています
      #use rs232(bau=9600,xmit=PIN_A2,rcv=PIN_A3)

    4. 定数、変数、演算

       PICは1バイトの整数加減算機能しか内蔵されていません。int で宣言する変数は 1バイトの符号無し整数です。2バイトの整数や乗除算もコンパイル可能ですが、実行はプログラムで行うためかなり遅くなります。

    5. 標準入出力

       標準の入出力はシリアル(RC232C)です。printf()を行うと、シリアル(UART)端子に出力されます。シリアル端子をパソコンに接続しパソコンで文字入力を実行すると、printf() の内容が出力されます。また、printf の出力切り替え機能を利用すると、LCDなどの表示装置に文字や変数の値を表示可能です。

  3. コンパイル


    1. ソースファイル

       実験では、Cドライブに work フォルダを作成してください(このフォルダ以外には保存をしてはいけません)。メモ帳などで、ソースファイルを作成し、*.c の名前で work フォルダに保存します。場合によってはwebにあるソースをコピーしてエディタに貼り付けてください。

      例 
      #include <16f873A.h>//使用するPICの情報を取り込む
      
      //ポート B3〜B0出力 LED表示
      //ポート A0入力、スイッチ
      
      #fuses HS,NOWDT,NOLVP,NOBROWNOUT //PIC設定
      #use delay(CLOCK=20000000) //使用クロック
      
      int cnt;
        
      void main(){
      
        cnt=0;//計数値の初期化
        
        while(1){
                
                if(input(PIN_A0)){//スイッチがオフなら
                  cnt++;//計数
                  output_c(cnt);//表示
                  delay_ms(500);//待ち
               }
        }
      }

    2. コンパイル



      をクリックして、PIC_C を立ち上げます。あるいはスタートメニューから立ち上げます。


      ファイル名を指定するダイアログ が表示されます。コンパイルするソースファイルをフルパスで指定します。この場合、 \work\port.c になります。あるいは、ソースファイルのアイコンをCCSCのアイコンにドラッグします。
      エラーレポートは ソースのフォルダの port.err に作成されます。これで、エラー行を確認できます。0 errors であれば成功、そうでなければ ソースを見直して下さい。成功すると、port.Hex、port.LST が作成されます。port.HEX ファイルを MicroLoader やPICライタなどでPICに書き込みます(次項以後で紹介します)。

    3. HEXファイルの内容

      HEXファイルは以下のようなテキストファイルです。各行が独立したデータになります。先頭の二桁が1行のデータ数、次が先頭アドレス、以後データ(プログラム)が続き、最後にチェックビットが記録されています。

      :1000000000308A004A280000FF00030E8301A6008A
      :100010007F08A5000A08AD008A01A50E0408A70004
      :100020002008A8002108A9002208AA002308AB0084
      
      :1000E00080006400813084000008C0392004800052
      :1000F0001330AE00300886000130AF008B16C030E0
      :060100008B04812863005E
      :02400E00583F19
      :00000001FF
      ;PIC16F648A

    4. HEXファイルの書き込み

       HEXファイルをPICに書き込むには、ライタを利用するか、シリアル出力とPICのブートローダプログラムを利用して、書き込みます。シリアルを利用する方法は、次の項で説明します。

  4. 課題


    1. LEDを順に点灯する

      4個のLEDを1個ずつ順に点灯するプログラムを作成しなさい。
      ヒント
      最初 val=1 として、いちばん右のビットを1にします。この値を2倍すると、左のビットが1になります。これを3回繰り返します。

    2. アンケート

      1 コンパイル、実行の手順は理解できましたか?
        1:理解できた  2: だいたい理解した  3:よくわからん

      2 コンパイルはできましたか
        1:できた  2: だいたいできた  3:できない

      3 順次点灯プログラムはできましたか?
       1:できた  2: だいたいできた  3:できない