PIC16F84AをC言語で,MPLAB IDE環境で開発する

PIC16シリーズでは、入門者向けとしてよく使用されているPIC16F84Aですが、プログラムの格納エリアが小さいため通常はMPASMというアセンブラを使用してプログラムを行う事が多いです。

PICの製造メーカであるMicroChipが提供している統合開発環境のMPLABでも、標準ではアセンブラしか用意されていません。ですが、実はMicroChipはCのコンパイラも用意してくれているので、追加でコンパイラをインストールすれば、Cで開発する事も可能です。


今回はMPLABで、PIC16F84AのプログラムをC言語で開発する方法を説明します。

C言語によるPICプログラミング入門


MicroChip提供のPIC向けのコンパイラを確認する


まずはMicroChipのサイトより、コンパイラのページへ移動します。
Microchip C Compilers



このページを見ると分かるのですが、MicroChip純正のCコンパイラには”MPLAB C Compilers”と、”HI-TECH C Compilers”という2つのモノがあります。


どちらを使用すればよいかは、すぐ下の一覧表から確認できます。



今回使用するPIC16F84AはPIC16シリーズなので…
縦軸を見るとHI-TECH Cのコンパイラしか選択肢が無いことが分かります。
横軸はエディションで、HI-TECH Cには、PRO,Standard,Liteという3つのエディションがあります(Evaluationは評価版です)

PROとStandardのエディションは有償なので、今回は無償で利用できるLite版を使用します。
Lite版でもCコンパイラとしては問題なく使用できるのですが、Omniscient Code Generation(OCG)機能が使用できません。OCGというのはいわゆるオプティマイザで、OCGがあると生成されるコードサイズを小さくさせることが可能となります。

ちなみに、PRO、Standard版の価格ですが、定価ベースでそれぞれ$1195、$495となっています。業務向けならともかく、個人が遊び目的で使用するにはかなりお高めの価格設定ですね…

※余談ですが、今回はHI-TECH CをMPLABのIDEで使用する方法を説明しています。HI-TECH C自体はEclipseをIDEとして使用することも出来るようです(未検証です)。


コンパイラのインストール


使用するコンパイラが決まったので、早速コンパイラのインストールを行います。
MPLABをまだインストールして無い場合は、先にインストールしといて下さい。
PIC用IDEのMPLABをインストールする « nanoblog


先ほどのページより、HI-TECH C Liteのリンクをクリックします。


遷移先ページの下のほうにあるDownloadsリンクよりダウンロードを行います。
今回はWindows版をダウンロードしましたが、Linux/Mac版も用意されているようです。
本記事の作成時点で、バージョンはv9.83でした。


ダウンロードが完了したら,セットアップのプログラムを実行します。



Nextをクリックします。


インストールするエディションの指定です。一番下のLite版を選択します。


ライセンスを確認後、I accept…のチェックを入れます。


インストール先フォルダの指定です。今回はデフォルトの場所にインストールしました。
基本的にはどこでもOKですが、日本語を含むフォルダは避けてください。


言語の選択です。残念ながら日本語は無いのでEnglishにしておきます。


Finishをクリックします。


しばらく待つとインストールが完了します。


MPLABで開発を行う


Cコンパイラがインストールできたら、MPLABでプロジェクトの作成を行います。

MPLABを起動し、Project->Project Wizardを選択します。


次へをクリックします。


デバイスの指定です。今回はPIC16F84Aを選択します。


Active Toolsuiteのコンボボックスを開くとHI-TECH Universal ToolSuiteが有るはずなので、これを選択します。
(もし選択肢が出ない場合は、コンパイラのインストールに失敗しているので、再インストール等してみて下さい)


プロジェクトのフォルダを指定します。


そのまま、次へをクリックします。


完了をクリックします。


プロジェクトが作成されたら、*.cファイルをプロジェクトに追加します。
予め空のファイルを作っておいて、Source Filesを右クリックしてAdd Filesを選択します。


作ったファイルを選択します。




Cのソースを作成します。
今回は動作確認としてPortBに接続したLEDを1秒周期で点滅させてみます。

#include <stdio.h>
#include <htc.h>            // for __delay_ms
#include <pic.h>
#include <pic16f84a.h>
 
#define _XTAL_FREQ 8000000 // 8Mhzの外部オシレータを使用する
 
void main( void )
{
    __CONFIG ( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF );
    TRISB = 0x00;
 
    while ( 1 ) {
        PORTB = 0xff;
        __delay_ms(1000); 
 
        PORTB = 0x00;
        __delay_ms(1000); 
    }
}



ソースを作成後,F10でコンパイルします。
“Build successful!”が出ていればOKです。


Build C:\home\project\pic\16F84A_Ctest\16F84A_Ctest for device 16F84A
Using driver C:\Program Files\HI-TECH Software\PICC\9.83\bin\picc.exe
 
Make: The target "C:\home\project\pic\16F84A_Ctest\main.p1" is out of date.
Executing: "C:\Program Files\HI-TECH Software\PICC\9.83\bin\picc.exe" --pass1 C:\home\project\pic\16F84A_Ctest\main.c -q --chip=16F84A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
Executing: "C:\Program Files\HI-TECH Software\PICC\9.83\bin\picc.exe" -o16F84A_Ctest.cof -m16F84A_Ctest.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 main.p1 --chip=16F84A -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 -D__DEBUG=1 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s" 
 
HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode)  V9.83
Copyright (C) 2011 Microchip Technology Inc.
(1273) Omniscient Code Generation not available in Lite mode (warning)
Memory Summary:
    Program space        used    28h (    40) of   400h words   (  3.9%)
    Data space           used     5h (     5) of    44h bytes   (  7.4%)    
    EEPROM space         used     0h (     0) of    40h bytes   (  0.0%)    
    Configuration bits   used     1h (     1) of     1h word    (100.0%)    
    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)
 
Running this compiler in PRO mode, with Omniscient Code Generation enabled,
produces code which is typically 40% smaller than in Lite mode.
See http://microchip.htsoft.com/portal/pic_pro for more information.
 
Loaded C:\home\project\pic\16F84A_Ctest\16F84A_Ctest.cof.
 
********** Build successful! **********



このプログラムをPICにロードして実行し、正しく動作することを確認してみて下さい。


今回は動作確認のため、プログラムの詳細は説明しません。
細かいところが知りたい場合は、以下の記事を参考にしてください。



コンパイラ結果をかくにんしてみる

メニューよりViewのDisassembly Listingを選択すると、アセンブリの出力を確認できます。


---  C:\home\project\pic\16F84A_Ctest\main.c  ----------------------------------------------------
1:                 #include <stdio.h>
2:                 #include <htc.h> // for __delay_ms
3:                 #include <pic.h>
4:                 #include <pic16f84a.h>
5:                 #define _XTAL_FREQ 8000000
6:                 
7:                 void main( void )
8:                 {
9:                  __CONFIG ( FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF );
10:                 TRISB = 0x00;
   3DB    1683     BSF 0x3, 0x5
   3DC    0186     CLRF 0x6
   3DD    2BDE     GOTO 0x3de
11:                
12:                 while ( 1 ) {
   3FE    2BDE     GOTO 0x3de
13:                     PORTB = 0xff;
   3DE    30FF     MOVLW 0xff
   3DF    1283     BCF 0x3, 0x5
   3E0    0086     MOVWF 0x6
14:                     __delay_ms(1000); 
   3E1    300B     MOVLW 0xb
   3E2    008E     MOVWF 0xe
   3E3    3026     MOVLW 0x26
   3E4    008D     MOVWF 0xd
   3E5    3066     MOVLW 0x66
   3E6    008C     MOVWF 0xc
   3E7    0B8C     DECFSZ 0xc, F
   3E8    2BE7     GOTO 0x3e7
   3E9    0B8D     DECFSZ 0xd, F
   3EA    2BE7     GOTO 0x3e7
   3EB    0B8E     DECFSZ 0xe, F
   3EC    2BE7     GOTO 0x3e7
   3ED    2BEE     GOTO 0x3ee
15:                
16:                     PORTB = 0x00;
   3EE    1283     BCF 0x3, 0x5
   3EF    0186     CLRF 0x6
17:                     __delay_ms(1000); 
   3F0    300B     MOVLW 0xb
   3F1    008E     MOVWF 0xe
   3F2    3026     MOVLW 0x26
   3F3    008D     MOVWF 0xd
   3F4    3066     MOVLW 0x66
   3F5    008C     MOVWF 0xc
   3F6    0B8C     DECFSZ 0xc, F
   3F7    2BF6     GOTO 0x3f6
   3F8    0B8D     DECFSZ 0xd, F
   3F9    2BF6     GOTO 0x3f6
   3FA    0B8E     DECFSZ 0xe, F
   3FB    2BF6     GOTO 0x3f6
   3FC    2BFD     GOTO 0x3fd
   3FD    2BDE     GOTO 0x3de
18:                 }
19:                }
   3FF    2800     GOTO 0



今回のテストプログラムの出力を見ると、アセンブラのコードで37ステップになりました。プログラムの格納先は3DB~3FFと、上位アドレスに格納されています。使用しているプログラムメモリのサイズが知りたいだけなら、Disassembly Listingで確認しなくても、コンパイル結果の以下の行で確認できます。

Memory Summary:
    Program space        used    28h (    40) of   400h words   (  3.9%)


最初の括弧の中が命令数(10進表記)です。括弧の前の28hは40を16進表記したもので、400hはプログラムエリアの全容量(10進表記で1024)です。


プログラムのサイズが37ではなく40となっている理由は、スタートアップルーチンとして3命令使用しているためです。この3命令はView->Program Memoryを見ると、0x000, 0x3D9, 0x3DAの位置に存在している事が確認できます(実質は、STATUSレジスタをクリアしてるだけですね)。




この結果より、PIC16F84Aはプログラムの格納領域として1024ワード(2kbyte)しかない為、たったLED点滅のプログラムだけでも3.9%もメモリを使用してしまっていることが分かります。

容量的が1024ワードというのは、本格的なプログラムを作成するにはちょっと厳しいですが、学習目的なら問題なく使用することが出来ます。
また、同じPIC16シリーズでもPIC16F84Aでは無くPIC16F88を使用すれば、4096ワード(8kbyte)と4倍もあるのでもう少し大きなプログラムがかけます。PIC16F88は価格も200円程度と安価で、機能もA/Dコンバータ/PWMモジュール/シリアル通信などが付いており高機能なのでお勧めです。

C言語によるPICプログラミング入門

関連記事

コメントを残す

メールアドレスが公開されることはありません。