|
setup diary |
年末年始に,arduino UNOを使った温度モニターを作ろうと思っていたが,時間が取れなった.ようやく時間ができたので,いろいろと試してみた.
I2Cで通信してADT7410から温度を取得する部分は,以前書いたプログラムを使えば良いと思っていたら,そのプログラムが実は間違っていたことが分かった.レジスタに格納されたデータを読み出すのだが,温度のデータは2byteで二つのレジスタに格納されている.これを1byteずつ読み出していたのだが,実は2byte一度に読み出さないといけなかったのだ.datasheetの一部を読んで1byteずつ取り出せば良いと解釈しまっていた.
一定の時間おきに,温度を測定するために,タイマーを使ってみた.MsTimer2.hを使ったのだが,MsTimer2::set(time,routine);でms単位の時間と呼び出すサブルーチンを指定して,MsTimer2::start();でタイマーをスタートするだけなので,問題無く動いた.しかし,タイマー割り込みの部分でi2cを読もうと思ったら,そこで止まってしまうことが分かった.調べてみると,i2cを読むWire.hでも,割り込みを使っているが,タイマーから割り込みがかかると,割り込みが禁止されてしまい,i2cが読めなくなっていることが分かった.そこで,タイマー割り込みがかかったときに,sei();を実行すれば,i2cもうまく読める.