MPLAB XとMCCを使ったPICプログラミング
PICkitとPICチップが準備できたら、さっそく開発を行いましょう!(^^)! とは言え、こういった情報が少なすぎて、私は何回か挫折しましたが(^^;;;
PIC関連の本やブログは山のようにあります。しかし、ド素人の私はどうやっても開発のノウハウが蓄積できませんでした。コレ、という道標がないのです。購入してから何もせず眺めていました(笑)。開発が起動に乗ったのは、PICkit3を購入してから、丸3年ほど過ぎてからでした。( ゚Д゚)
3年の間は何をしていたかというと、Raspberry Piでばかり開発していました。実は、Raspberry Piを購入した数か月後にPICkit3を購入していたのですが、完全に放置していました。(^^;;; その間も、書籍からもネットからもPICに関する最新情報は得られませんでした。MPLAB Xの使い方を説明した書籍もありませんでしたし、後述するMCCを使った開発事例も見たことがありませんでした。厳密に言うと、紹介程度の情報はあったのですが、実際の開発例がまったく見つからないのです。
恐らくですが、PICで開発する方は、電子工作の延長でプログラミングするようになったのではないでしょうか。どの情報もかなり古いスタイルの開発手法に見えました。そういえば、以前も同じことを思ったものです。「Raspberry PiでSC1602とSC2004を制御する」にこんなことを書いていました。
私はプログラミングを先に経験してから電子工作を始めました。だから思うのですが、これらのコードを書いた人は電子工作を専門にやっている人のように思えるのです。電子工作する上で避けて通れないからプログラミングをしているように思えるのです。
そんな訳で、今回の目標は最新の環境を使って、とりあえずPICを動かすことにします。1つでも動作する環境ができれば、後は興味が出てくるので、自分で色々やってみることができます。そして数年前の私はこういう情報が欲しかったのです。
PICkitのインストール
MPLAB X IDEをインストールすると、このような画面になります。
この画面のまま、PICkit3を接続します。Windowsの場合、右下にバルーンが出ますが、OSのバルーンというよりもMPLAB Xが出すバルーンです。しばらくすると消えます。
あれ、と思われたかもしれませんが、PICkit3にはいわゆるドライバーが不要です。デバイスマネージャーでは[HID準拠ベンダー定義デバイス]になります。デバイスマネージャーの設定を[表示] – [デバイス (接続別)]にすると探しやすいです。
XC8のインストール
次にコンパイラーをインストールします。まずはMPLAB X IDEを一旦終了してください。Microchip Downloads Archiveへ移動し、XC8コンパイラーをダウンロードします。2018年10月現在、私の推奨は1.43です。
利便性向上のため、直リンクを貼っておきます。
OS | ファイル名 |
Linux | xc8-v1.43-full-install-linux-installer.run |
Windows | xc8-v1.43-full-install-windows-installer.exe |
OSX | xc8-v1.43-full-install-osx-installer.dmg |
ダウンロード後はインストールしてください。説明は省略しますが、[次へ]だけ押せばいいはずです。
参考までに、1.44では外部ライブラリをインポートするとコンパイルができなくなります。1.45では、ライブラリのコンパイルで不具合が発生します。最新版のバージョン2.00では、後で使用するMCCにてトラブルが発生します。バージョンアップに伴い不具合が増えるとはひどいですね。(^^;;;;
プロジェクトの作成
MPLAB X IDEを開いてください。左上の[Projects]を右クリックして、[New Project]をクリックします。
[Standalone Project] のまま、[Next >]をクリックします。
PICチップの型番を入れて、[Next >]をクリックします。ここでは当ブログの推奨チップのPIC16F18346を選択しました。
PICkitを選び、[Next >]をクリックします。
コンパイラー (≒使う言語)を選びます。[Select Device]の所で選択したPICチップが利用できるコンパイラーが表示されます。PIC16F18346が対応している言語は、アセンブラ (mpasm)とC言語 (XC8)です。XC8を選択します。
ここで注意が必要です。先ほども触れましたが、XC8のバージョン1.43を指定してください。写真では1.45になっていますが。詳しくは「Microchip’s New XC8 Compiler Appears Incompatible With MCC Boilerplate」(英語)を参照してください。
[XC8 (v1.43)]を選び、[Next >]をクリックします。
[Project Name]はプロジェクト名です。値は任意です。私は「PICチップ名_目的」にしています。ここでは「PIC16F18346_UART」にしました。
[Project Location]はプロジェクトフォルダの保存先です。ドキュメントフォルダの下にMPLABXProjectsというフォルダがあると思いますので、その下にProjectsというフォルダを作成し、それを指定しました。そうすると、MPLABXProjects\Projects\PIC16F18346_UART.Xというフォルダが作成され、そのプロジェクトに関するファイルがそこへ格納されるようになります。
[Project Location]が半角スペースを含む場合、MPLAB X IDEの起動時に以下のエラーが出るようになります。
Warning: Project "PIC16F18346_UART" refers to file "C:\File path with space\MPLABXProjects\Projects\PIC16F18346_blog.X\main.c" that contains spaces or odd characters in its name or its path. Some of the files in this Project "PIC16F18346_UART" contain spaces or odd characters in their name or their path. This could potentially cause issues during the build process. This is a limitation of GNU Make tool that we use as part of our build process. Removing spaces from all file and folder names included in this project will eliminate this potential issue.
ソースコードのビルド時にエラーとなる可能性があるようですが、これまで1度も発生したことはありません。(^^;
[Set as main project]はチェックのままにします。
[Use project location as the project folder]は未チェックのままにします。これにチェックしてしまうと、PIC16F18346_UART.Xというフォルダが作成されません。
[Encode]はUTF-8のままにします。
最後に[Finish]をクリックします。
MCCのインストール
画面上にアイコンはありますか?確か初期状態ではインストールされないので、以下のようにインストールします。
メニューの[Tools] – [Plugins] – [Available Plugins]の順にクリックします。
一覧からThe MPLAB® Code Configuratorを探してインストールしてください。スクリーンショットは私の環境なので[Installed]タブを開いています。インストール前だと[Available Plugins]の中にあるはずなので探してください。
MCCを起動する
先ほど説明したアイコンをクリックしますが、その前に注意が必要です。MCCを起動する際は、対象となるプロジェクトが必ずmain projectに設定されている必要があります。(太文字になっている状態です。) main projectに設定するには、プロジェクトを右クリックして、[Set as Main Project]をクリックします。
アイコンをクリックすると、以下のウィンドウが突然表示されます。以前はこんな動きをしなかったのですが。(^^;;;
そのまま[保存]してください。
ここからは、初期設定を行います。画面中央には[System Module]が表示されているかと思います。見ていただくとなんとなくわかると思いますが、MCCはPICチップの初期設定を行うためのツールです。
Internal Oscillator
PICの速度を設定します。PICチップはパソコンのCPUのように動作速度を変更できます。
詳細は省きますが、以下のように設定するだけで、32MHzで動作します。8ビットPICで水晶もないのにここまで速くなるとは、さすがPIC16F18346。!(^^)!
Oscillator Select | HFINTOSC with 2x PLL |
HF Internal Clock | 16_MHz |
Clock Divider | 1 |
Watchdog Timer Enable | WDT disabled; SWDTEN is ignored |
Low-voltage Programming Enable | Check |
Pin Manager
これはPICチップの機能と端子の対応表です。
PICチップのサイズを指定します。
Package | PDIP20 |
よく使われるのはブレッドボードにささるPDIP型です。これを変更すると、右上の図がこのように変わります。
UART機能の追加
UARTとは、簡単に言うとシリアル通信の機能です。これを使うと、PICとパソコン間を通信させることができます。私がプログラミングするのには欠かせないので、必ず設定しています。
左側にある[Device Resources]の中からEUSARTを開きます。
ESURT [PIC10 / PIC12 / PIC16 / PIC 18 MCUs by Mictochip Technology, Inc.]をダブルクリックします。中央にEUSARTウィンドウが開きます。以下のように設定します。
変更したのは以下の項目のみです。
Enable Transmit | Check |
Enable Receive | Check |
Redirect STDIO to USART | Check |
ここまで設定すると、以下のようになるはずです。
ピン(端子)の変更
[Pin Manager Package View]を見ると、10番ピン(RB7)にはシリアル通信データ送信用端子であるTX、12番ピン(RB5)には受信用であるRXが設定されたはずです。このままでもいいのですが、設定を変更します。そうすれば関連する接続を近くにまとめることができて、ブレッドボード上の見通しが良くなったり、はんだ付けする際のレイアウトの自由度があがったりして便利です。なお、こういったことが変更できるのも、PIC16F18346の大きな選定理由です。設定変更できないPICもかなり多いと思います。
10番ピン(RB7)と12番ピン(RB5)のをクリックしてへ戻します。次に13番ピン(RB4)とRXが交差するセルをクリックしてにします。同じく、13番ピン(RB4)RXが交差するセルをクリックしてにします。
ここで気づいたかと思いますが、RXの行はになり、TXはのままになっていますね。RXは1つのピンにしか指定できないのですが、TXは複数のピンが指定できます。これまでのところ、複数指定したことはありませんが。(^^;
ここまで設定できれば、以下のようになっているはずです。
MCC設定の保存
左側にある[Project Resources]の右に[Generate]があります。
これをクリックすると、[MPLAB® Code Configurator]ウィンドウに以下のようなログが表示されます。
21:56:21.852 INFO: ***************************************************** 21:56:21.852 INFO: Generation Results 21:56:21.853 INFO: ***************************************************** 21:56:21.866 INFO: main.c Success. 21:56:21.867 INFO: mcc_generated_files\device_config.c Success. 21:56:21.867 INFO: mcc_generated_files\eusart.c Success. 21:56:21.867 INFO: mcc_generated_files\eusart.h Success. 21:56:21.867 INFO: mcc_generated_files\mcc.c Success. 21:56:21.867 INFO: mcc_generated_files\mcc.h Success. 21:56:21.867 INFO: mcc_generated_files\pin_manager.c Success. 21:56:21.868 INFO: mcc_generated_files\pin_manager.h Success. 21:56:22.113 INFO: ***************************************************** 21:56:22.113 INFO: Generation complete (total time: 555 milliseconds) 21:56:22.113 INFO: ***************************************************** 21:56:22.113 INFO: Generation complete.
使わないタブが前になってます。いつもの外観に手動で戻してください。気配りが足らないIDEですね・・・。(-_-;)
テスト回路の作成
ここで回路の話になります。以下の回路を作成してください。
色々と部品が乗っていますね。詳細はそのうち説明します。Fritzingで書くと、以下のようになっています。
要は、PICkit3とPIC16F18346 (図ではPIC16F1829)の以下の端子同士を接続しています。
PICkit3 | PIC16F18346 | ||
1 | nMCLR/Vpp | 4 | nMCLR |
2 | Vdd | 1 | Vdd |
3 | Vss | 20 | Vss |
4 | PGD (ICSPDAT) | 19 | RA0/ICSPDAT |
5 | PGC (ICSPCLK) | 18 | RA1/ICSPCKL |
リセットスイッチがあればPICの動作をリセットできます。写真のものは、千石電商のMS-312 白です。スイッチには色々な種類がありますが、いわゆるリセットボタンと同じ動きをするものにします。押した時だけ接続し、ロックせず、手を離すと回路が切れるものです。詳しく書くと、SPST (単極単投)、1回路2接点、モーメンタリ、ノンロック、NO (Normally Open)のものです。
リセットスイッチには抵抗が必要です。これはプルアップ抵抗です。PICにはプログラムからON、OFFできるプルアップ抵抗があるのですが、リセットスイッチだけは実際に抵抗を用意する必要があります。
シリアルケーブルを差し込みます。これは秋月電子のTTL-232R-3V3 (M-05840)です。
先端は加工してあります。加工方法については今後説明します。
元々のケーブルの色 | ピンソケットの色 | 機能 |
オレンジ | 黄色 | TX |
黄色 | 緑 | RX |
黒 | 黒 | GND |
シリアルケーブルはクロス接続する必要があります。よって、ピンソケットの黄色(TX)はブレッドボードの緑(RX)と接続し、ピンソケットの緑(RX)はブレッドボードの黄色(TX)と接続します。
USB端子側をPCへ接続します。確かドライバーは手動でインストールしたと思うのですが、覚えていません。すみません。認識されてると、デバイスマネージャーでは、USB Serial Port (COM3)のように表示されます。
Hello Worldの作成
さて、MPLABへ戻ります。フォルダツリーを開くと、以下のようになっています。
ファイルが増えているのは、MCCが自動生成したからです。これがMCCのいい所です。(^^♪ Source Filesの中にmain.cというファイルがあるので、ダブルクリックしてください。エディターが開きます。
このファイルの中身は以下のようになっています。
/** Generated Main Source File 中略 */ /* (c) 2018 Microchip Technology Inc. and its subsidiaries. 中略 */ #include "mcc_generated_files/mcc.h" /* Main application */ void main(void) { // initialize the device SYSTEM_Initialize(); // When using interrupts, you need to set the Global and Peripheral Interrupt Enable bits // Use the following macros to: // Enable the Global Interrupts //INTERRUPT_GlobalInterruptEnable(); // Enable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptEnable(); // Disable the Global Interrupts //INTERRUPT_GlobalInterruptDisable(); // Disable the Peripheral Interrupts //INTERRUPT_PeripheralInterruptDisable(); while (1) { // Add your application code } } /** End of File */
プログラムをこのように変更してください。printfの行を追加するだけです。
while (1) { // Add your application code printf("Hello World!"); }
これは、PCの画面にHello World!と表示し続けるプログラムです。このように、すべてのプログラムはこの部分へ書くことになります。逆に、ここ以外はMCCに任せてしまいます。こうしておくことで、PICチップの型番を変更したとしても、MCC上で設定しなおすだけで済むようになります。
書き込み
「PICkit3 と 44ピン デモボード」でも書きましたが、MPLAB X IEDのメニューにあるボタンをクリックすると、このような画面が開きます。
PICチップが5V対応でない場合は、チップにダメージを与えてしまいますよ、という警告です。今回は素直に[Cancel]を押します(笑)。
アイコンを押します。もしくは[File] – [Project Properties]の順にクリックします。
Conf: [default]の下にある[PICkit3] をクリックします。Option categories:を[Power]にします。
[Power target circuit from PICkit3]にチェックを入れ、[OK]します。Voltage Levelがデフォルトでは5.00なので、3.25にします。実際には1.8Vから 3.6Vであればいいのだと思いますが、私は3.25しか使ったことがありません。
再びアイコンを押します。もしくは[File] – [Run Main Project]の順にクリックします。また警告が表示されますので、今度は[Do not show the message again]にチェックし、[OK]をクリックします。
Programming/Verify complete
と表示されるはずです。これで書き込みが正常完了しました。また、PICは直ちに動作を開始します。
シリアル通信ソフト
PCの画面にHello World!を表示するためには、シリアル通信ソフトが必要です。有名なのはTera Termです。私はPuTTyをよく使うのですが、好みで決めてください。(^^; 窓の杜でTera Termのページを見ると通常版とポータブル版があるようです。ここではv4.99ポータブル版中にある、ttermpro.exeを実行して動作確認しました。
起動すると、以下の画面になります。Serialを選択し、Portには先ほどデバイスマネージャーに表示されていたCOMポートであるCOM3を指定します。
OKを押した途端、Hello World!という文字が無限に表示されます。\(^o^)/
もしうまくいかない場合は、[Setup] – [Serial port]を開き、以下の設定となっているか確認してください。なお、Flow controlはnone、Xon/Xoff、hardwareのいずれでも動作しました。
初めからシリアルケーブルを接続していないと、以下のように文字化けします。その場合はリセットスイッチを押してください。
コメントを残す