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