はじめに
このページでは、ビギナー向けに、マイコンボードPIColoの開発方法を説明します。開発環境の用意や無償のCコンパイラのインストールについてはこちら、プロジェクト/プログラム作成についてはこちら、スイッチ入力についてはこちら、モータ駆動についてはこちらを参照願います。
※以下の情報は2010年7月現在のものです。ご注意ください。
PIColoについてはこちらを参照願います。
パーツリスト
【モータ制御用】
パーツ |
型名 |
個数 |
購入先 |
モータ |
マブチモータ(RE-140など) |
1 |
模型店など |
トランジスタ |
2SC1815 |
1 |
電子部品店 |
抵抗1 |
100Ω 1/4〜1/10Wのもの |
1 |
電子部品店 |
抵抗2 |
10KΩ 1/4〜1/10Wのもの |
1 |
電子部品店 |
基板 |
小さめのユニバーサル基板 |
1 |
電子部品店 |
コネクタ |
2mmピッチピンヘッダ |
1 |
浅草ギ研及び販売店 |
ケーブル |
センサーケーブル |
1 |
浅草ギ研及び販売店 |
【スイッチ、LED用】
パーツ |
型名 |
購入先 |
LED |
NSPW−500CS |
マルツの通販 |
抵抗1 |
47〜51Ω 1/4〜1/10Wのもの |
電子部品店 |
抵抗2 |
10KΩ 1/4〜1/10Wのもの |
電子部品店 |
ケーブル |
センサーケーブル |
浅草ギ研及び販売店 |
スイッチ |
プッシュスイッチ(てきとうなもの) |
電子部品店 |
今回の回路は、3)LEDの点灯とスイッチの入力、7)DCモータ駆動の回路と同じです。回路の作成と接続についてはそれらのページを参照ねがいます。接続する端子の位置も同じです。
状態変化割り込み
RCサーボの駆動のところではタイマ割り込みを使いました。割り込みにはもっとたくさんの種類があります。ここでは外部入力の「状態変化割り込み」というものを使ってみます。
たとえば、何かのスイッチ入力をしたいとします。以前の方法だとずっとスイッチの状態を関しいていなければならないので他の処理ができません。スイッチの入力が割り込みになると便利です。そのようなときに状態変化割り込みをつかいます。これについてはデータシートの7章に書いてあります。
状態変化割り込みはPORTBの全部の端子が使えます。手順は次の通り。
1)IOCBP又はIOCBNレジスタで、各端子が立ち上がりか立下りどちらで反応するかを決めます。
2)割り込みを有効にします。
3)割り込み条件になると割り込み関数が実行されます。状態割り込み自体のフラグはIOCIFフラグになりますが、これは自動的にはクリアされないので、割り込み関数内でクリア(0にすること)します。
8個ある端子のどの端子が変化したかはIOCBFレジスタで確認できます。IOCBFも自動的にクリアしないので、割り込み関数無いでクリア(0にすること)する必要があります。
プログラム
いままで、モータとLEDとスイッチの回路を作ってきました。今回は、「モータが1秒おきに回転している。B1、B2、B3にプッシュスイッチがつながっている。B1はモータの緊急停止ボタン、B2を押すとLEDが2回点滅、B3を押すとLEDが3回点滅」というプログラムを考えてみます。
念のためテキストファイルも用意しました。適当なプロジェクトを作ってコピーしてください。
INT.txt (右クリックで対象を保存)
〜行20までは前回までと同じです。
行22〜行31はLEDを点滅させる関数です。引数の回数だけ点滅します。ウェイトにwait_msを使っていません。これはメインループ(行63〜68)でwait_msを使っているので、割り込みでも使うとTimer2が重複されて使われる形となり、暴走します。よって別な形でのウェイトを単純なfor文で作っています。Timer4,6は使ってないのでそれらを使うのでもよいでしょう。
行33〜44が割り込み部です。その前に行51〜60の設定の方から説明します。
PORTBはアナログ入力ポート共用なのですが、起動直後はアナログに設定されているので行52のように該当端子をデジタルに設定します。ここでは面倒なので全部デジタルにしています。
RB0がLED出力、RC2がモータ出力なのでそれらを行53,54で出力に設定しています。
行57は不要ですが、もし立ち上がりエッジで設定するならこのレジスタで設定します。ボタンは「常にHigh,ボタンを押すとLow」なので、ボタンを押すと波形が「立ち下がる」形となりますので行58のIOCBNレジスタで該当端子を設定します。ここではRB1〜3にスイッチ回路がついているとします。よってその3つに該当する位置を1にします。
行59で割り込みフラグをクリアしています。
行60は全体の割り込みを設定するレジスタで、PEIE:周辺機器割り込みを有効にし、GIE:全体的な割り込み許可を許可にしています。これで割り込みが発生する設定になりました。
割り込みが発生したら static void interrupt isr(void) の関数が実行されます(これはHITECH−Cの仕様)。状態変化割り込みのフラグはIOCIFなのでまずこれをクリアします。これをクリアしわすれると次の割り込みが発生しません。
どの端子が割り込みになったかはIOCBFレジスタの各ビットた1になったかで判定します。
最後にIOCBF自体もクリアします。
実行の結果、意図したとおりの動作となりました。
さいごに
とりあえずここまでで、ホビーロボット作成などによく使われそうな機能を説明しました。PIC16F1936の機能としてはもっといろいろあります。たとえば
・2つの電圧を比較し、条件になったかどうかを判定する「コンパレータ」
・タッチセンサーとしても使える容量検知モジュール
・SPIやI2Cなどの通信機能
・液晶ディスプレイ駆動
・内蔵EEPROM(電源を切ってもデータ保持)
・長期間駆動を可能にするスリープ機能
などがあります。
これらについては余裕があるときにまた説明するかもしれません。当面はデータシートをよく読んで、使い方を理解してください。データシートは1度読んだだけでは私でも理解できません。複雑な機能になると数日かけて調べるということもあります。またデータシートだけの情報では不十分な場合もありますので、インターネットの情報などもあわせて活用してください。
2010年7月23日
|