PIC16F84電子遊戯(10) 最終更新日:2001年1月31日 温度計(1ページ)へ (2ページ) (3ページ)へ
温度計のポート割付 回路図に従ってマイコンのポートを割り付けましょう。
今回はPORTBは入力と出力に切り換えて使用します。
ポート名 入出力 機能 RA0 OUT 7セグ0.1℃選択 RA1 OUT 7セグ1℃選択 RA2 OUT 7セグ10℃選択 RA3 OUT A/Dコンバータ CS RA4 OUT A/Dコンバータ WR/RDY
ポート名 入出力 機能 入出力 機能 RB0 OUT 7セグ駆動 IN A/DコンバータDATA RB1 OUT 7セグ駆動 IN A/DコンバータDATA RB2 OUT 7セグ駆動 IN A/DコンバータDATA RB3 OUT 7セグ駆動 IN A/DコンバータDATA RB4 OUT −−−− IN A/DコンバータDATA RB5 OUT −−−− IN A/DコンバータDATA RB5 OUT −−−− IN A/DコンバータDATA RB7 OUT −−−− IN A/DコンバータDATA (温度計のポート設定) 温度計のポートの方向設定 ではソフト上でのポートの方向をレジスタに設定します。入力は「1」、出力は「0」です。
PORTBは入出力を切り換えて使用しますのでそれぞれの設定をソフト中に行います。
--- --- --- PA4 PA3 PA2 PA1 PA0 --- --- --- 0
0
0
0
0
(TRISA)
PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0 0/1
0/1
0/1
0/1
0/1
0/1
0/1
0/1
(TRISB) 温度計のタイマー割り込みの設定 今回のタイマー割り込みはLEDの表示変更をするタイミングに使用します。
約0.5秒ごとに表示を変更しますので、タイマー割り込みの基本となるプリスケーラ値は今までと同様に128分周にします。
発振子が4MHz時基本クロックは1usecなので、128usecごとにタイマーカウンタがアップします。その他の設定はテストボードの時と同じにします。(詳しくはテストボードのページを参照して下さい。)
ではレジスタにデータを設定しましょう。
RBPU INTEDG TOCS TOSE PSA PS2-0 1
0
0
0
0
1
1
0
(OPTION_REG) さて0.5秒を作る方法を考えましょう。まず128usecのタイマーカウントアップを使用して20msecごとにタイマー割り込みを掛けるようにします。
128usec x 156 = 19.968msec
128usecを156カウントして約20msecにします。
次にこのタイマー割り込みを25回カウントして約0.5秒にします。
19.968msec x 25= 0.4992sec
このタイミングでLED表示を切り換えることにします。次に定数を設定します。まず20msecの割り込みを掛けるためにタイマーカウンタに設定する初期値です。タイマー割り込みはタイマーカウンタがオーバーフローするごとに掛かります。従って初期値を255-156 = 99 = 63HにすればOKです。
tm0_setdata 63H (tm0_setdata) 次に0.5秒を刻むための初期値データです。25 = 19Hです。
cnt_setdata 19H (cnt_setdata) このタイマー割り込み処理で使用する作業RAMを設定します。
0.5秒のカウントのために、20mscの割り込みを何回カウントしたかのRAMが必要になります。これはcnt_setdataの初期値から減算してカウントします。ここのRAMが「0」になれば0.5秒経ったことになります。
count_data 0.5秒カウントまでの残り (count_data) 温度計のポート初期設定 マイコンが動作してからのポートの初期状態を設定します。
PORTAに接続されるポートの制御は全てアクティブLですので、初期値は全てHに設定します。
PORTBはLED表示ルーチン用の出力とA/Dコンバータ用の入力で使用しますが、とりあえずは次のように設定しましょう。
PORTA PORTB 0FFH 00H (ポート初期設定) 温度計の7セグメントLED表示 7セグメントLED表示は今までと同じくダイナミック点灯方式です。
簡単な動作の手順を説明します。
割り込みを禁止する PORTBを出力ポートに設定する 割り込みを許可する 0.1℃のデータをRB3-0に出力する RA0を「L」にする 時間待ち RA0を「H」にする 1℃のデータをRB3-0に出力する RA1を「L」にする 時間待ち RA1を「H」にする 10℃のデータをRB3-0に出力する RA2を「L」にする 時間待ち RA2を「H」にする これをメインルーチンで繰り返すことによりLEDを点灯させます。
PORTBを出力ポートに設定する間は割り込みを禁止しています。
表示するためのデータは次のRAMに格納しています。
ondo1_data ondo2_data ondo3_data 0.1℃のデータ 1℃のデータ 10℃のデータ 7セグの表示の時間待ちで使用するRAMです。
ここに初期値を入れてひとつずつ減算しながら0になるまで時間を待ちます。
前回の製作と同じく約770usecの時間を待ちます。
wait_data 時間待ち 温度計のA/D変換 A/D変換はAD7820を制御して行います。WRポートをLからHにした後、データバスに変換値がパラレル出力されます。
割り込みを禁止する PORTBを入力ポートに設定する CSをLにする WRをLにする WRをHにする PORTBをデータをadin_dataに入力する CSをHにする 割り込みを許可する このA/D変換はメインルーチンで繰り返し行われます。
変換後のデータはadin_dataに入力されます。
このICは意外と簡単にA/D変換が出来ますよね。メインルーチンで行っているのは7セグのLED表示とA/D変換のみです。
実際に表示するためのデータを作っているのは、割り込み処理の中で0.5秒ごとに行っています。
この処理については次回に説明します。この続きは(3ページ)へ
不明点などあればメールお願いいたします。nonchansoft@nifty.com
Copyright(c)2000-2001 nonchansoft