Показать сообщение отдельно
  #15  
Старый 02.06.2010, 19:21
Аватар для mixael
mixael mixael вне форума
Прохожий
 
Регистрация: 08.09.2008
Адрес: Ногинск
Сообщения: 7
Репутация: 10
По умолчанию

Анализируя статью http://www.xard.ru/post/10920/default.asp попытался сделать информацию о скорости вращения кулеров, но столкнулся с проблемой-неправильным результатом при вычислениях. Вот код на си:
Код:
int getRPM(int FanNum)
{ int divisor, FanCount, counter;
divisor = ListenPort(0x0B);
if (FanNum == 1)
{divisor = divisor & 0x07;
FanCount = ListenPort(0x0D);}
else {
if (FanNum == 2)
{divisor = (divisor & 0x38) >> 3;
FanCount = ListenPort(0x0E);}
else {
if (FanNum == 3)
{divisor = divisor & 0x40;
FanCount = ListenPort(0x0F);}}}
if (divisor == 0)
{counter = 1;
if (FanNum == 3) counter = 2;}
else {
if (divisor == 1)
{counter = 2;}
else {
if (divisor == 2)
{counter = 4;}
else {
if (divisor == 3)
{counter = 8;}
else {
if (divisor == 4)
{counter = 16;}
else {
if (divisor == 5)
{counter = 32;}
else {
if (divisor == 6)
{counter = 64;}
else {
if (divisor == 7)
{counter = 128;}
else {
if (divisor == 64)
{counter = 8;}}}}}}}}}
if (FanCount == -1 || FanCount == 0)
{return 0;}
else return 1350000/(counter*FanCount);
}

Вот мой перевод на delphi:
Код:
function getFan(FanNum:integer):extended;
var divisor, FanCount, counter:integer;
begin
divisor:=0;FanCount:=0;counter:=0;
   divisor:=ListenPort($0B);
   if FanNum=1 then
     begin
      divisor:=divisor and ListenPort($07);
      FanCount:=ListenPort($0D);
     end
     else
   if FanNum=2 then
     begin
      divisor:=(divisor and ListenPort($38)) shr 3;
      FanCount:= ListenPort($0E);
     end
     else
   if FanNum=3 then
     begin
      divisor:= divisor and ListenPort($40);
      FanCount:= ListenPort($0F);
     end;
   if divisor=0 then
     begin
      counter:= 1;
      if (FanNum=3) then counter:= 2;
     end
     else
   if divisor=1 then counter:=2
     else
   if divisor=2 then counter:=4
     else
   if divisor=3 then counter:=8
     else
   if divisor=4 then counter:=16
     else
   if divisor=5 then counter:=32
     else
   if divisor=6 then counter:=64
     else
   if divisor=7 then counter:=128
     else
   if divisor=64 then counter:=8;

   if (FanCount=-1) or (FanCount=0) then
   Result:=0
     else
   Result:=1350000/(counter*FanCount);
end;

Может кто знает в чем дело?
Выдает по 22500, 540000 RPM, в действительности же Аида выдает ~2450
Ответить с цитированием