2018年
1月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2018-01-07 温度モニター

_ MsTimer2.hとWire.hを同時に使うときの注意点

年末年始に,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もうまく読める.