いきさつ
今使っているマザーボードSY6BAにはLM78がのっている。LM75もある。LM78は電源の電圧、FANの回転数、温度がわかり、設定値になったときに割り込みをかけたりできる。またLM75は温度の測定と監視ができる。だが、このマザーではBIOSでしか温度などを見ることができなかった。その手のツールが付いていないのだ。それらしきツールを5〜6個見つけて実行してみてもうまく表示されない。ASUSなんかとは仕様が違っているようである。そこでLM78、LM75の仕様書を取り寄せ、Internetからも情報を得て研究し、何とかなりそうになったので、ここにまとめる。
実のところたまに見られればいいやって感じなので、ちゃんとしたツールにする気はない。なんか作ったら私にもください。
になる。みたい。
ちなみにLM78では1.0℃単位で、LM75は0.5℃単位で温度がわかる。
である。なぜこんな簡単なのに出回っているツールが使えないのかはわからない。そのうち適当なツールを作ろうかと思ったが、私のマシンではCPU温度が正確に測れていない。というのはセンサーがCPUから離れているため。私の場合は特にヒートシンクからも外れてしまっている。これを改善しないと温度センサーの絶対値の意味がない。
#include <conio.h> #include <winbase.h> #define LM78ISAAddr 0x295 #define PIIX4SMBAddr 0x5000 #define LM75No 0x4C //更新処理 void CSMBUSDlg::OnQuery() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください int vol1,vol2,vol3,vol4,vol5,vol6,vol7; int fan1,fan2,fan3; int temp; //新しい値を得る _outp( LM78ISAAddr, 0x60); Sleep(100); vol1 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); vol2 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); vol3 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); vol4 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); vol5 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); vol6 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); vol7 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); temp = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); fan1 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); fan2 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); fan3 = (unsigned char )(_inp( LM78ISAAddr+1) & 0xFF); m_vol1 = vol1*16; m_vol2 = vol2*16; m_vol3 = vol3*16; m_vol4 = vol4 *16*5000/3000; m_vol5 = vol5 *16*12000/3175; m_vol6 = -vol6 *16*12000/3446; m_vol7 = -vol7 *16*5000/3283; /* m_vol1 = vol1; m_vol2 = vol2; m_vol3 = vol3; m_vol4 = vol4; m_vol5 = vol5; m_vol6 = vol6; m_vol7 = vol7; */ m_lm78_temp = temp; m_fan1 = (fan1 != 255) ? (1350000/fan1/2) : 0; m_fan2 = (fan2 != 255) ? (1350000/fan2/2) : 0; m_fan3 = (fan3 != 255) ? (1350000/fan3/2) : 0; _outp( PIIX4SMBAddr+4, (LM75No<<1)|0x01); _outp( PIIX4SMBAddr+3, 00); _outp( PIIX4SMBAddr+2, 0x4c); Sleep( 100); if( _inp( PIIX4SMBAddr) & 2){ m_lm75_temp1 = _inp( PIIX4SMBAddr+5)*10 + _inp( PIIX4SMBAddr+6)/128*5; _outp( PIIX4SMBAddr, 2); }else if( _inp( PIIX4SMBAddr) & 4){ m_lm75_temp1 = 0; _outp( PIIX4SMBAddr, 4); } //新しい値で描画 UpdateData( FALSE); }
坂井瑞穂