![]() |
|
|
Общетехнические вопросы Общие вопросы аналоговой и цифровой электроники. |
![]() |
|
Опции темы | Опции просмотра |
![]() |
#1 |
Junior Member
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0 ![]() ![]() |
![]()
здравствуйте,уважаемы форумчане. проблема возникла с прогой для датчика. вроде получает данные, написана программа вроде опять же правильно, только вывод данных не правильный. показывает неверную температуру. ошибка скорее всего в преобразованиях температуры, переменная 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. |
![]() |
![]() |
![]() |
#2 |
Junior Member
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0 ![]() ![]() |
![]()
просьба простить на форуме впервые, и программирую тоже не так давно.нужно просто до ума довести модуль. модуль делал не я, потому прошу подробных объяснений,пожалуйста.
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/85 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Что сделано, как, на чём. Что ожидалось, что получилось.
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её. |
|
![]() |
![]() |
![]() |
#4 |
Junior Member
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0 ![]() ![]() |
![]()
Сори. вообщем код написан на дельфях. Состоит из трех модулей, главного,где отрисовка графика происходит и в который температура передается, модуль сенсора, то есть который я тут выложил и который собственно отвечает за получение температуры, и модуль с библиотеками, функциями и константами. Так вот программа изначально написана для датчика DS18S20, и как я понимаю разница в них есть... От кода нужно лишь адекватное (соответствующее реалиям) получение температуры. прикреплю в архиве всю программу, чтоб проще было.
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/85 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
В 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;
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её. |
![]() |
![]() |
![]() |
#6 |
Junior Member
Регистрация: 11.04.2013
Сообщений: 4
Вес репутации: 100/0 ![]() ![]() |
![]()
Да то, что этот кусок лопатить нужно, я впринципе догадываюсь. Вопрос в другом. Что тут не так, и как исправить? я так понял там 18s20 и 18b20 имеют разные сдвиги информационных байт, то есть один относительно другого. И тут надо этот сдвиг как-то воплотить в рабочую прогу...Буду благодарен за любую помощь в переделке кода.
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Регистрация: 27.02.2007
Адрес: Москва
Возраст: 69
Сообщений: 590
Вес репутации: 1705/69 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Разница между датчиками в формате данных (оба двухбайтовые). DS18S20 - 9 бит (знак+8бит данных), DS18В20 - 12 бит (знак+11бит данных) (по умолчанию).
Чтобы данные от DS18В20 преобразовать к формату DS18S20 надо оба байта сдвинуть вправо на 3 позиции (разделить на 8). Где у вас эти байты - ищите сами.
__________________
Не знать - не стыдно, стыдно не учиться. |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 37
Сообщений: 1,129
Вес репутации: 3762/85 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её. |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
Всем привет!
Новую тему решил не открывать - по этому датчику их валом уже. Пробую запустить 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. |
![]() |
![]() |
![]() |
#11 | ||
Senior Member
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 365
Вес репутации: 1041/54 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() Цитата:
Цитата:
Там же можно будет понять, почему цикл с двумя asm("NOP") выполняется не в 2 раза дольше - потому, что одна команда asm("NOP") в теле этого цикла составляет только небольшую долю... |
||
![]() |
![]() |
![]() |
#12 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Руслан, я в своем проекте настроил модуль ТМР3 на 1 мкс и отсчитываю время через модуль сравнения. весьма удобно, рекомендую.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#13 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
Спасибо огромное за ответы!
Сергей, я так понимаю, что речь идёт про 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МГц? (если я в том направлении мыслю-давно не работал с этим). Вы пишите про "модуль сравнения" - можете, пожалуйста, более подробно? Заранее благодарю! |
![]() |
![]() |
![]() |
#14 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
ой, там ничего сложного, темболее есть доки на руском. у меня для 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
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#15 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
Я посмотрел документацию по TMR1 – вроде понятно, но не могу понять один момент:
я хочу работать на внешнем кварце времени 32.768 (32кГц) т.к. возможен SLEEP-режим и мне в дальнейшем для других целей нужно отсчитывать часы и сутки. Как мне посчитать время приращения регистра таймера на одно значение? Т.е. допустим я запустил TMR1 и включил модуль сравнения CCP, в регистр модуля сравнения я записал еденицу, т.е. выставить флаг CCP1IF как только регистр TMR1 увеличится на одно значение. Вопрос – какое время соответствует этому одному приращению? И каким образом здесь учувствует предделитель? Т.е. что мне указать, чтоб одно приращение равнялось 1мкс? |
![]() |
![]() |
![]() |
#16 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
никак. 1 мкс это 1МГц.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#17 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
т.е. 32КГц недостаточно...
Если я укажу TMR1CS=0 то значение TMR1 инкрементируется на каждом машинном цикле (если коэфф. предделителя 1:1) - это в доке. Значит одно приращение TMR1 будет 0.4 мкс (машинном цикл = 4 тактам. Для моего кварца 10 МГц 1 такт = 0.1 мкс. 4 такта = 0.4 мкс) Всё верно? Элементарные вещи, но боюсь ошибиться... |
![]() |
![]() |
![]() |
#18 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
все верно.
в режиме симуляции можно вывести Stopwatch, и померять время выполнения программы. о, это в старом мплабе. в говноэклипсе такого не нашел( Руслан а чего боятся то? это когда я начинал были одноразово програмируемые.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#19 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
я использую MPLAB 7.20, программатор ICD2
Что-то в дебаг режим я никак не могу зайти - выдаёт кучу варнингов... Но лет 5 назад помнится мне, что получалось - может забыл уже что-то я. |
![]() |
![]() |
![]() |
#20 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
заработал градусник 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. |
![]() |
![]() |
![]() |
#21 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
очевидно, проблема в функции
Код:
TemperatureOnly(); //Работа DS18B20 ![]()
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#22 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
действительно, проблема была в этой функции )
Я в ней делал вывод на LCD, который тремя ногами висит на порте D, куда я повесил 7-сегментник. Так что запутался в двух соснах. Спасибо! |
![]() |
![]() |
![]() |
#23 |
Senior Member
Регистрация: 26.05.2015
Возраст: 42
Сообщений: 253
Вес репутации: 62/0 ![]() |
![]()
вывел на 7-сегментный индикатор значение температуры. У меня индикатор с тремя цифрами. Получается, что нужно обновлять-прокручивать все три цифры поочерёдно, вроде как кино кручу.
Если контроллер будет отвлекаться на другие задачи, то время между обновлениями 7-сегментника будет не равномерным. Есть ли возможность на PIC18F452 написать программу на Си из двух потоков и в один выделить обновление 7-сегментника? Или как можно красиво реализовать иначе данную задачу? Заранее спасибо! |
![]() |
![]() |
![]() |
#24 |
Senior Member
Регистрация: 03.07.2007
Адрес: Минск
Возраст: 40
Сообщений: 901
Вес репутации: 1351/68 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
через прерывания по таймеру.
както думал о том что если 1варе подцепить на вывод RC2/CCP1 можно реализовать шину аппаратно. но на плате подругому развелось.
__________________
Построил тепличку, посеял литопсы, вырастил кактусы |
![]() |
![]() |
![]() |
#25 |
Senior Member
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 33
Сообщений: 1,382
Вес репутации: 2524/81 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | |
Опции просмотра | |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
датчик 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 |