Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Общетехнические вопросы

Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники.

Ответ
 
Опции темы Опции просмотра
Старый 11.04.2013, 14:33   #1
Михаил008
Junior Member
 
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0
Михаил008 will become famous soon enoughМихаил008 will become famous soon enough
По умолчанию датчик ds18b20

здравствуйте,уважаемы форумчане. проблема возникла с прогой для датчика. вроде получает данные, написана программа вроде опять же правильно, только вывод данных не правильный. показывает неверную температуру. ошибка скорее всего в преобразованиях температуры, переменная tmp. Прошу помощи, уже устал гадать, что нужно сделать.

код модуля программы:
{--------------------------------------------------------------------------
| Copyright (C) 1992-2005 Dallas Semiconductor Corporation.
| All rights Reserved. Printed in U.S.A.
| This software is protected by copyright laws of
| the United States and of foreign countries.
| This material may also be protected by patent laws of the United States
| and of foreign countries.
| This software is furnished under a license agreement and/or a
| nondisclosure agreement and may only be used or copied in accordance
| with the terms of those agreements.
| The mere transfer of this software does not imply any licenses
| of trade secrets, proprietary technology, copyrights, patents,
| trademarks, maskwork rights, or any other form of intellectual
| property whatsoever. Dallas Semiconductor retains all ownership rights.
|--------------------------------------------------------------------------

SensorThread Unit
}
unit SensorThreadUnit;

interface

uses
Classes, Graphics, ComCtrls, Extctrls, Controls, Forms, StdCtrls, Windows,
Sysutils, Messages, Menus, iBTMEXPW;

const

WM_SensorReadingDone = WM_User + 8;
WM_TerminateThreads = WM_User + 11;
DelayBetweenLoops = 1500;
LEVEL_SET = 1;
LEVEL_STRONG_PULL_UP = $01;
PRIMED_BYTE = 2;
PRIMED_NONE = 0;
LEVEL_NORMAL = $00;


type
TSensorThread = class(TThread)

private
Function ReadTemperature(session_handle : longint): Extended;

protected

procedure Execute; override;

published


public
ParentFormHandle : Hwnd;
Temperature : Real;
PortType,PortNum: SmallInt;
StateBuf : Array[1..15360] of Byte;
SHandle : LongInt;
ROM : array[0..8] of SmallInt;
DidSetup : Boolean;
RomNum : String;
numlist: array[0..255] of string;
Function getTemperature : Real;
Function getRomNumber : String;
Function checklist():boolean;

end;

implementation




procedure TSensorThread.Execute;
var
i: Integer;
begin
While (Terminated = False) Do
Begin
SHandle := TMExtendedStartSession(PortNum,PortType,nil);
If (SHandle > 0) Then
begin
If (not DidSetup) Then
Begin
TMSetup(SHandle);
DidSetup := true;
End;
while (TMNext(SHandle, @StateBuf) = 1) do
begin
ROM[0] := 0;
TMRom(SHandle,@StateBuf,@ROM);
//if ROM[0] = $10 then
if ROM[0] = 40 then
begin
RomNum := '';
For i := 7 downto 0 do
Begin
RomNum := RomNum + IntToHex(ROM[i],2);
End;
if checklist()=true then
begin
Temperature := ReadTemperature(SHandle);
PostMessage(ParentFormHandle,WM_SensorReadingDone, ThreadID,0);
end;
end;
end;
TMEndSession(SHandle);
Windows.Sleep(DelayBetweenLoops);
end;
end;
end;

Function TSensorThread.ReadTemperature(session_handle : longint): Extended;
var
tsht, i, tmp1 : smallint;
cr,cpc,tmp : Extended;
rbuf : array[0..9] of smallint;
CRCByte : Byte;
z:textfile;// правлено
begin
tmp := 0.00;
if (TMAccess(session_handle,@StateBuf)= 1) then
begin
TMTouchByte(session_handle, $B8);
if (TMAccess(session_handle,@StateBuf) = 1) then
begin
TMOneWireLevel(session_handle,LEVEL_SET,LEVEL_STRO NG_PULL_UP, PRIMED_BYTE);
TMTouchByte(session_handle, $44);
Windows.Sleep(1000);
TMOneWireLevel(session_handle, LEVEL_SET,LEVEL_NORMAL,PRIMED_NONE);
if (TMTouchBit(session_handle,$01) = $01) then
begin
If (TMAccess(session_handle,@StateBuf) = 1 ) then
begin
TMTouchByte(session_handle,$BE);
CRC8 := 0;
for i := 0 to 7 do
begin
rbuf[i]:= TMTouchByte(session_handle, $FF);
CRCByte := Byte(rbuf[i]);
CRC8 := TMCRC(1, @CRCByte, CRC8, 0);
end;
CRCByte := Byte(TMTouchByte(session_handle, $FF));
CRC8 := TMCRC(1, @CRCByte, CRC8, 0);
if ( CRC8 = 0 ) then
begin
tsht := rbuf[0];
if ((rbuf[1] and $01)= 1) then
tsht := tsht or (256); //-256
tmp1 := Round((tsht)/16); //2
tmp := tmp1;
cr := rbuf[6];
cpc := rbuf [7];
if (rbuf[7] <> 0) then
tmp := tmp - (0.25) + (cpc-cr)/cpc;

end;
begin //1
Assignfile(z,'dannie.txt');
rewrite(z);
writeln(z,tmp);
closefile(z);
end; //2
end;
end;
end;
end;
ReadTemperature := tmp;
end;

Function TSensorThread.getTemperature : Real;
Begin
getTemperature := Temperature;
End;

Function TSensorThread.getRomNumber : String;
Begin
getRomNumber := RomNum;
End;

Function TSensorThread.checklist():boolean;
var i:word;
Begin
checklist:=false;
for i:=0 to length(numlist)-1 do
if numlist[i]=RomNum then
checklist:=true;
End;

end.
Михаил008 вне форума   Ответить с цитированием
Старый 11.04.2013, 14:38   #2
Михаил008
Junior Member
 
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0
Михаил008 will become famous soon enoughМихаил008 will become famous soon enough
По умолчанию датчик ds18b20

просьба простить на форуме впервые, и программирую тоже не так давно.нужно просто до ума довести модуль. модуль делал не я, потому прошу подробных объяснений,пожалуйста.
Михаил008 вне форума   Ответить с цитированием
Старый 11.04.2013, 17:28   #3
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/84
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: датчик ds18b20

Цитата:
Сообщение от Михаил008 Посмотреть сообщение
здравствуйте,уважаемы форумчане. проблема возникла с прогой для датчика. вроде получает данные, написана программа вроде опять же правильно, только вывод данных не правильный. показывает неверную температуру. ошибка скорее всего в преобразованиях температуры, переменная tmp. Прошу помощи, уже устал гадать, что нужно сделать.
Отформатируй код. А лучше, для начала, не выводы а факты приведи.
Что сделано, как, на чём. Что ожидалось, что получилось.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 11.04.2013, 21:13   #4
Михаил008
Junior Member
 
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0
Михаил008 will become famous soon enoughМихаил008 will become famous soon enough
По умолчанию Re: датчик ds18b20

Сори. вообщем код написан на дельфях. Состоит из трех модулей, главного,где отрисовка графика происходит и в который температура передается, модуль сенсора, то есть который я тут выложил и который собственно отвечает за получение температуры, и модуль с библиотеками, функциями и константами. Так вот программа изначально написана для датчика DS18S20, и как я понимаю разница в них есть... От кода нужно лишь адекватное (соответствующее реалиям) получение температуры. прикреплю в архиве всю программу, чтоб проще было.
Вложения
Тип файла: zip DS18S20.zip (313.3 Кб, 25 просмотров)
Михаил008 вне форума   Ответить с цитированием
Старый 12.04.2013, 10:01   #5
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/84
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: датчик ds18b20

В DS18S20 только одним способом представлена иныормация о температуре в регистрах: стр.4. В DS18B20 разрешение может быть разным, и по умолчанию оно отличается от 18S20. Аналогично стр.4.

Соответственно, надо, как минимум, переписать этот кусок:
Код:
begin

  tsht := rbuf[0];

  if ((rbuf[1] and $01)= 1) then
    tsht := tsht or (256); //-256

  tmp1 := Round((tsht)/16); //2
  tmp := tmp1;
  cr := rbuf[6];
  cpc := rbuf [7];

  if (rbuf[7] <> 0) then
    tmp := tmp - (0.25) + (cpc-cr)/cpc;

end;
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 12.04.2013, 11:38   #6
Михаил008
Junior Member
 
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0
Михаил008 will become famous soon enoughМихаил008 will become famous soon enough
По умолчанию Re: датчик ds18b20

Да то, что этот кусок лопатить нужно, я впринципе догадываюсь. Вопрос в другом. Что тут не так, и как исправить? я так понял там 18s20 и 18b20 имеют разные сдвиги информационных байт, то есть один относительно другого. И тут надо этот сдвиг как-то воплотить в рабочую прогу...Буду благодарен за любую помощь в переделке кода.
Михаил008 вне форума   Ответить с цитированием
Старый 12.04.2013, 12:32   #7
Ученый
Senior Member
 
Регистрация: 27.02.2007
Адрес: Москва
Возраст: 69
Сообщений: 590
Вес репутации: 1705/69
Ученый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant futureУченый has a brilliant future
По умолчанию Re: датчик ds18b20

Разница между датчиками в формате данных (оба двухбайтовые). DS18S20 - 9 бит (знак+8бит данных), DS18В20 - 12 бит (знак+11бит данных) (по умолчанию).
Чтобы данные от DS18В20 преобразовать к формату DS18S20 надо оба байта сдвинуть вправо на 3 позиции (разделить на 8). Где у вас эти байты - ищите сами.
__________________
Не знать - не стыдно, стыдно не учиться.
Ученый вне форума   Ответить с цитированием
Старый 12.04.2013, 16:03   #8
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/84
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: датчик ds18b20

Цитата:
Сообщение от Михаил008 Посмотреть сообщение
Да то, что этот кусок лопатить нужно, я впринципе догадываюсь. Вопрос в другом. Что тут не так, и как исправить? я так понял там 18s20 и 18b20 имеют разные сдвиги информационных байт, то есть один относительно другого. И тут надо этот сдвиг как-то воплотить в рабочую прогу...Буду благодарен за любую помощь в переделке кода.
в rbuf[0] и rbuf[1] у тебя температура. Где-какой бит - datasheet смотри. В чём проблема-то?
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 15.04.2013, 11:15   #9
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68
siargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud ofsiargy has much to be proud of
По умолчанию Re: датчик ds18b20

Цитата:
Сообщение от Михаил008 Посмотреть сообщение
18s20 и 18b20 имеют разные сдвиги информационных байт
вот тут хороший пример, там есть преобразование для обоих типов датчиков
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
датчик ds18b20 IE14 Общетехнические вопросы 10 24.02.2012 15:30
Цифровой датчик температуры DS18B20 JimmiKorn Общетехнические вопросы 70 29.05.2011 04:45
Датчик влажности на DS18B20 Vovka Общетехнические вопросы 23 23.03.2011 19:47
DS18B20, вроде бы такой проблемы еще не обсуждали Berkytxt Общетехнические вопросы 12 08.10.2010 22:45
Проблема с DS18B20 на си Den_GF5 Вопросы начинающих 6 07.05.2010 00:36


Часовой пояс GMT +3, время: 07:30.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot