はじめに
このページでは、ビギナー向けに、マイコンボードPIColoの開発方法を説明します。このページは前のページの続きです。
※以下の情報は2010年7月現在のものです。ご注意ください。
PIColoについてはこちらを参照願います。
構成
マイコンはコンピュータですが、PCのようにモニタやキーボードはついていません。プログラムを開発する途中で、計算結果やセンサーの測定値などが見れないと、プログラムを作るのが非常に大変です。ということでまず始めに、計算結果などをPCに送って表示させるプログラムを作ってみます。
PIColoとPCは「シリアル通信」でデータをやりとりします。マイコン(PIColo)とPCのシリアル通信の電圧は違いますので、電圧変換回路が必要になります。オプションのPIColo−232Cはその電圧変換回路になっています。
今回は「非同期シリアル通信」という方法で通信します。詳しくは後の節で説明します。
PIColo−232Cが無い場合は、RS232C電圧変換回路を組んで、PIColoの通信ポートとPCを接続してください。
ノートPCなどでCOMポートが無い場合は、「USBシリアルアダプター」を購入してCOMポートを増設してください。この際、COMの番号を調べておいてください。
プロジェクトの作成
前のページではこちらですでに用意したプロジェクトのコピーを使いました。今回からは自分でプロジェクトを作り、プログラムを作っていきます。
まずは、てきとうな場所に作業用のフォルダを作っておきます。筆者はマイドキュメントの中に次のようにHelloというフォルダを作りました。みなさまは使いやすいように適当にフォルダを作っておいてください。まずはPCのモニタにHelloを表示させるのでプロジェクト名はHelloにしました。
次にMPLABを立ち上げます。
メニューから「Project」−>「Project Wizard」をえらびます。
「次へ」を押します。
「Device」で「PIC16F1936」を選んで、「次へ」を押します。
「Active Toolsuite」では使用するコンパイラを選びます。ここでは先にインストールしたHI−TECH Cを使いますので、「HI−TECH Unicersal ToolSuite」を選び、「Toolsuite Contents」で「HI−TECH ANSI C Compiler」を選んで「次へ」を押します。
「Browse」を押します。
先ほど作ったフォルダを選択し、ファイル名にてきとうなプロジェクト名を入れ、保存を押します。
「次へ」を押します。
あらかじめ追加しておくファイルがあったらここで追加します。今回も何個かファイルが必要ですが、このでやるよりも後で追加した方が画面がわかりやすいので、ここでは何も追加せずに「次へ」を押します。
(このウィンドウが大きくならず、ファイルが探しにくいので)
「完了」を押します。これでプロジェクトの用意ができました。
プロジェクトができると、プロジェクトウィンドウにプロジェクト名が表示されます。
今回はPCへデータを送信し、表示させるプログラムを作るわけですが、ビギナーの方がこれを全部作ると大変なので、あらかじめHITECH社の方で作ってある通信プログラムを使います。このためにはファイルを2つ追加する必要があります。MPLAB上でファイルを検索して追加することもできますが、MPLAB上だとファイルがさがしにくいので、エクスプローラなどで次の2つのファイルをプロジェクトのフォルダにコピーしておいてください。usart.h と usart.c
です。
HI-TECH softwareフォルダはインストールしたハードディスクドライブ(大抵はCドライブ)のProgram Filesフォルダの中にあります。
プロジェクトのフォルダにコピーしたところ。すでにその他に3つファイルが存在しています。
フォルダにコピーしただけではプロジェクトには追加されないので、追加の操作をします。
プロジェクトウィンドウの「Sorce Files」を右クリックし(左クリックではないので注意)、「Add Files」を選択します。ファイルの指定画面になるので、先ほどコピーした「usart.c」を指定して「開く」ボタンを押します。
するとSouece Filesのところにファイルが追加されます。これでプロジェクトに追加されたことになり、コンパイルのときに一緒にプログラムに組み込まれます。
同じようにしてHeader Filesのところに「usart.h」を追加してください。
これで準備はできました。いよいよプログラムです。
プログラム
「New File」アイコンを押して、新しいファイルを開きます。
「Untitled」と表示され、ウィンドウが開きます。
ここにプログラムを書いていきます。とりあえず、次のように打ってください。ここは練習だとおもって、自分で打ち込んでみてください。文字は半角英数です。
なお、どうしてもうまくいかないようならテキストデータを用意しましたので、これをコピー&ペーストしてもかまいません。
HelloSource.txt (右クリックで対象を保存)
プログラムの意味などは後で説明します。
打ち込んだら、メニューから「File」−>「Save As」を選びます。Save As は”名前をつけて保存”です。
保存する場所にプロジェクトのフォルダを指定し、ファイル名にてきとうな名前、ここではmain.cにしました、を入れて「保存」ボタンを押します。名前の最後はかならず
.c の拡張子をつけてください。これはC言語のソースファイルであることを表します。この拡張子はMPLAB側では勝手につけてくれませんので注意してください。
.c拡張子をつけて保存すると、MPLABはこれがCのソースであると認識し、表示の色が変わります。予約語(C言語の命令文など)は青に、コメントや数値は緑になります。
保存しただけではまだプロジェクトに組み込まれないので、プロジェクトに追加します。
プロジェクトウィンドウの「Source Files」を右クリックし、「Add Files」を選択し、先ほど作ったmain.cを指定して「開く」ボタンを押します。上はmain.cが追加されたところです。
コンパイル
プログラムをつくり終わったらコンパイルという作業になります。最終的にマイコンへ書き込むデータを作るには、たくさんのファイルを合体させたり変形させたりして作ります。すべての操作を自分でやると大変なので、MPLABが自動的にコンパイルをしてくれます。この操作をビルドと言います。
ビルドを行うには、メニューから「Project」−>「Build」を選ぶか、F10キーを押します。
ビルドが成功すると、アウトプットウィンドウに「Build successful!」と表示されます。
プログラムの書き込み
プログラムを作ることをプログラミング、と言いますが、MPLABがマイコンにプログラムを書き込むことも「Programming」といいます。ここではまぎらわしいのでプログラムの書き込みは「プログラムの書き込み」と表現します。
では実際に、PIColoとPICkit3を接続し、PICkit3のUSBケーブルをPCにさし、PIColoの電源を入れてください。このとき、MPLABで警告が出る場合があります。これらの警告については前のページを参照願います。
MPLABではいろいろな書き込み機に対応していますので、まずは書き込み機の種類を指定します。メニューから「Programmer」−>「Select
Programmer」−>「PICkit 3」を選択します。
この時、電源が入っていなかったり、PICkit3にPIColoがつながっていなかったりするとこのようなエラーが出ます。
正常につながっていると、このような電圧に関する注意が出ますので「OK」を押します。このウィンドウでは、「MPLABの電圧設定が5Vになっているときに、3.3V系のマイコンをつなぐと壊れますよ」という注意をしています。
※特にまだ設定などをしていないかと思いますが、その場合はPICkit3からは電源を供給しない設定になっているので問題はありません。
正常に接続された場合はこのような表示になります。最後に「Device ID Revision xxx」が表示されたら接続されていることになります。
プログラムの途中で、アウトプットウィンドウの表示が変わってしまい、今現在つながっているかを確認したい場合は再接続すれば確認できます。これにはメニューから「Programmer」−>「Reconnect」を選びます。
プログラムを転送するにはメニューから「Programmer」−>「Program」を選択するか、Programアイコンを押します。
(一番左)
プログラムを書き込んでいる最中は「Programming...」と表示されます。問題なく終了した場合は「Programming/Verify
complete」と出ます。Verify(べりファイ)は、書き込んだプログラムがあっているか、プログラムを読み出して比較するという動作です。これで間違いなく書き込めたことがわかりました。
動作確認
プログラムを書き込んだ直後から、PIColoはHelloの文字を送りつづけます。これを見るにはPC側でハイパーターミナルなどの通信ソフトを立ち上げます。ハイパーターミナルをつかった確認方法については前のページの「テストプログラムでの動作確認」の節に書いてありますのでそちらを参照願います。
結果はこのようになります。
プログラムの説明
ここでは簡単にプログラムについての説明をします。なお、C言語についてはここで全部を説明することは不可能なので、C言語の入門書などもあわせて読んでください。入門書は1冊だけではなく、複数購入することをお勧めします。たとえば、ある本では難しく書いてある部分が、別の本ではわかりやすかった、などがあります。1冊ですべてわかりやすい本、というのは今まで出合ったことがありません。また、同じ”入門書”と書いてあってもレベルにより微妙に難易度が違います。
■行1〜3
ヘッダファイルを組み込んでいるところです。#includeは、その部分に指定したファイルの内容を追加するというものです。ヘッダファイルは共通で使用するプログラムや名称の定義などをしているファイルで、拡張子.hが付きます。この3行では3つのヘッダファイルをこの部分に追加しています。
たとえば、行25はSPENを1にして通信機能をオンにしています。プログラムではSPENと書いていますが実際にはPICの中のある特定のアドレスをさしています。これらについてはhtc.hで記述されています。htc.hの中では、「PICのデバイスが16F1936ならxxx番地、違うデバイスならxxx番地...」というようなことが記述されています。
htc.h と stdio.h はプロジェクトフォルダの中には無く、HITECH-Cのフォルダにあります。usart.hはプロジェクトフォルダにあります(コピーしたので)。ということで、行1,2と行3とでは書き方が若干違います。このように自分で作ったり、コピーしてきたヘッダファイルは行3のような書き方になりますので注意してください。ファイル名を<>ではなく”
”でかこみます。
■行5〜8
この部分は、デバイスのハード的な設定をしている部分です。たとえばFOSC_INTOSCは「内臓のクロックを使う」という指定で、WDTE_OFFは「ウォッチドックタイマーを使わない」という指定になります。これらの意味についてはそれぞれの機能を理解する必要があるので、まだここでは詳しく説明はできません。とりあえず、PIColoを最高速の32MHzで動かす場合は行5〜8のように記述してください。なお、行5〜7は1つの文を改行してみやすくしているだけなので、一行で表記することも可能です。
動作クロックの部分だけを説明しますと、行5のFOSC_INTOSCを使う指定になっていますので、内臓のクロックを使用します。内蔵クロックはプログラムの中で31kHz〜8MHzに設定できます。行8のPLLEN_ONで、クロックを4倍速にしています。ということで8MHzに設定してPLLという機能をオンすることで8x4=32MHzの動作となります。
■行10〜17
ここでは簡単なウェイト関数を作っています。行14のasm("nop")は、アセンブラのnop命令を実行する、というもので、アセンブラでnopは(ノンオペレーション)つまり1クロック間なにもしない、という命令です。for文などについてはC言語の本を読んで見てください。
■行19〜31
メイン関数部です。行21でクロックの速度を設定し、行22〜25でUSART(通信機能)の設定をしています。ここで少しデータシートをみてみます。データシートはPIColoの説明ページにおいてあります。
【クロックの設定】
クロックについてはデータシートの8章に書いてあります。
行5で内部のクロックを指定しました。8章の図を見ると、クロック部の構成は次のようになっています。
PLLは8MHzの内部クロックにつながっていますので、内部クロックを8MHzにしてPLLをオンにすると32MHzの速度になります。
この中で、どのクロックを使うかを設定するには「OSCCON」というレジスタで行います。データシートを見ると、OSCCONの説明は次のようになっています。
PSLLENはPLLをオンにするので1、
IRCFは8MHzにするので1110、
SCSはコンフィグで指定したクロックにするので00、
ということでOSCCONを0b11110000に設定すればよいことになります。(行21)
【USARTの設定】
シリアル通信機能はUSARTというものです。これの設定は行22〜25に記述されています。
USARTの説明はデータシートの20章にあります。一般的なUSARTより機能が多いEUSARTというものです。
ENHANCED:拡張型
UNIVERSAL:汎用
SYNCRONOUS:同期
ASYNCHRONOUS:非同期
RECEIVER TRANSMITTER:受送信機
中を読んでいくと、送信するには次のように書いてあります。
ということでこれをそのまま書いたのが行23〜25です。
その他に通信速度を設定する必要があります。
通信速度設定は20.3節に書いてあります。ここの「ボーレートエラーの計算」の表に設定値の計算式がかいてあります。
FOSCはクロックなので32MHzです。ということで(32,000,000/9600/64)−1=51となり、行22の設定となります。これで9600bpsで通信する設定となります。
■行27〜30
ここでは適当にウェイトをかけた周期でprintf文でHelloを送っています。printf文は実際にはたくさんのプログラムから構成されていますが、これらは先にプロジェクトに登録したusart.cに書いてあります。また、それらのプログラムを使うためにuasrt.hとstdio.hをインクルードする必要がありました。
あまり説明が長くなるとよけいにわかりづらいと思い、駆け足で説明しましたがこのような感じになっています。詳しくはC言語の入門書とデータシートをよく読んでください。なれると、このような説明サイトにたよらずに、データシートだけで開発できるようになります。
計算結果を表示させてみる
C言語はいろいろな方言がありましたが、ANSIという団体でC言語の共通フォーマットを決めました。printf文もANSI規格になっており、一般的なC言語の入門書に書いてあるとおりに動作します。
たとえば、行27移行を次のように書き換えたとします。
行32はいままで通りHelloを出すのですが、最後に改行コードが入っています。MPLABではバックスラッシュになっていますが、日本語キーボードでは
\r\n と打つとこれと同じに打てます。¥は英語キーではバックスラッシュになります。
行33のように%d指定子で10進数表記で数値を表せます。
行34のように、マイコンの設定値なども同じように表示できます。
行35は10進数の51を16進数にして表示しています。
行36は数値51に相当するアスキー文字を表示します。(値51は文字の”3”)
送信は8ビット単位で行い、ハイパーターミナルもASCII文字しか表示できないので、表示させるのはASCII文字だけとなります。たとえば行27以降を次のように書き換えると、値33以降のASCII文字が順番に表示されます。
以降は一般的なシリアル通信について解説します。たんにPIColoが動けばよいのであまり深く知らなくてもいい、という場合は読まなくても結構です。ただし、これらについて詳しくなると、もしなにかエラーが起きた場合に原因の推測がしやすいですので余裕がある方は読んでみてください。
シリアル通信
コンピュータ同士を通信させる場合、いろいろな方法があります。たとえば、シリアル通信とパラレル通信があります。
通信をする場合は相手とタイミングを合わせますが、シリアル通信の場合はタイミング1度で1つのビットデータ(HighかLowか)
しか送れません。パラレルの場合は線の数だけ送れます。但し、線の数が増えると配線が大変になったり費用もかかるので、コンピュータ同士の通信はシリアル通信の場合が多いです。LANもシリアル通信の一種です。
シリアル通信にもいろいろあって、大きく「同期通信」と「非同期通信」に分かれます。
これも、線の数が少ない方がよいので、特に理由がなければ非同期の方がよく使われます。今回のPCとの通信もこの非同期シリアル通信で行います。
上の例ですと、どちらも始めに1、次に1、次に1、最後に0が送られたことになります。初めに送られたビットをビット0、次をビット1...とすると、値は0b0111となります。※
※2進数を表す場合は先頭に0bをつけます。bは英語で二進数を表す「バイナリ(binary)」の頭文字です。16進数を表す場合は先頭に0xをつけます。16進数は英語で「ヘキサデシマル(Hexadecimal)」です。数値の後にhを付けて16進数を表す場合もあります。
ビット番号が小さい方から送る場合を「LSBファースト」といいます。逆にビット番号から大きい方から送る場合を「MSBファースト」といいます。PICを含む、ふつうのマイコンの非同期シリアル通信(PCのCOMポートも含む)はLSBファーストになっています。
非同期シリアル通信のタイミングを詳しく説明すると、次のようになっています。
受信側ではあらかじめ決められたタイミング(通信速度)が設定されているので、各ビットを間違いなく受け取ることができます。逆に、通信速度を間違えると、全然違った値になってしまいます。
この例のように、大体は8ビット単位でデータが送信されます。スタートビットとストップビットが必要なので8ビット(1バイト)送るのには10ビット分の時間が必要になります。
PCもマイコン(PIC)も同じ非同期通信を行いますが、0と1を表す電圧がまったく違います。
ということで、電圧変換回路が必要になるわけです。
さいごに
次は実際にPIColoになにかをつないで動作させてみます。一番簡単なところでLEDの点灯から
。
2010年7月16日
|