Russian Qt Forum
Апрель 20, 2024, 04:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Как получить данные о процессоре и диске?  (Прочитано 37698 раз)
Alchazar
Гость
« Ответ #30 : Январь 28, 2010, 10:41 »

Вот нашёл в lm85.c:
Код:
#define	LM85_REG_TEMP(nr)		(0x25 + (nr))
........
........
data->temp[i] =  lm85_read_value(client, LM85_REG_TEMP(i));
Тут он читает информацию с сенсора.
А что за переменная client? Не пойму, что она делает. Или она не нужна в моём случае?
Записан
niXman
Гость
« Ответ #31 : Январь 28, 2010, 11:01 »

в твоем случае, этот код вообще нужно использовать как псевдокод.
но константы можно использовать по прямому назначению.
Записан
Alchazar
Гость
« Ответ #32 : Январь 28, 2010, 14:36 »

Я вот чего не пойму, в спицификации пишут, что данные о температуре надо читать в регистрах по адресу 0х25, 0х26, 0х27. Значит эти регистры должны быть в памяти?
То есть сенсор должен положить в память данные?
Или всё таки, эти регистры находится в самом чипе? Тогда как обяснить GetPortVal(), что регистры читать надо не в памяти, а в чипе?
Что-то я чем больше пытаюсь разобраться, тем сильнее путаюсь
Записан
niXman
Гость
« Ответ #33 : Январь 28, 2010, 14:47 »

Цитировать
Значит эти регистры должны быть в памяти?
нет.

Цитировать
То есть сенсор должен положить в память данные?
нет.

Цитировать
Или всё таки, эти регистры находится в самом чипе?
да.

Цитировать
Тогда как обяснить GetPortVal(), что регистры читать надо не в памяти, а в чипе?
ничего ему объяснять не нужно. функция и так их читает из регистров на железе. в данном случае по адресам: 0х25, 0х26, 0х27

Цитировать
Что-то я чем больше пытаюсь разобраться, тем сильнее путаюсь
ты так и не прочел даташит по чипу, раз не понимаешь, что прежде чем читать значения, нужно настроить чип на это. у чипа, так называемые многофункциональные порты. т.е. по одним и тем же портам он может отдавать разные значения, относящиеся к разным датчикам. а так же, выходы могут быть и входами. чип настраивать нужно.

зы
без прочтения даташита, ничего у тебя не получится. а судя по вопросам, ты его так и не прочел.
« Последнее редактирование: Январь 28, 2010, 15:19 от niXman » Записан
Alchazar
Гость
« Ответ #34 : Январь 28, 2010, 17:01 »

Вот, что пишут в даташите:
Код:
When reading data from a register, there are two possibilities:
1. If the ADT7463’s Address Pointer Register value is unknown
or not the desired value, it is first necessary to set it to
the correct value before data can be read from the desired
data register. This is done by performing a write to the
ADT7463 as before, but only the data byte containing the
register address is sent as data is not to be written to the
register.
То есть надо в сенсор записать адрес регистра, значение которого я хочу получить.

Я так понимаю, его (сенсора) адрес один из 3-ёх:  0x2c, 0x2d, 0x2e(default)?
Значит я должен в 0x2e записать 0х25?
А потом узнавать температуру тоже по адресу 0х2e?



Записан
niXman
Гость
« Ответ #35 : Январь 28, 2010, 18:01 »

сейчас я буду читать.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #36 : Январь 28, 2010, 21:30 »

>>Как правильно вывести переменную, чтобы получить двоичное число?
Можно воспользоваться
QString & QString::setNum ( int n, int base = 10 )
и  base установить в 2. Тогда на выхлопе получится строка содержащая двоичное представление числа
Записан

Юра.
Alchazar
Гость
« Ответ #37 : Январь 29, 2010, 14:22 »

Нашёл пример кода для считывания ChipID для чипа ITE-8712

Код
C++ (Qt)
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "winio.h"
 
byte configPort[4]={0x87, 0x01, 0x55, 0x55};
WORD indexPort = 0x2e;
WORD dataPort = 0x2f;
WORD addressPortEC = 0, dataPortEC = 0;
 
DWORD readFromPort(WORD index) {
  bool result = false;
  DWORD portValue = 0;
 
  result = SetPortVal(indexPort, index, 1);
 
  if (result) {
     result = GetPortVal(dataPort, &portValue, 1);
     if (result) {
        return portValue;
     }
     printf("Ошибка при чтении значения из порта.\n");
     return 0;
  }
  else {
     printf("Ошибка при записи значения в порт.\n");
     return 0;
  }
}
 
bool writeToPort(WORD index, DWORD value, byte numBytes=1) {
  bool result = false;
  short a = 0;
 
  a = outp(indexPort, index);
 
  if (result) {
     result = SetPortVal(dataPort, value, 1);
     if (result) {
        return true;
     }
     printf("Ошибка при записи значения в порт.\n");
     return false;
  }
  else {
     printf("Ошибка при записи значения в порт.\n");
     return false;
  }
}
 
void main()
{
  bool bResult;
  DWORD res;
 
  bResult = InitializeWinIo();
 
  if (bResult)
  {
     for (int i=0; i<4; i++) {
         SetPortVal(0x2e, configPort[i], 1);
     }
 
     res = readFromPort(0x20);
     if ((byte)res==0x87) {
        res = readFromPort(0x21);
        if ((byte)res==0x12) {
           printf("Initialize ITE-8712 - OK.\n");
        }
        else {
           printf("Error during initialize ITE-8712.\n");
        }
     }
     else {
        printf("Error during initialize ITE-8712.\n");
     }
     ShutdownWinIo();
  }
  else
  {
     printf("Error during initialization of WinIo.\n");
     exit(1);
  }
}
Буду пробовать переделать его для моего чипа. Может что нибуть получиться.
Записан
niXman
Гость
« Ответ #38 : Январь 29, 2010, 19:24 »

попробуй вот что:
Код
C++ (Qt)
/* !ПСЕВДОКОД! */
int v = readbyte(0x40);
cout << "v = " << v;
if ( !(v & 0x01) ) {
  cout << "ok, " << v;
  writebyte(0x40, v | 0x01);
}
if ( v & 0x02 ) {
  cout << "locked";
}
if ( v & 0x04 ) {
  cout << "ready";
}
 

напиши код, запусти, выложи сюда код и скрин вывода программы.
Записан
niXman
Гость
« Ответ #39 : Январь 29, 2010, 19:31 »

>>Как правильно вывести переменную, чтобы получить двоичное число?
Можно воспользоваться
QString & QString::setNum ( int n, int base = 10 )
и  base установить в 2. Тогда на выхлопе получится строка содержащая двоичное представление числа
Юра, ты по моему электронщик? или я ошибаюсь? может тоже подскажешь что.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #40 : Январь 29, 2010, 20:47 »

Вот только WMI не даёт никакой информации о температурах. А мне надо ещё узнать температуру дисков и процессора/процессоров.

Секунду гражданин Улыбающийся Знаю что поздновато подключаюсь к теме, но все же, читать данные с чипа это конечно здорово, но сколько их может быть моделей? для каждого свою ф-цию писать будешь? Пусть этим делом занимается ось, а ты юзай апи той оси на которой работает программа, ибо написать ф-ции под несколько осей проще нежели колупать каждый чип(ну это мое ИМХО). Покури WMI хорошенько там есть класс Win32_TemperatureProbe я думаю это именно то что тебе нужно, а под линь тоже вроде есть софт определения температуры, но тут есть еше и + под линь почти весь софт идет с исходниками Улыбающийся
Записан
niXman
Гость
« Ответ #41 : Январь 29, 2010, 21:00 »

Цитировать
для каждого свою ф-цию писать будешь?
придется. в лине для каждого чипа свой модуль ядра.

Цитировать
а под линь тоже вроде есть софт определения температуры
да. в лине с этим проще.
Записан
niXman
Гость
« Ответ #42 : Январь 31, 2010, 01:13 »

Alchazar, ну что с результатом?
Записан
Alchazar
Гость
« Ответ #43 : Февраль 01, 2010, 09:36 »

что-то я никак не найду, что надо иклюдить чтобы использовать readbyte(), writebyte()
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #44 : Февраль 01, 2010, 14:10 »

Цитировать
придется. в лине для каждого чипа свой модуль ядра.
а lm_sensors зачем тогда? Улыбающийся

PS: и еще, раз упомянуто было выше про WMI - то в какой библиотеке в винде *.dll  лежат классы для работы с WMI? т.к. я тож хочу WMI использовть, но вот проблема с minGW ! Нету инклюдов и либ в нём! Грустный
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.1 секунд. Запросов: 22.