Member
Статус: Не в сети Регистрация: 15.07.2005 Откуда: Из Новочека
Всем привет!!!
Долго пытаюсь научится считывать температуру процессора, написал программулину для записи и чтения значений в порты.
Чип винбондовский
Пишу в $205
Читаю из $206
Получаю странные значения и вобщем ничего не получается.
Помогите, плиз, что делать?
Может кто исходничок подкинет или компоненту?
zmenya@inbox.ru
AndreyZZ читай порты 295h (адресный) и 296h (порт данных). А еще ты можешь поискать здесь на форуме. Помню была ветка про обсуждение чтения температуры и напруги через датчик W83627HF.
Добавлено спустя 1 минуту, 37 секунд: Root
Цитата:
более никаких свободнораспространяемых мониторилок с сырцами я не встречал...
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
AndreyZZ извеняюсь, что забыл о вашей давней просьбе Нижеследующий код когда-то был частью ядра ОМС. Разбирайтесь
Код:
unit OMCcore;
interface
function GetISAReg(Reg: Word):Byte; procedure SetISAReg(Reg: Word; Data: Byte); function GetWBVendorID: Word; function GetWBTemp(index: Byte):single; function GetWBChipID:byte; function GetWBVoltage(index: Byte):byte; function GetWBdivs(index: Byte):byte; function IdentifyISAChip:boolean;
type TISASIOData=packed record Vin0, Vin1, Vin2, Vin3, Vin4, Vin5, Vin6, Vin7, Vin8:packed record data:single; name:string[10]; end; temp1, temp2, temp3:packed record data:single; name:string[10]; end; fan1cnt, fan2cnt, fan3cnt:packed record data:integer; name:string[10]; end; divs1, divs2, divs3:byte; fan1rpm, fan2rpm, fan3rpm:byte; fan1pwm, fan2pwm, fan3pwm:byte; ChipID:byte; VendorID:word; ChipName, ChipAccess:string[20]; end;
var ISASIOData:TISASIOData;
implementation
uses DaemonIO, Windows, unit1;
const KnownISASIOs=8;
var Sensor : array[0..KnownISASIOs] of packed record ChipID:byte; VendorID:word; name:string; end= ( (ChipID:0;VendorID:0;name:'Unsupported chip'), (ChipID:$21;VendorID:$5CA3;name:'Winbond W83627HF/F'), (ChipID:$60;VendorID:$5CA3;name:'Winbond W83697HF'), (ChipID:$80;VendorID:$5CA3;name:'Winbond W83637HF'), (ChipID:$90;VendorID:$5CA3;name:'Winbond W83627THF'), (ChipID:$30;VendorID:$5CA3;name:'Winbond W83782D'), (ChipID:$10;VendorID:$5CA3;name:'Winbond W83781D'), (ChipID:$5;VendorID:$90;name:'ITE IT8705F'), (ChipID:$12;VendorID:$90;name:'ITE IT8712F') ); ConfigPort:array[1..4] of byte =($87, $1, $55, $55);
//General ISA functions with H.ODA mutex
function GetISAReg(Reg: Word):Byte; begin // Wait fo release ISA mutex WaitforSingleObject(MutexISA,INFINITE);
PortOut($295, Reg); result:=PortIn($296);
//Release ISA mutex ReleaseMutex(MutexISA); end;
procedure SetISAReg(Reg: Word; Data: Byte); begin // Wait fo release ISA mutex WaitforSingleObject(MutexISA,INFINITE);
PortOut($295,Reg); PortOut($296, Data);
//Release ISA mutex ReleaseMutex(MutexISA); end;
//Winbond ISA SuperIO functions
procedure SelectWBbank(index: Byte); begin SetISAReg($4e,0); SetISAReg($4e,index); end;
function GetWBVendorID: Word; var a,b: Byte; begin result:=0; SetISAReg($4e,128); a:=GetISAReg($4f); SetISAReg($4e,0); b:=GetISAReg($4f); result:=MakeWord(b,a); end;
function GetWBChipID:byte; begin result:=0; SelectWBbank(0); result:=GetISAReg($58); end;
function GetWBTemp(index: Byte):single; var tmp:byte; begin case index of 1:begin tmp:=GetISAReg($27); if ((tmp and $80) shr 7)= 1 then result:=-((tmp xor $FF)+1) else result:=tmp; end; 2:begin SelectWBbank(1); tmp:=GetISAReg($50); if ((tmp and $80) shr 7)= 1 then result:=-((tmp xor $FF)+1) else result:=tmp; SelectWBbank(1); tmp:=GetISAReg($51); tmp:=tmp shr 7; result:=result+tmp/2; end; 3:begin SelectWBbank(2); tmp:=GetISAReg($50); if ((tmp and $80) shr 7)= 1 then result:=-((tmp xor $FF)+1) else result:=tmp; SelectWBbank(2); tmp:=GetISAReg($51); tmp:=tmp shr 7; result:=result+tmp/2; end; end; end;
function GetWBVoltage(index: Byte):byte; var tmp:byte; begin case index of 0:result:=GetISAReg($20); 1:result:=GetISAReg($21); 2:result:=GetISAReg($22); 3:result:=GetISAReg($23); 4:result:=GetISAReg($24); 5:result:=GetISAReg($25); 6:result:=GetISAReg($26); 7:begin //5VSB SelectWBbank(5); result:=GetISAReg($50); end; 8:begin //VBAT //Enable VBAT monitoring SelectWBbank(0); tmp:=GetISAReg($5d); tmp:=tmp or 1; SetISAReg($5d,tmp); //Get VBAT SelectWBbank(5); result:=GetISAReg($51); end; end; end;
function GetWBdivs(index: Byte):byte; var tmp1, tmp2:byte; begin case index of 1:begin tmp1:=GetISAReg($47); SelectWBbank(0); tmp2:=GetISAReg($5d); result:=((tmp1 and $30) shr 4) or ((tmp2 and $20) shr 3); result:=1 shl result; end; 2:begin tmp1:=GetISAReg($47); SelectWBbank(0); tmp2:=GetISAReg($5d); result:=((tmp1 and $C0) shr 6) or ((tmp2 and $40) shr 4); result:=1 shl result; end; 3:begin tmp1:=GetISAReg($4b); SelectWBbank(0); tmp2:=GetISAReg($5d); result:=((tmp1 and $C0) shr 6) or ((tmp2 and $80) shr 5); result:=1 shl result; end; end; end;
function GetWBrpm(index: Byte):byte; begin case index of 1:result:=GetISAReg($28); 2:result:=GetISAReg($29); 3:result:=GetISAReg($2a); end; end;
//ITE ISA SuperIO functions
function GetITEVendorID: Word; begin result:=0; result:=GetISAReg($58); end;
function GetITEChipID:byte; const GCRindexPort=$2e; GCRdataPort=$2f; var i:byte; begin result:=0; for i:=1 to 4 do PortOut($2e,configPort[i]); PortOut(GCRindexPort,$21); result:=PortIn(GCRdataPort); end;
//General SuperIO functions
function IdentifyISAChip:boolean; var ChipID:byte; VendorID:word; i:byte; begin result:=false; VendorID:=GetWBVendorID; ChipID:=GetWBChipID;
for i:=1 to KnownISASIOs do if (VendorID=Sensor[i].VendorID) and (ChipID=Sensor[i].ChipID) then begin ISASIOData.VendorID:=Sensor[i].VendorID; ISASIOData.ChipID:=Sensor[i].ChipID; ISASIOData.ChipName:=Sensor[i].name; ISASIOData.ChipAccess:='ISA 290h'; result:=true; exit; end;
VendorID:=GetITEVendorID; ChipID:=GetITEChipID;
for i:=1 to KnownISASIOs do if (VendorID=Sensor[i].VendorID) and (ChipID=Sensor[i].ChipID) then begin ISASIOData.VendorID:=Sensor[i].VendorID; ISASIOData.ChipID:=Sensor[i].ChipID; ISASIOData.ChipName:=Sensor[i].name; ISASIOData.ChipAccess:='ISA 290h'; result:=true; exit; end;
end;
end.
Добавлено спустя 2 минуты, 1 секунду: Только для Winbond'ов и недописаны вольтажи
.... function GetWBTemp(index: Byte):single; var tmp:byte; begin case index of 1:begin tmp:=GetISAReg($27); if ((tmp and $80) shr 7)= 1 then result:=-((tmp xor $FF)+1) else result:=tmp; end; 2:begin SelectWBbank(1); tmp:=GetISAReg($50); if ((tmp and $80) shr 7)= 1 then result:=-((tmp xor $FF)+1) else result:=tmp; SelectWBbank(1); tmp:=GetISAReg($51); tmp:=tmp shr 7; result:=result+tmp/2; end; 3:begin SelectWBbank(2); tmp:=GetISAReg($50); if ((tmp and $80) shr 7)= 1 then result:=-((tmp xor $FF)+1) else result:=tmp; SelectWBbank(2); tmp:=GetISAReg($51); tmp:=tmp shr 7; result:=result+tmp/2; end; end; end;
$27 выдает значение от 12 до 15, остальные 0 или -128. Это что означает? Подскажите плиз (Ep-8RDA3+; Winbond W83627HF)
Добавлено спустя 2 минуты, 1 секунду: Только для Winbond'ов и недописаны вольтажи
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения