第34回 チャレンジ課題

SPI通信とデバッグ機能のチャレンジ課題に挑戦してみます!

目次

SPI通信で湿度データを1バイト読み取る

前回の記事で、SPI通信を使って温湿度・気圧センサーのIDを取得するプログラムを、デバッグ機能を利用して実行しました。

そこで、チャレンジ課題として湿度データの読み取りもしてみたいと思います。


湿度データはメモリマップで次の場所にあります。

湿度データは2バイトで構成されています。

アドレス0xFDには湿度データの上位1バイト、0xFEには下位1バイトが格納されています。

ここに格納されているデータですが、電源投入後に測定指示しない限り、温湿度・気圧データはデフォルトの値が入っています

上の表に書かれている通り、湿度データの上位バイト(0xFD番地)には0x80が入っています。

そこで、湿度データの上位1バイトを取得するプログラムを作成し、デバッグ機能を利用して実際に0x80が取得できるか確認してみてください。

正しい値の0x80が取得できたかどうか、LEDの色でも表現してみてください。

うまくデバッグできないケース

湿度データを1バイト読み取るだけのプログラムを作成した場合、うまくデバッグできないケースがあります。

例えば次のように、変数humidityに読み取った値を代入して、そのあと動作を停止する、というケースです。

// 湿度データの読み取り
uint8_t humidity = 読み取った1バイトの湿度データ;

// 動作停止
while(1) {
}

このようなプログラムの場合、コンパイラは最適化を行い、humidityという変数をメモリ上に確保しないことがあります。

もう少し具体的に説明します。

上のプログラムでは、humidityという変数に湿度データを代入したあと、humidityを使う処理は何もしていません。

このような場合、コンパイラは次のようなことを考えます。

「プログラムではhumidityという変数が書いてあるけど、そのあと、この変数は使われていないよね。メモリがもったいないからhumidityはメモリ上に確保するのはやめよう」

このように、humidityを保存する場所はメモリ上には確保されない、ということが起こります。

このようにhumidityという変数の保存場所がメモリに確保されないと、デバッグ時にその値を確認することができなくなるので、結果としてこの変数の値が確認できない、という現象が発生します。(このようなケースでは、変数の値は一時的なレジスタに保存されます。このレジスタはプログラム上には表現されていないため、デバッグ機能ではその値を確認することができません)


この現象を避けるには、例えば次のように変数humidityを使った処理を入れる、という方法があります。

// 湿度データの読み取り
uint8_t humidity = 読み取った1バイトの湿度データ;

// humidityを使った処理
if( humidity == 0x80 ) {
  // LEDの制御など
}

// 動作停止
while(1) {
}

もし、他のプログラムをデバッグしているとき、変数の値を確認できないという状況が発生したら、このことを思い出してみてください。

SPI通信で湿度データを2バイト読み取る

湿度データは実際には2バイトです。そこで、湿度データ格納用に次の16ビットの変数を宣言し、この変数に湿度データを代入するプログラムを作成してみてください。

uint16_t humidity;  // 16ビットの湿度データ

デフォルト値を読み取った場合、humidityには0x8000が代入されるはずです。デバッグ機能を利用して実際に0x8000が取得できるか確認してみてください。

また、正しい値の0x8000が取得できたかどうか、LEDの色でも表現してみてください。


ここで、2バイトのデータの読み取り方法を補足します。

2バイトの湿度データを読み取る場合、最初に上位1バイト(0xFD番地)を読み取ったあと、次に下位1バイト(0xFE番地)を読み取る、というように、1バイトずつアドレスを指定しながら読み取ることができます。

この温湿度・気圧センサーは、このように連続したアドレス読み取りをしやすくする仕組みがあります。

次のようにアドレス指定後、クロックを継続して送ると、センサは次のアドレスのデータ、その次のアドレスのデータ、というようにアドレスを1つずつ増やしながらデータを送ってきてくれます。(クリックすると拡大できます)

ぜひこの機能を利用してプログラムを作成してみてください。


すでに8ビット送信の関数、8ビット受信の関数は作成していますので、これらの関数を使用してSPI通信手順を実現すれば連続データ読み取りができるはずです!

更新履歴

日付内容
2018.5.12新規投稿
2025.8.4コンパイラの最適化補足
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次