■課題01■
■練習課題■
図(OAKS16プログラミングテキストより引用)のようにLED点灯を移動させる動作を無限に繰り返せ.(サンプルを参考にして,タイマー機能を使って0.5秒間隔でLED一つ分移動するようなプログラムを作成せよ.)
ヒント
- タイマーの設定値を変更して,まず時間間隔を変更すること.サンプルプログラムではカウント値が4999から0になるまで数えていて,それがちょうど1秒分.では,0.5秒にするためには?
- LED(p7)は,8ビットの値を書き込んで,8個のLEDを点灯させる
- アニメーションのように,点灯するLEDが移動して見えるようなデータを次々書き込めばよい.(とりあえず最初は,右端に戻ることは考えない)
p7 = 0xFE; //2進で 1111 1110 (点灯するLEDが右端1つだけにするデータ)->LED(port7番)に書き込み
↓ 0.5秒後
p7 = 0xFD; //2進で 1111 1101 (点灯するLEDが右から2つ目だけにするデータ)->LED(port7番)に書き込み
↓ 0.5秒後
p7 = また1つ分移動したように見せるためのデータ //それをLEDに書き込み
↓
(以下略)
しかし,アニメーションのようにあらかじめ自分で計算して全部のデータを用意しておくのは大変.
一つ前のデータから次のデータをプログラムで計算して出せるようにすれば楽になる.ひとつ前のデータを記憶するためにひとつの変数を用意する.ここでは仮に「p7buf」という名前だとする.
p7 = p7buf = 0xFE; //2進で1111 1110 (初期値)を,p7だけでなくp7bufに書き込んで記憶しておく
↓ 0.5秒後
p7 = p7buf = 前のp7bufを使って計算したデータ //2進で1111 1101 になるように,p7bufに記憶されている直前のデータを1つ移動させる
↓ 0.5秒後
p7 = p7buf = 前のp7bufを使って計算したデータ //以下同様に,1つ移動するように計算
↓
(以下略)
これは0.5秒間隔で同じことをしている.繰り返し文で簡単にかける.まずp7bufを初期化する.
p7 = p7buf = 初期値; //p7bufに初期値を格納して,LEDを点灯
そして次の部分を繰り返せばよい.これを0.5秒に一回だけ実行したいのだから,サンプルプログラムのどの部分に書けばよいのか.
p7 = p7buf = 前のp7bufを使って計算したデータ
p7は出力ポートなので,p7から値を読み出すことはできない.だから,別の変数(p7bufなどの)を用意してデータを保存しておく必要がある.
「1つ移動」するとは,すなわちシフト演算である.
ただし,シフト演算は次のように点灯したい所を1として表現したデータでないとうまくシフトできない.右のように点灯したいところを0にしたデータではシフトできない.しかし,LEDを点灯させるためには右のようなデータでないと点灯できない.さてどうしたらよいだろうか.
00001000 11110111
↓ ◎ ↓ ×
00010000 11101110 ←シフトすると0が埋められてしまう!!
最後に,左端までいったら,p7bufの値を初期値に戻す必要がある.
左端までいったかどうかは,p7bufの内容を調べて左端を表示した状態のデータと一致するかどうか条件判定すればよい.
■必修課題■
練習課題を少し変更する.右から左へLED点灯が移動して左端まできたら,今度は移動する方向を逆にして,左から右へ移動するようにせよ.
そして右端まできたらまた方向を変えて後は同じ動作を繰り返すようにせよ.
ヒント
■応用課題■
1/10秒精度のストップウォッチを作成せよ.表示はLEDで1/10秒を二進数の1として表示する.つまり,プログラミングテキストP79のように,1/10秒ごとに二進数をカウントアップさせよ.カウントが8bitからあふれたとき(25.6秒)以降はその分を単純に無視して,また0秒に表示が戻ってしまって構わない.sw9がスタート/ストップボタン、sw10をクリアボタンとする.
ヒント
- 必修問題とはタイマーの設定を変更して1/10秒にする.
- 必修問題とは異なり,1つ移動させるのではなく,表示させるデータは前回表示させたデータに+1(カウントアップ)させたデータを計算
- sw9とsw10の読み方は前回参照.ただし,前回のようにwhile文を使ってswが押されるのを待つようにすると,sw が押されるまでプログラムの実行が止まってしまう.
- while文ではなく,if文で1回だけチェックして,押されていれば何か命令を実行し,押されていなければそのまま通常動作を続行するようにしておくこと.
- (注意)OAKS16プログラミングテキストのP63に書いてあるチャタリングが発生するため,swが押されていたときには,100ミリ秒(1/10秒)くらいなにもせずに待つ必要がある.
■締め切り■
- 実験時間中
- 必修まで動作したら,白板の一覧表に○を書き込む
- 応用までできたら,◎を書き込むこと
- 必修が終わらない限り,帰ってはいけない