はじめに
前回はプロジェクトの作成からプログラムの転送までを行いました。ここでは実際に自分でプログラムを作ってみます。また、電子回路の中では一番簡単なLEDの点灯について解説します。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※以下の情報は2007年11月現在のものです。ご注意ください。
準備
A33Fの電源を入れるため、USBケーブルをPCへつないで下さい。
A33Fにプログラムを転送するので、ICD2経由でPCへつないで下さい。
LEDについて
LED(Light Emitting Diode)はダイオードの一種で、決まった電圧を加えると光ります。電球のように大電流を必要としないので、電子回路の表示装置によく使われます。
ダイオードなので、一方方向にしか電流が流れません。プラス側を「アノード」、マイナス側を「カソード」と言います。
回路図での記号は次のようになります。
電子部品店などでは、砲弾型のプラスチックに入ったものが50〜数百円で売られています。砲弾型の場合は足が長い方がアノード、短い方がカソードになります。
A33Fでは実装面積の都合で、小さいチップタイプのLEDが付いており、dsPICでON/OFFを制御できるように配線されています。
LEDの駆動
LEDは種類によって光の色や輝度などが違います。また、どのぐらいの電流を流すと光るかも決められています。これは大体数mA〜数十mAぐらいのものが多いです。LEDはダイオードなので、LEDを通過すると電圧が下がります。これも種類によって違いますが大体2Vのものが多いです。つまり、アノードはカソードよりも電圧が2V以上高くないと光りません。
では、アノードとカソード間に単純に2V以上の電圧、例えば乾電池2個で3Vをつなげば光るのでしょうか?このように直接電源とつなぐと、LEDの抵抗が低いので非常に大きな電流が流れてしまい、LEDが破壊されます。
では、マイコンのように小さい電流を使うもので電圧を加えればどうでしょう?マイコンの場合は「入ってくる電流」と「流れ出る電流」の最大値が決まっています。
下はdsPIC33Fのデータシートの電気的特性のはじめのページです。電気的特性では最大定格が表示されております。最大定格は「それ以上は壊れる」という限界値を表すものです。下の方に「すべてのI/Oピンの最大シンク(又はソース)電流・・・4mA」とあります。シンク電流はI/O端子に流れ込む電流、ソースは流れ出る電流を表します。つまり、dsPIC33FのI/O端子は4mA以上流すと壊れるということがわかります。
マイコンでLEDを点灯するには次のように2つの方法が考えられます。上は端子をLOW(0V)にするとLEDのアノードからカソード間の電圧に2V以上の差ができるので電流が流れてLEDが点灯します。(その下はその逆)。
しかし、下の図のように直接接続した場合は、乾電池を直結したときと同じようにLEDには大量の電流がながれようとします。そしてマイコンの端子が流せる電流以上の電流が流れ込もうとして(または流れ出ようとして)、マイコンの端子がつぶれてしまいます。
※A33Fではこの図の上のパターン(端子を0Vにしたときに光る)を採用しているので、以後、このパターンでの説明
電流の量を制限するには抵抗を使います。
オームの法則
では、抵抗の値はどのようにして決めたらよいでしょうか?それにはオームの法則を使います。
<オームの法則>
電圧=電流x抵抗
電流=電圧/抵抗
抵抗=電圧/電流
電圧はV、電流はI、抵抗はRで表します。
上の3つの式はどれも同じことを意味しています。下のように覚えると良いでしょう。
抵抗値の計算
電圧と電流がわかればオームの法則により抵抗値が決まります。
dsPICの端子は4mAまでしか流せないので、LEDも4mA前後で光るものを選びました。
まず、電流を考えます。LEDに4mA流せばよいのですが、1つの経路内で流れる電流は同じですので抵抗にも4mA流すことになります。
次に電圧ですが、LEDのアノードは3.3Vが加わっています。LEDでは電流が流れると約2V電圧が下がります。dsPICの端子は0Vです。ということで3.3−2=1.3Vが抵抗の両端の電圧差、つまり抵抗部での電圧になります。
4mAは0.004Aです。
オームの法則より、抵抗=電圧/電流 ですので、1.3/0.004=325 となり、325オームをつければ電流を4mAに制限することができます。。
実際の回路
A33F上の実際の回路は次のようになっています。(全回路図は製品に添付しています)
計算では325オームになりましたが、これはあくまでも最大定格であり、たとえば抵抗の値にバラツキがあって4mAを超えてしまうかもしれません。ということで実際には4mAよりも小さい電流が流れるように、325オームよりも大きな抵抗をつけています。実際には1Kオームの抵抗がついていますので、電流は1.3mAに制限されています。
dsPIC側は17番端子のTMS/RA0につながっています。TMS機能とRA0機能が17番端子で共有になっており、プログラムの設定でどちらの機能を使うかを決めます。TMSというのはJTAG(ジェイタグ)という方式の通信で使う機能で、A33Fでは使いません。RA0は汎用入出力という種類のもので、端子をHIGH(3.3V)にしたりLOW(0V)にしたりします。
汎用入出力
マイコン開発で、ある端子をHIGH/LOWに出力したり、ある端子がHIGHなのかLOWなのかを検出したりすることを汎用入出力、GPIO(Geneal
Purpose Input Output:汎用入出力)、I/Oポート、パラレルI/Oなどと呼びます。マイコンの端子の一番基本的な使い方だと言ってよいでしょう。
dsPIC33FJ256GP710には汎用入出力が85端子あり、数個ごとにグループ化されてます。LEDは「RA0」につながっていますが、はじめのRは汎用入出力を表し、次がブループを表し、最後の数字がグループ内の番号を表します。つまりRA0はグループAの中の0番の汎用IO端子、ということを表しています。グループはAからGまであり、それぞれポートA,ポートB...というように表現します。
この汎用入出力の使い方を覚えればLEDを制御できます。
dsPIC33Fの場合、使い方について書いてあるドキュメントは2つあり、
dsPIC30F_Reference.pdf
dsPIC33F_Datasheet.pdf
があります。dsPIC33Fデータシートの方はは33F特有のハードウェアや機能の名称などについて書いてありますが、機能の使い方などはあまり詳しくかいてありません。機能の使い方などはdsPIC30Fのリファレンスマニュアルの方を読んで学んでいきます。
基本的にはこの2つのドキュメントを通して使い方を体得していただくのですが、ここではLED点灯に必要な部分だけを説明いたします。
dsPIC30Fリファレンスの11章は汎用入出力についてかいてあります。このドキュメントでは単に「I/Oポート」という見出しになっています。重要な部分は11.2で、ここで使い方が説明されています。読むと、3つのレジスタで操作すると書いてありますが、LATxは今回使いません。レジスタについては次の節で説明します。
レジスタ(特殊レジスタ)
マイコンは「レジスタ」という記憶装置があり、これを使って計算や設定を行います。マイコンの機能を設定したり、状態を表したりするレジスタを特殊レジスタ、SFR(Special
Function Register:特殊機能レジスタ)と言います。
レジスタはメモリの1部として組み込まれており、メモリの番地を指定して値を読み書きすることで設定を変えたりします。33Fデータシートの3章はメモリ構成について書いてありますが、ここの図3−5にメモリマップがあります。これを見ると、「2kバイトSFR空間」というところが先頭に方にあるかと思いますが、ここがSFRの領域になっています。
レジスタは通常、マイコンの基本のビット幅の大きさがあります。dsPIC33Fは16bitマイコンなので特殊レジスタも16ビット幅になっています。下は3章の特殊レジスタのマップのなかでポートAについて書かれている部分です。「アドレス」のところを見ると、上のSFR空間の中にマッピングされているのがわかります。
先の説明(30Fリファレンスの11章の11.2)を読むと、TRISxレジスタで入力なのか出力なのかを設定して、PORTxで実際にHIGH/LOWを出力したり入力したりする、ということがわかります。LEDはRA0、つまりポートAの0番端子につながっているので、TRIS"A"のビット0「TRISA0」を0にすると出力に設定できます(11.2.1を読んでください。)。
その上でPORTAのビット0「RA0」を1にするとHIGH、0にするとLOWになるのがわかります。
<まとめ>
1)TRISAのTRISA0を0にして、RA0を出力に設定
2)PORTAのRA0を0にするとLOW(LEDは点灯)
3)PORTAのRA0を1にするとHIGH(LEDは消灯)
実際のプログラミング
<プロジェクトの作成>
まずは、前のページでおこなったようにプロジェクトを作成します。前のページでプロジェクト作成について説明しましたが、念のためもう一度説明します。新しいプロジェクト用のフォルダを作成してください。名前はなんでもかまいませんが、ここではとりあえず「LED_ON_OFF」にしました。
新しいプロジェクトを作成するには「Project」−>「ProjectWizard」を押します。
Project Wizardが開くので「次へ」を押します。
デバイス(CPUチップ)の選択になりますので、A33Fに搭載されている「dsPIC33FJ256GP710」を選択します。その後「次へ」を押します。
プログラム言語の選択になりますのでActive Toolsuite で「Microchip C30 Toolsuite」を選んで「次へ」を押します。
プロジェクト管理ファイルの名前とフォルダの指定になります。先に作っておいたフォルダを指定しますので「Browse」を押します。
先ほど作ったフォルダを指定し、「ファイル名」の中にプロジェクト管理用のファイル名を入れて「保存」を押します。
前の画面にもどりますが、「Browse」の横にファイルパスが表示されます。表示が日本語Windowsと若干違いますが、MPLABは英語のソフトなのでこのようにパスの表示などが日本のとは異なります。とくにフォルダを表す記号は、日本では¥ですが、英語ではバックスラッシュ(左上から右下への斜め線、日本語ソフトでは出ないが¥キーを押すのと同じ)になります。
「次へ」を押します。
プロジェクトへ追加するファイルがあればAddを押して追加します。実は常に必要なファイルがいくつかあるのですが、この画面で選択するのが結構めんどうなので、ここでは何も追加せずに「次へ」を押します。
最後の確認画面になります。なにか変更があれば戻るボタンでもどって変更できます。「完了」を押してプロジェクトを作成します。
<ファイルの追加>
プロジェクト作成直後はこのように何も表示されていないか、もしくはプロジェクトウィンドウが1つ開いているかだと思います。プロジェクトにはもう少しファイルが必要なのでそれをプロジェクトに追加します。
プロジェクトウィンドウを開くには、「View」−>「Project」を選びます。
すると下の「プロジェクトウィンドウ」が開きます。このウィンドウで必要なファイルなどの管理を行います。
Source Filesのフォルダはソースファイルをプロジェクトに登録したときにここにファイル名が表示されます。ソースファイルは実際に我々が書くプログラムをさします。
Header Filesのフォルダにはヘッダファイルが表示されます。ヘッダファイルは、CPUの機能の名称の定義などが書かれているファイルです。
dsPIC33FJ256GP710(A33FのCPU)を開発するには最低でも
p33FJ256GP710.h
libp33FJ256GP710-coff.a
p33FJ256GP710.gld
の3つのファイルをプロジェクトに追加する必要があります。
まず、必要なヘッダファイル「p33FJ256GP710.h」を追加します。プロジェクトウィンドウの「Headder Files」
を右クリックして、「Add Files...」を左クリックしてください。
ファイルの選択のウィンドウになりますので、「ファイルの場所」で下の場所を選択してください。かなり長い階層になりますので注意して下さい。
そのhフォルダの中には、C30で開発できるチップのヘッダファイルがあります。これらのヘッダファイルでは主に、ピンの名称や機能の名称およびその設定値について定義しています(詳しくは後で)。その中で、A33FのCPUと同じ名前のファイル、p33FJ256GP710.h を探して指定し、「開く」を押します。p33FJ128GP710.h や
p33FJ256MC710 というのもありますので間違いないように注意して下さい。間違った場合は、プロジェクトウィンドウ上のファイル名を右クリックし、「Remove」を選択するとプロジェクトから外されます(ファイルが消えるわけではない)。
すると、指定したファイルが追加され、ウィンドウに表示されます。firstLED.mcpの横に*マークが付いていますが、これは、「変更したがまだ保存していない」ことを表します。
プロジェクトの設定などを変えた場合はSave Workspace アイコンを押して設定を保存します。
保存されると*マークが消えて、保存されたことを表します。
次にLibrary Files を右クリックし、Add Files を選択してlibp33FJ256GP710-coff.a を追加します。場所は下の階層にありますので指定してください。
これも、同じようなファイルがあるので「256」の部分と「GP」の部分を間違わないように注意して選択してください。
下のように追加されればOKです。
次にLinker Script を右クリックし、Add Files を選択してp33FJ256GP710.gld を追加します。場所は下の階層にありますので指定してください。
これも、同じようなファイルがあるので「256」の部分と「GP」の部分を間違わないように注意して選択してください。
下のように追加されればOKです。
Save Workspace アイコンを押して設定を保存します。
<ソースファイルの作成>
プロジェクトの準備ができたら、次はいよいよプログラムの作成、つまりソースファイルの作成になります。今回はとりあえず、こちらで用意したソースプログラムを使います。下のリンクを右クリックして対象を保存、で、先ほど作成したフォルダにコピーしてください。
LED_ON_OFF.c
このファイルをいままでおこなったようにしてSource Files に追加してください。追加したら、ファイル名「LED_ON_OFF.c」をダブルクリックすると、ソースファイルが開きます。
ソースファイルは色別に表示されます。緑色の部分がコメント、青が予約文字(C言語であらかじめ使うのが決められている文字列)、その他が黒になります。
このプログラムでは、おおきく4つの部分にわかれています。
<ヘッダファイルインクルード部分>
SFRの構造の記述などは、機種によって決まっていますので、毎回、細かくプログラムを書くのは面倒です。通常はチップごとのSFRの構造や変数形式の記述は「ヘッダファイル」というものにまとめて書いておき、プログラムをコンパイルする段階でインクルード(組み込み)します。このあたりの詳細はC言語の解説本などを参照願います。
通常、マイコン用のC言語の場合は、メーカーがヘッダファイルを供給してくれる場合が多いのですが、C30の場合も、チップごとのヘッダファイル用意されています。
上の5行目はこのファイルを使いますという宣言をしています。
<ヒューズ設定部分>
通常、マイコン開発では、ハードウェア的な設定をヒューズ設定と言います。CPUのクロック元をどこから取るのか、ウォッチドックタイマを使うか、コードプロテクトはかけるか、などの設定を行います。ビギナーの方はなんのことかわからないと思いますので、当面はヒューズ設定はこのソースの通りにして下さい。この設定では内部クロックで最速に動く設定になっています。クロックについては後で説明します。
<ms wait 部分>
これは筆者が作った「?ms間なにもしない」というプログラムです。内容については後で説明します。プログラム中にwait_ms(
) と書いて括弧の中に数値を入れると、その数値xmS間なにもしません。C言語ではこのようにある特定の働きをするプログラムを「関数」といいます。
以上3つの詳細については後のページで詳しく説明します。この次からがこのページの本題部分となります。
<メインループ部分>
C言語では、プログラムは「関数」という単位で動きます。その中でもmain(メイン)関数は一番初めに実行される関数で、プログラムの中心部分です。
C言語の関数の形は
戻り値の型 関数名(引数)
{
}
のようになります。戻り値の型、引数については後で説明します。関数名をmainにするとそれがmain関数になります。その後の{ }で囲まれた部分にプログラムを書きます。各プログラム行の最後に「;」を付けることになっています。
下はメイン関数の部分です。マイコンの場合、メイン関数はずっとくりかえし動かす場合が多いので「メインループ」と言う場合もあります。
メインループは大きく3つの部分になっています。
1)動作クロック部分
CPUの動作クロック(動作スピードのようなもの)を設定しています。詳しくは後で書きますが、この部分の設定と、先のヒューズ設定により、CPUは36.85MHz相当で動くようになります。クロックについては後で詳しく説明します。
2)IO設定部分
先のLEDの点灯の説明で、RA0を出力に設定する方法を説明しましたが、行44でそれを行っています。SFRの特定のビットを1や0にするにはこのように記述します。ポートAの0番ピンであるRA0を出力に設定しています。おなじようにして特定の端子を出力に設定できます。たとえば、ここでは行いませんが、後のサーボ駆動のところではRD4やRF0を出力に設定するのですが、それぞれ
TRISDbits.TRISD4
= 0;
TRISFbits.TRISF0
= 0;
のようになります。
3)LED点滅部分
同じようにSFRとして割り当てられているPORTAの0番端子に相当するビットを0や1にすることでLOWやHIGHにできます。行48ではRA0を0、つまりLOW、つまりLED点灯となります。行50ではRA0を1、つまりHIGH、つまりLED消灯となります。
Save Workspace アイコンを押して設定を保存します。
プログラムのビルド
次はプログラムを「ビルド」します。ビルドについては前のページで説明しましたが、念のためもう一度説明します。ビルドは、Cコンパイラ(C30)を起動して、必要なファイルをソースファイルに結合し、dsPICが読める形式に変換する一連の作業をします。
ビルドをする場合、モードが2つあります。1つは実際に稼動する時のプログラムに変換する「Release(リリース)」モード、もう一つはプログラムを作成中に何回もテストを行う「Debug(デバック)」モードです。
今回はテストですのでデバックモードを選択します。下のようにしてDebugを選択します。(MPLABのツールの中)
モードを切り替えると下のように注意をうながすウィンドウが出てきます。内容は「モード切替によってビルドの内容が変わります」というようなものです。チェックボックスにチェックを入れると次からはモード切替ごとにこのウィンドウは出なくなります。(ビギナーの場合は、この手のウィンドウは出した方がよいと思うので、チェックを入れないことをお勧めします)。
「OK」を押すとウィンドウが閉じます(特になにかおきるわけではない)。
ビルドを開始するには、F10キーを押すか、「Project」−>「Make」を選択します。
ビルドすると、Outputというウィンドウが開いて、ビルドの内容が表示されます。最後にBUILD SUCCEEDED: ...
と表示されるとビルドが成功したことになります。SUCCEEDEDは成功した、の意味です。
下はビルドが失敗した時の例です。最後がBUILD FAILD:... となっています。FAILDは失敗したの意味です。青字の部分に
firstLED.c:66: error xxx とあります。はじめの文字はソースファイル名で、次の番号は行番号を表します。次のerrorがエラーが起きたことを表し、その右に詳細の説明が入ります。この行をダブルクリックすると、問題の行へとびます。errorが1つでもあるとビルドは成功しません。error(エラー)よりも深刻ではないものにwarning(ワーニング)があります。これは”注意”の意味で、動くかもしれないけどきちんと動かない可能性があるという意味です。ワーニングはいくつあってもエラーが無ければビルドは成功します。
プログラムの書き込み
次に、ICD2を経由してソフト的にMPLABとdsPICを接続します。下のように「Debugger」−>「Select
Tool」−>「MPLAB ICD 2」を選択してください。
直前にdsPIC33F以外の開発をしていた場合は、下のようにICD2のダウンロードプログラムを33F用に書き換えるかどうか聞いてきますので「OK」を押します。
準備ができると、下のように MPLAB ICD2 Ready と出ます。
もう一度、接続されているかを確認する場合には「Debugger」−>「Connect」を選択します。問題なく接続されている場合には上のようにOutputにもういちどReadyが表示されます。
ここの表示が違った場合はもう一度上からやり直してください。
次に、Program target device(下の画面)アイコンを押すか、「Debugger」−>「Program」を押してください。
正常にプログラムが転送されると転送、内容確認がされ、下のように(下から3行目) ...Programming succeeded
と表示されます。
動かしてみる(デバックモードのRUN)
現在、デバックモードでA33FとMPLABがつながっています。この場合、MPLABからRUNするとdsPICのプログラムが実行されます。プログラムの実行はRUNアイコンを押す
又は、「Debugger」−>「Run」を選択する、又はF9キーを押します。
プログラムが実行され、LEDが点滅したかと思います。
このプログラムではずっと同じ動作をしますので、止めたい場合はHaltアイコンを押す
又は「Debugger」−>「Halt」を選択する、又はF5キーを押します。
Haltは一時停止するだけなので、RUNを完全に止めてMPLABを通常状態にしたい場合はResetアイコンを押す
又は「Debugger」−>「Reset」−>「Prosessor Reset」を選択する、又はF6キーを押します。
おわりに
次は、プログラムで計算した結果をモニタしてみます。
2007年11月24日
|