はじめに
このページでは、ビギナー向けに、マイコンボードPIColoの開発方法を説明します。開発環境の用意や無償のCコンパイラのインストールについてはこちら、プロジェクト/プログラム作成についてはこちらを参照願います。LEDの点灯についてはこちらを参照願います。
※以下の情報は2010年7月現在のものです。ご注意ください。
PIColoについてはこちらを参照願います。
パーツリスト
パーツ |
型名 |
購入先 |
LED |
NSPW−500CS |
マルツの通販 |
抵抗1 |
47〜51Ω 1/4〜1/10Wのもの |
電子部品店 |
ケーブル |
センサーケーブル |
浅草ギ研及び販売店 |
タイマについて
マイコンにはタイマという機能があります。これはクロックをカウントして時間などを測定するものです。
PIC16F1936には次の5つのタイマーがあります。
Timer0:8ビットタイマで、外部クロックのカウントも可能
Timer1:16ビットタイマで非常に多機能。スリープ中もカウント可能。
Timer2,4,6:マイコン内部のクロックをカウントするだけの単純な8ビットタイマが3つ
ここでは一番使い方が簡単なTimer2(4でも6でも同じ)を使ってみます。
Timer2(4か6も同じ)についてはデータシートの17章に書いてあります。
概略はこのようなブロック図で表されています。
@まず、タイマーへのクロックの入力がFOSC/4になっています。FOSCはシステムクロックです。ここまでのプログラムと同じように32MHzで動作させると、1/4の8MHzがTimer2に入ってくることになります。
APrescalerはプログラムで設定できるプリスケーラ(分周装置)で、クロックを1/1、1/4、1/16、1/64に分周します。たとえば1/64に設定するとクロックが64回入ると1クロックの出力がTMR2に出て、カウントが1上がります。
BTMR2がカウンタ本体で、入ってきたクロックによりカウントアップを行います。TMR2の値はプログラムから読んだり、値を書き換えたりができます。
CPR2はあらかじめここに設定した値とTMR2が同じ値になったときに「割り込み」という動作を発生させます。割り込みは別なプログラムが走っていた場合でもこちらが優先で動き出す、というものです。割り込み信号はさらに後ろについているポストスケーラで分周できます。
プログラム
では実際に正確なタイミングで動くプログラムを作ってみましょう。
チュートリアルの1)〜3)をやった方ならば、すでにプロジェクトは作れるようになっているかと思います。適当なプロジェクトを作り、次のように main.c を作ってプロジェクトに追加してください。
念のため、上と同じ内容のテキストファイルを用意しました。
Timer.txt (右クリックで対象を保存)
ほとんど前回のLEDの点灯で行った内容と同じです。違う部分はウェイトを作る部分の行10〜20です。前回は適当なループ文でウェイトを作っていましたが、今回はタイマー2を使ってクロックをカウントし、ほぼ正確にウェイトの時間を作っています。
wait_ms という名前の通り、内部では1mSをカウントしており、引数value の回数繰り返すことによりmS単位のウェイトを作っています。
Timer2の設定および、動作の開始/停止は T2CON レジスタで行います。データシートでこの部分を見てみましょう。
TMR2ONビットを1にすると動作が開始します。ポストスケーラは今回は関係ありません。
プリスケーラで何分周にしたらよいか?というところが問題です。Timer2は8ビットカウンタなので、0〜255までしかカウントできません。255の次は0に戻ります。
クロックは32MHz、つまり1秒間に32,000,000のクロックが発生していますが、Timer2に入ってくるのはFOSC(32MHz)/4=8MHzなので1秒間に8,000,000クロックになります。1mSだと8,000クロックになります。この数値は8ビットではカウントできません。プリスケーラは4種類の設定があるのでそれぞれ当てはめてみますと、
■1:1 8000カウント
■1:4 2000カウント
■1:16 500カウント
■1:64 125カウント
となります。
1:64だと255以内の数値なので1mSをカウント可能です。ということで行11の設定となります。
行16を見ると、実際には124カウントしています。これは、前後のfor文やwhile文で多少時間を食うので1カウント減らして調整しています。
ここで気が付きましたが、行19はべつにこの値でなくても良いです。TIMER2ONビットが0になりさえすればなんでもいいです。(なぜこんな設定になっていたか、、、思い出せない)
メイン関数は次のようになっています。
wait_ms(500) で0.5秒のウェイトなので、1秒周期でLEDが点滅するプログラムになります。
さいごに
実際にはタイマーを使ってセンサーからのパルス長を計測したり、逆に正確な長さのパルスを出しつづけたり、というのに使います。ホビーロボットでよく使われているラジコンサーボはパルスで制御しますのでタイマーの使い方がわかっているとサーボを動かすことも可能です。次はラジコンサーボの駆動方法について。
2010年7月20日
|