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プログラミング入門
関連記事
コメントを残す