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

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

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

Ответ
 
Опции темы Опции просмотра
Старый 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
Адрес: Новочеркасск
Возраст: 34
Сообщений: 1,048
Вес репутации: 3282/68
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 Кб, 24 просмотров)
Михаил008 вне форума   Ответить с цитированием
Старый 12.04.2013, 10:01   #5
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 34
Сообщений: 1,048
Вес репутации: 3282/68
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
Адрес: Москва
Возраст: 66
Сообщений: 520
Вес репутации: 1469/56
Ученый has much to be proud ofУченый has much to be proud ofУченый has much to be proud ofУченый has much to be proud ofУченый has much to be proud ofУченый has much to be proud ofУченый has much to be proud ofУченый has much to be proud ofУченый has much to be proud ofУченый has much to be proud of
По умолчанию 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
Адрес: Новочеркасск
Возраст: 34
Сообщений: 1,048
Вес репутации: 3282/68
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
Адрес: Минск
Возраст: 37
Сообщений: 781
Вес репутации: 1121/53
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 of
По умолчанию Re: датчик ds18b20

Цитата:
Сообщение от Михаил008 Посмотреть сообщение
18s20 и 18b20 имеют разные сдвиги информационных байт
вот тут хороший пример, там есть преобразование для обоих типов датчиков
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 15.06.2015, 15:56   #10
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

Всем привет!


Новую тему решил не открывать - по этому датчику их валом уже.

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


Чтоб запустить градусник DS18B20 надо быть уверенным в правильности задержек в контроллере. У меня инициализация DS18B20 то проходит то нет (нет ответа от DS18B20 – не выставляет нуль), если проходит, то читаются нули в значении температуры. Я пробовал использовать исходники (delay.c, delay.h) из папки samples компилятора PIC18, но есть сомнения в правильности задержек. Поэтому думаю самостоятельно написать функции задержки.


Но вот такое непонимание:


У меня PIC18F452 кварц 10МГц
По даташиту команда выполняется за 4 такта OSC.
10МГц это 10мкс
Время выполнения команды 10/4=2.5мкс (если я верно всё посчитал)

Этот цикл работает 43,48 сек (хотя должен 1 минуту: 60 сек/2,5 сек = 24 раза цикл гонять)
Реальное время работы проверяю диодом - вкл/выкл
for (i=0; i<=24; i++)
{
for (ii=0; ii<=1000000; ii++)//2.5 сек
{
asm("NOP");//2.5 мк сек
}
}
почему работает не минуту, а 43,48 сек?
--------------------------------------------

А этот цикл работает 45,62 сек (хотя должен 43,48 сек*2=1минута 20 сек т.к. я добавил ещё один NOP)
for (i=0; i<=24; i++)
{
for (ii=0; ii<=1000000; ii++)//2.5 сек
{
asm("NOP");//2.5 мк сек
asm("NOP");//2.5 мк сек – я добавил!
}
}

почему второй цикл работает не в 2 раза дольше по сравнению с первым циклом? Ведь NOP второй должен дать увеличение в 2 раза по сравнению в одним NOP ?

Заранее благодарю!

Последний раз редактировалось Руслан; 15.06.2015 в 16:07.
Руслан вне форума   Ответить с цитированием
Старый 15.06.2015, 17:08   #11
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 320
Вес репутации: 813/41
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию Re: датчик ds18b20

Цитата:
Сообщение от Руслан Посмотреть сообщение
У меня PIC18F452 кварц 10МГц
По даташиту команда выполняется за 4 такта OSC.
10МГц это 10мкс
Время выполнения команды 10/4=2.5мкс (если я верно всё посчитал)
Для 10 МГц 1 такт = 0.1 мкс. 4 такта = 0.4 мкс.

Цитата:
Сообщение от Руслан Посмотреть сообщение
Этот цикл работает 43,48 сек (хотя должен 1 минуту: 60 сек/2,5 сек = 24 раза цикл гонять)
Реальное время работы проверяю диодом - вкл/выкл
for (i=0; i<=24; i++)
{
for (ii=0; ii<=1000000; ii++)//2.5 сек
{
asm("NOP");//2.5 мк сек
}
}
почему работает не минуту, а 43,48 сек?
Вы посчитали, причем неправильно, длительность только одной команды asm("NOP"). А то, что цикл for (ii=0; ii<=1000000; ii++) при компиляции "разворачивается" в несколько команд, тоже выполняющихся в цикле, - об этом не подумали? Чтобы просчитать реальное время выполнения цикла - нужно посмотреть ассемблерный листинг (View - Dissambly Listing), найти там все команды, входящие в цикл, и тогда уже умножать количество этих команд на длительность одной команды (0.4мкс) и на количество "проходов" цикла.
Там же можно будет понять, почему цикл с двумя asm("NOP") выполняется не в 2 раза дольше - потому, что одна команда asm("NOP") в теле этого цикла составляет только небольшую долю...
tsb58 вне форума   Ответить с цитированием
Старый 16.06.2015, 08:36   #12
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 37
Сообщений: 781
Вес репутации: 1121/53
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 of
По умолчанию Re: датчик ds18b20

Руслан, я в своем проекте настроил модуль ТМР3 на 1 мкс и отсчитываю время через модуль сравнения. весьма удобно, рекомендую.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 17.06.2015, 19:03   #13
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

Спасибо огромное за ответы!
Сергей, я так понимаю, что речь идёт про TMR - там просто опечатка или я не так понял?

Я когда-то у себя использовал TMR1, если мы про него говорим:
-----------------------------------------
//**инициализация TMR1
TRISC0 = 1; //вход для кварца TMR1
TRISC1 = 1; //вход для кварца TMR1

T1CON = 0b10111111; //Set <7:0>
//внешний ист
//TMR1 вкл.(ON)
//предделитель 1:8 (дольше по времени)

TMR1 = 0; //начальное обнуление значения таймера
TMR1H = 0;//начальное обнуление значения таймера
TMR1L = 0;//начальное обнуление значения таймера


//T1CON = 0b10111110; //TMR1 выкл.(OFF)
//***END инициализация TMR1
-----------------------------------------

т.е. нужно предделитель установить на 1мкс? У меня стоит внешний кварц 32.768 на пинах RC0 RC1. Какой предделитель надо установить для 1 мкс если кварц у меня 10МГц? (если я в том направлении мыслю-давно не работал с этим).

Вы пишите про "модуль сравнения" - можете, пожалуйста, более подробно?

Заранее благодарю!
Руслан вне форума   Ответить с цитированием
Старый 18.06.2015, 08:42   #14
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 37
Сообщений: 781
Вес репутации: 1121/53
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 of
По умолчанию Re: датчик ds18b20

ой, там ничего сложного, темболее есть доки на руском. у меня для 18f4320 на асме всё и от внутренего гена на 8МГц.
для 10МГц целого
Код:
 ;настройка таймера и модуля сравнения
	MOVLW	B'11010001'	;1мкс - включен
	MOVWF	T3CON,A		;таймер3 от Fosc/4
	MOVLW	B'00000010'
	MOVWF	CCP2CON		; В режиме сравнения для 1варе
далее в коде

Код:
; *******************************************************
; Dallas Semiconductor 1-Wire MACROS
; *******************************************************
OW_HIZ:MACRO	; отпустить линию
	BSF OW_TRIS	; Make DQ pin High Z
	BSF GIE		; Enable interupt
 ENDM
; --------------------------------------------------------
OW_LO:MACRO	; старт слота
	BCF GIE		;disable interupt
	BCF OW_PIN	; Clear the DQ bit
	BCF OW_TRIS	; Make DQ pin an output
	CLRF	TMR3H	;Clear Timer
	CLRF	TMR3L
 ENDM
; --------------------------------------------------------
OW_HI:MACRO	; активная подтяжка
	BSF OW_PIN	; Set the DQ bit
	BCF OW_TRIS	; Make DQ pin an output
	BSF GIE		; Enable interupt
 ENDM
; --------------------------------------------------------
LOAD_CCP:MACRO TIME ;ЗАДЕРЖКА В МИКРОСЕКУНДАХ макс 65535

	MOVLW HIGH((TIME)-4 )
	MOVWF CCPR2H ,A
	MOVLW LOW ((TIME)-4 )
	MOVWF CCPR2L ,A

 ENDM
; --------------------------------------------------------
WAIT_CCP:MACRO ;ЖДЕМ CCP1IF.
	BCF	CCP2IF
	BTFSS	CCP2IF
	BRA $-2
 ENDM
; --------------------------------------------------------
CLR_TMR3:MACRO ;очистка TMR3.
	CLRF	TMR3H
	CLRF	TMR3L
 ENDM
; --------------------------------------------------------
		;	___   _____________   ___
OW_WR_BIT:	;WRITE	   \_/_____/	   \_/___
		;	   0 5	   60	   100
	OW_LO
	LOAD_CCP .6
	WAIT_CCP
	BTFSC C 	; Check  for 1 or 0
	 BSF OW_TRIS	; Make DQ pin High Z
	BSF GIE		; Enable interupt
	LOAD_CCP .60
	WAIT_CCP
	BSF OW_TRIS	 ; Make DQ pin High Z
	LOAD_CCP .100 	; Wait 100µs after Start Pulse
	WAIT_CCP
	 RETLW 0
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 19.06.2015, 14:07   #15
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

Я посмотрел документацию по TMR1 – вроде понятно, но не могу понять один момент:

я хочу работать на внешнем кварце времени 32.768 (32кГц) т.к. возможен SLEEP-режим и мне в дальнейшем для других целей нужно отсчитывать часы и сутки.
Как мне посчитать время приращения регистра таймера на одно значение?
Т.е. допустим я запустил TMR1 и включил модуль сравнения CCP, в регистр модуля сравнения я записал еденицу, т.е. выставить флаг CCP1IF как только регистр TMR1 увеличится на одно значение.



Вопрос – какое время соответствует этому одному приращению?
И каким образом здесь учувствует предделитель? Т.е. что мне указать, чтоб одно приращение равнялось 1мкс?
Руслан вне форума   Ответить с цитированием
Старый 19.06.2015, 14:40   #16
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 37
Сообщений: 781
Вес репутации: 1121/53
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 of
По умолчанию Re: датчик ds18b20

никак. 1 мкс это 1МГц.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 19.06.2015, 17:56   #17
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

т.е. 32КГц недостаточно...
Если я укажу TMR1CS=0 то значение TMR1 инкрементируется на каждом машинном цикле (если коэфф. предделителя 1:1) - это в доке.

Значит одно приращение TMR1 будет 0.4 мкс
(машинном цикл = 4 тактам. Для моего кварца 10 МГц 1 такт = 0.1 мкс. 4 такта = 0.4 мкс)
Всё верно?
Элементарные вещи, но боюсь ошибиться...

Руслан вне форума   Ответить с цитированием
Старый 22.06.2015, 09:02   #18
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 37
Сообщений: 781
Вес репутации: 1121/53
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 of
По умолчанию Re: датчик ds18b20

все верно.
в режиме симуляции можно вывести Stopwatch, и померять время выполнения программы.
о, это в старом мплабе. в говноэклипсе такого не нашел(

Руслан а чего боятся то? это когда я начинал были одноразово програмируемые.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 22.06.2015, 22:04   #19
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

я использую MPLAB 7.20, программатор ICD2
Что-то в дебаг режим я никак не могу зайти - выдаёт кучу варнингов...
Но лет 5 назад помнится мне, что получалось - может забыл уже что-то я.
Руслан вне форума   Ответить с цитированием
Старый 26.06.2015, 00:22   #20
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

заработал градусник DS18B20. Я его повесил на пин RB4
Подключил семи-сегментный индикатор 3-х разрядный (3 цифры с точкой) на PORTD-управления сегментами A B C и т.д.
Управление выбором цифры на порт E (про порт Е пишу для порядка - он к ошибке не относится).
По отдельности всё работает.

В программе я включаю сначала 7-сегм. индикатор - вывел цифру, после чего запускаю работу градусника DS18B20 и тут некоторые сегменты на индикаторе перестают гореть, а другие наоборот - загораются.

Схему проверил - пины порта B где висит градусние (RB4) не замкнуты т.е. не звонятся на пины порта B куда подключен 7-сегм. индикатор.

Думал неверно инициализация портов,но ранее я с ними работал - всё было нормально.

#define PIN RB4 // DS18B20
#define STATE TRISB4 //
<...>
//-------------------------
//7-сегм. индикатор
#define D1 LATE0
#define D2 LATE1
#define D3 LATE2

#define A LATD0
#define B LATD1
#define C LATD2
#define D LATD3
#define E LATD4
#define F LATD5
#define G LATD6
#define DP LATD7
//-------------------------

void InitPortB()
{
PORTB = 0; //инициализация с очисткой выходной защёлки данных
LATB = 0; //альтернативный метод очистки выходной защёлки данных
TRISB = 0b00000000; //Set RB<7:0> as output
}//InitPortB
----------------------------
void InitPortD()
{
PORTD = 0; //инициализация с очисткой выходной защёлки данных
LATD = 0; //альтернативный метод очистки выходной защёлки данных
PSPMODE = 0;//PORTD-двунаправленный порт ввода/вывода (отключил параллельный порт)
TRISD = 0x00;//Set RD<7:0> as output
}
-------------------------
void InitPortE()
{
PORTE = 0; //инициализация с очисткой выходной защёлки данных
LATE = 0; //альтернативный метод очистки выходной защёлки данных
TRISE = 0b00000000; //Set RB<7:0> as output
}//InitPortE
--------------------------
void main()
{
InitPortB();
InitPortD();
InitPortE();

//-------------------------
//**7-сегм. индикатор BEGIN

D1=0;
D2=1;
D3=0;

A=0;
B=1;
C=0;
D=0;
E=1;
F=0;
G=0;
DP=0;

//***7-сегм. индикатор END
//------------------------------------

TemperatureOnly(); //Работа DS18B20 - здесь на 7-сегм. индикаторе одни сегменты гасятся - другие включаются, если эту функцию запустить в цикле - на 7-сегм. индикаторе цветомузыка - моргают два сегмента в такт работы градусника.
--------------------------------------

//Если тут опять выставить правильные значения 7-сегм. индикатора - то они будут гореть верно т.е. сбой, внесенные работой градусника, устраняется.
}
------------------------
Каким образом работа порта В может влиять на работу порта D ?
(На пинах RB0-RB3 ещё висят светодиоды - это плата PICDEM 2 PLUS)
Может кто подскажет мысль куда рыть - ума не приложу...

Заранее благодарю!

Последний раз редактировалось Руслан; 26.06.2015 в 00:33.
Руслан вне форума   Ответить с цитированием
Старый 26.06.2015, 08:39   #21
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 37
Сообщений: 781
Вес репутации: 1121/53
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 of
По умолчанию Re: датчик ds18b20

очевидно, проблема в функции
Код:
TemperatureOnly(); //Работа DS18B20
офф: для вставки кода пользуйся кнопкой
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 27.06.2015, 22:50   #22
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

действительно, проблема была в этой функции )
Я в ней делал вывод на LCD, который тремя ногами висит на порте D, куда я повесил 7-сегментник. Так что запутался в двух соснах.

Спасибо!
Руслан вне форума   Ответить с цитированием
Старый 29.06.2015, 23:59   #23
Руслан
Member
 
Регистрация: 26.05.2015
Возраст: 40
Сообщений: 99
Вес репутации: 100/8
Руслан will become famous soon enoughРуслан will become famous soon enough
По умолчанию Re: датчик ds18b20

вывел на 7-сегментный индикатор значение температуры. У меня индикатор с тремя цифрами. Получается, что нужно обновлять-прокручивать все три цифры поочерёдно, вроде как кино кручу.
Если контроллер будет отвлекаться на другие задачи, то время между обновлениями 7-сегментника будет не равномерным.
Есть ли возможность на PIC18F452 написать программу на Си из двух потоков и в один выделить обновление 7-сегментника? Или как можно красиво реализовать иначе данную задачу?

Заранее спасибо!
Руслан вне форума   Ответить с цитированием
Старый 30.06.2015, 08:28   #24
siargy
Senior Member
 
Аватар для siargy
 
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 37
Сообщений: 781
Вес репутации: 1121/53
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 of
По умолчанию Re: датчик ds18b20

через прерывания по таймеру.

както думал о том что если 1варе подцепить на вывод RC2/CCP1 можно реализовать шину аппаратно. но на плате подругому развелось.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы
siargy вне форума   Ответить с цитированием
Старый 30.06.2015, 08:43   #25
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 31
Сообщений: 1,211
Вес репутации: 1893/63
Рак 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

Цитата:
Сообщение от siargy Посмотреть сообщение
через прерывания по таймеру.

както думал о том что если 1варе подцепить на вывод RC2/CCP1 можно реализовать шину аппаратно. но на плате подругому развелось.
1ware можно реализовать через свободный UART. Этим пользуются для подключения датчиков к компьютеру.
Рак вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 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, время: 01:11.


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