さて、ここからはEclipseを使ってソフト側である。今回は7セグメントLED 2桁と10個のLEDを使って、温度を0.1℃単位で表示する仕組みを入れてみたい。またスイッチ2つを使い、ON(温度を0.5秒毎に表示)、OFF(LEDの表示を全部消す。温度測定もしない)を切り替えられるようにしたいと思う。ということで、
「 I2C.c 」「 I2C.h 」「 Temp_RH.c 」「 Temp_RH.h 」「 teraic_includes.h 」の5つのファイルがある。このうち「 I2C.c 」「 I2C.h 」「 teraic_includes.h 」の3つを、そのままEclipseのProject Explolerの下にあるtemp_dispプロジェクトにドラッグ&ドロップして追加する(Photo09)。
このうちI2C.cは名前の通り、NIOS IIのPIOポートを使ってI2Cの通信を行うためのものである。ちなみにこのソースはTerasiが提供するものだが、Terasicの開発ボード上で利用する限り、利用や改変は自由ということになっているので、有難く使わせて頂いた。I2C.hはI2C.cで定義された関数を利用するためのヘッダファイルで、この2つは変更なくそのまま利用している。
一方、terasic_includes.hはList 3のようになっており、わざわざインクルードしなくても必要な指定と定義だけソースにコピーしても良かったのだが、一応こちらもそのままとした。ただ、先に述べた通り今回はタイマー関数を使ってない関係で、sys/alt_alarm.h や sys/alt_timestamp.h はインクルードするとエラーになる。そこでこの2つだけはコメントアウトしている(List 4)。
関数 | 概要 |
---|---|
LEDR_out() | numの値にあわせて該当するポジションのLEDを点灯。ちなみにnumが負の場合には全LEDを消灯する機能を追加。 |
HEX_out() | numの値にあわせて7セグメントLEDを点灯。ちなみにnumが負の場合には全LEDを消灯する機能を追加。digitは0(1の位)か1(10の位)のどちらか。 |
Read_Configuration() | Terasicの提供するTemp_RH.cから流用。I2C経由でHDC1000からConfiguration情報を取得する関数。RH_Temp_Sensor_init()内でのみ利用される。 |
Write_Configuration() | Terasicの提供するTemp_RH.cから流用。I2C経由でHDC1000にConfigurationを設定する関数。RH_Temp_Sensor_init()内でのみ利用される。 |
RH_Temp_Sensor_init() | Terasicの提供するTemp_RH.cから流用。HDC1000の初期化を行うもの。 |
main() | LEDの全消灯とHDC1000の初期化が終った後は、0.5秒毎にキーの状態を確認し、KEY_STARTが押されていたらFLAG=1、KEY_STOPが押されていたらFLAG=0をそれぞれ設定する。次いでFLAG=1の場合はHDC1000からI2C経由で温度のデータを取得し、それを変換したのち、LEDに表示する。 |
ちなみに温度変換の所で利用するロジックはHDC1000のDatasheetに記載されているものそのままである。正確には16bitの値を2^16で割ったものに165を掛けて40を引くというもので、HDC1000は−40℃で0x0000、125℃で0xFFFFを返すので、これを実温度に変換するのがこうした仕組みである。またこの変換の際に、謎のdouble型のtempという変数が利用されるが、これは teraic_includes.h の中で定義されている。
Copyright © ITmedia, Inc. All Rights Reserved.