Форум программистов, компьютерный форум, киберфорум
КИП, датчики
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190

Датчик температуры DS18B20: на выходе неверные данные

07.10.2012, 23:58. Показов 10360. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый. Подскажите как решить проблему с датчиком температуры.
В общем если не углубляться, то msByte приходит 11111111. И вот я не знаю, нерабочий ли датчик или 1-ware библиотека кривая, хотя вроде отзывы хорошие.
Вот так я записываю ms и ls байты, 0 и 1 элементы scratchpad.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        /*подаем сигнал сброса
        команду для адресации всех устройств на шине
        подаем команду - запуcк преобразования */
        OWI_DetectPresence(BUS);
        OWI_SendByte(DS18B20_SKIP_ROM ,BUS);
        OWI_SendByte(DS18B20_CONVERT_T ,BUS);
 
        /*ждем, когда датчик завершит преобразование*/
        __delay_cycles(11059200);
 
        /*подаем сигнал сброса
        команду для адресации всех устройств на шине
        команду - чтение внутренней памяти
        затем считываем внутреннюю память датчика в массив*/
        OWI_DetectPresence(BUS);
        OWI_SendByte(DS18B20_SKIP_ROM, BUS);
        OWI_SendByte(DS18B20_READ_SCRATCHPAD, BUS);
        for(unsigned char i = 0; i<9; i++){
            scratchpad[i] = OWI_ReceiveByte(BUS);
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2012, 23:58
Ответы с готовыми решениями:

Датчик температуры DS18B20
Здравствуйте, не могли бы Вы мне помочь? Я посмотрел обучающее видео про датчик температуры DS18B20...

Работа с Serial port и шиной 1-Wire. Датчик температуры DS18B20. Кто сталкивался?
Добрый день! Подскажите пожалуйста, как получить идентификатор код устройства при работе с 1-wire? Вот цитата из статьи:...

СМ Bosch wtb86211 oe/ 01, Определить датчик влажности и датчик температуры
Добрый день. СМ пытался сделать какой то мастер и исчез вместе с датчиком влажности и датчиком температуры. Подскажите пожалуйста какие...

14
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
08.10.2012, 09:03
Если читаются все единицы, значит прибор по каким-то причинам ничего не передаёт и линия просто подвешена резистором к +5В.
Вот какие функции я использую:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#define termopin PORTAbits.RA1  /* Пин, к которому подключены датчики DS18B20 */
#define termopin_read() TRISAbits.TRISA1=1  /* Команда, что бы настроить пин на чтение... при этом шина подтягивается резистором к +5В */
#define termopin_write() TRISAbits.TRISA1=0 /* Команда, что бы настроить пин на запись... пин должен быть настроен на 0, что бы сразу опустить шину */
 
void termo_init()
{
    termopin_read(); // Отпустить шину... она должна быть подтянута к питанию через резистор около 5 кОм
    termopin = 0;    // Но когда переведём пин в режим записи, на этом пине должен быть 0, что бы притянуть шину к земле
}
 
unsigned char termo_reset() // сброс
{
    unsigned char i=0;
    termopin_write();  // Передача
    Delay100usx(6);    // Пауза 600 мкс (должно быть больше 480 мкс)
    termopin_read();   // Приём
    Delay10usx(6);     // Ждём 60 мкс (может ответить от 15 до 60 мкс)
    i=termopin;        // Смотрим, какое состояние на шине
    Delay100usx(10);   // Ждём ещё 1 мс (датчик должен очухаться уже через 480 мкс)
    if (i)
        return 0;      // Если на шине была 1, то ошибка
    else
        return 1;      // Если шина прижата к 0, значит сброс прошёл успешно
}
 
void termo_send_bit(const char d) // передаём один очередной бит (используется из termo_send)
{
    if (d)               // Если 1
    {
        termopin_write();   // Прижимаем к 0
        Delay1usx(4);       // Пауза 4 мкс (должно быть от 1 до 15 мкс)
        termopin_read();    // Отпускаем шину... резистор её подтянет к 1
        Delay10usx(8);      // Пауза 80 мкс (должно быть больше 60 мкс)
    } else
    {                    // Если 0
        termopin_write();   // Прижимаем к 0
        Delay10usx(8);      // Пауза 80 мкс (должно быть больше 60 мкс)
        termopin_read();    // Отпускаем в 1
    }
    Delay10us();            // Пауза 10 мкс после передачи бита (должно быть больше 1 мкс)
}
 
void termo_send(const unsigned char d) // передаём байт
{
    unsigned char a;
    char i;
    a = d;
    for(i=0;i<8;i++)           // Перебираем все биты в байте
    {
        if ((a & 0x01)==0x01)  // Если младший бит == 1
            termo_send_bit(1); // То передаём 1
        else
            termo_send_bit(0); // Иначе передаём 0
        a = a >> 1;            // Сдвигаем байт вправо... младшим становится следующий бит
    }
}
 
unsigned char termo_read() // читаем байт
{
    char a;
    char i;
    for(i=0;i<8;i++)      // Перебираем все биты в байте
    {
        a = a >> 1;       // Сдвигаем биты вправо
        termopin_write(); // Опускаем шину в 0
        Delay1usx(5);     // Задержка 5 мкс (в сумме со следующей задержкой должно быть от 1 до 15 мкс)
        termopin_read();  // Отпустить шину и слушать её
        Delay1usx(5);     // Задержка 5 мкс (в сумме с предыдущей задержкой должно быть от 1 до 15 мкс)
        if (termopin)     // Читаем состояние шины и записывам в старший бит
            a = a | 0x80;
        else
            a = a & 0x7f;
        Delay10usx(8);    // Задержка 80 мкс (вместе с предыдущими двумя задержками должно быть от 60 до 120 мкс... у нас получается 90 мкс)
    }
    return a;             // Возвращаем получившийся байт
}
А пользуюсь просто... вначале инициализирую, даю сброс, выбираю датчик, даю команду на измерение и получаю данные:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
termo_init();
if (termo_reset()) значит что-то не так
termo_send(0xCC); // выбираем все датчики, подключенные к шине (так можно делать только если подключен всего один датчик)
termo_send(0x44); // запускаем процесс измерения температуры... может занять время в зависимости от разрядности получаемого результата
задержка около 1 секунды
termo_send(0xCC); // в моей программе был выбор датчика, но, возможно, не требуется, т.к. он уже выбран
termo_send(0xBE); // команда на получение состояния регистров
unsigned char a,b;
int i;
a = termo_read();   // Читаем младший байт
b = termo_read();   // Читаем старшаий байт
i = b;              // Старший байт
i = i<<8;           // Сдвигаем его
i = i | a;          // Добавляем младший байт
float termo = i;        // Записываем целую часть в результат
termo = termo * 0.0625;// Вес каждого бита = 1/16 градуса
Я думаю, что тебе надо сброс добавить вначале.
Если у тебя PIC контроллер, то можешь просто в первых 3 строках указать свой вывод, к которому подключен датчик и написать реализацию задержек.
Кстати, на сколько я помню DS18B20 был весьма придирчивым к номиналу резистора, которым его ножку подтягивают к +5 вольтам. Я вначале думал, что номинал резистора не имеет особого значения, т.к. ёмкостей на этой линии нет и повесил 7 или 10 кОм (не помню точно)... но оказалось, со слишком большим резистором он работать не захотел. Нужно именно 5 кОм.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
10.10.2012, 21:53  [ТС]
Сгорел блок питания компа Несколько дней не было возможности мастерить программу, но зато купил еще один датчик, та же цифра, то есть все единицы.
Сброс вроде есть
OWI_SendByte(DS18B20_SKIP_ROM, BUS);
Сейчас по капаюсь внутри функции.
Резистор 4,7 кОм(вроде такой по даташиту), мк - ATMega16A.
А нет ли у Вас библиотеки 1-ware под ATMega16 и Atmel AVR Studio 6 без winAvr?
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
10.10.2012, 22:17
Цитата Сообщение от zoomerland Посмотреть сообщение
А нет ли у Вас библиотеки 1-ware под ATMega16 и Atmel AVR Studio 6 без winAvr?
У меня нету.. я с атмелами не сталкивался. Но в том примере должно быть достаточно исправить три верхних строки и написать функции задержек... по идее, должно на чём угодно работать.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
11.10.2012, 02:50  [ТС]
исправить три верхних строки
Вставить OWI_SendByte(DS18B20_SKIP_ROM ,BUS); перед OWI_DetectPresence(BUS);?
написать функции задержек
Функции вместо __delay_cycles(11059200);?
В библиотеке указываются timing parameters, может и это и есть функции задержек?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*****************************************************************************
 Timing parameters
*****************************************************************************/
 
#define     OWI_DELAY_OFFSET_CYCLES    13   //!< Timing delay when pulling bus low and releasing bus.
 
// Bit timing delays in clock cycles (= us*clock freq in MHz).
#define     OWI_DELAY_A_STD_MODE    ((6   * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_B_STD_MODE    ((64  * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_C_STD_MODE    ((60  * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_D_STD_MODE    ((10  * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_E_STD_MODE    ((9   * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_F_STD_MODE    ((55  * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
//#define     OWI_DELAY_G_STD_MODE  ((0   * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_H_STD_MODE    ((480 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_I_STD_MODE    ((70  * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
#define     OWI_DELAY_J_STD_MODE    ((410 * CPU_FREQUENCY) - OWI_DELAY_OFFSET_CYCLES)
Честно говорю, это мои первые опыты, так что строго не судите за возможно глупые вопросы.

Добавлено через 4 часа 10 минут
Тут есть задержки что описаны выше.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
unsigned char OWI_DetectPresence(unsigned char pins)
{
    unsigned char intState;
    unsigned char presenceDetected;
    
    // Disable interrupts.
    intState = __save_interrupt();
    __disable_interrupt();
    
    // Drive bus low and delay.
    OWI_PULL_BUS_LOW(pins);
    __delay_cycles(OWI_DELAY_H_STD_MODE);
    
    // Release bus and delay.
    OWI_RELEASE_BUS(pins);
    __delay_cycles(OWI_DELAY_I_STD_MODE);
    
    // Sample bus to detect presence signal and delay.
    presenceDetected = ((~OWI_PIN) & pins);
    __delay_cycles(OWI_DELAY_J_STD_MODE);
    
    // Restore interrupts.
    __restore_interrupt(intState);
    
    return presenceDetected;
}
А вот так отправляется байт
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void OWI_SendByte(unsigned char data, unsigned char pin)
{
    unsigned char temp;
    unsigned char i;
    
    // Do once for each bit
    for (i = 0; i < 8; i++)
    {
        // Determine if lsb is '0' or '1' and transmit corresponding
        // waveform on the bus.
        temp = data & 0x01;
        if (temp)
        {
            OWI_WriteBit1(pin);
        }
        else
        {
            OWI_WriteBit0(pin);
        }
        // Right shift the data to get next bit.
        data >>= 1;
    }
}
0
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
13.10.2012, 16:35  [ТС]
Прбовал другую библиотеку-неудача опять
Сейчас поставлю от Мартина Томаса, вроде тоже популярная.
А порт д на меге16 не надо случайно как то фьюзами может открыть?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
13.10.2012, 18:15
...не надо.

Сейчас поставлю от Мартина Томаса
да, именно ее под CVAVR пользовал для 8-й меги - USB термометр и дистанционка в одном флаконе. Часть 3.
Вложения
Тип файла: zip HID.USB термометр_исходники + DS18B.zip (116.5 Кб, 52 просмотров)
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
13.10.2012, 20:09  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
да, именно ее под CVAVR пользовал для 8-й меги
Спасибо за совет и за файлики, буду смотреть.
Можно нескромный вопрос, а Вы не в курсе, после какой температуры датчик умирает?
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
13.10.2012, 20:13
...после той же, после какой умирают все кремниевые структуры без охлаждения. По даташиту диапазон измерений -55°C to +125°C.
Вложения
Тип файла: pdf DS18B20.pdf (333.5 Кб, 30 просмотров)
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
13.10.2012, 20:35  [ТС]
Цитата Сообщение от raxp Посмотреть сообщение
...после той же, после какой умирают все кремниевые структуры без охлаждения. По даташиту диапазон измерений -55°C to +125°C.
Ну, это то понятно, я про непродолжительное воздействие , я просто пламенем зажигалки по одному из датчиков провел случайно, ну как бы не провел а чуть может нагрел даже, а на второй включил(тоже случайно) 12 вольт, думаю что в принципе, оба могли умереть.
Есть еще 3ий, но я его пока не трогаю
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
13.10.2012, 21:54
Зажигалкой его придётся долго греть, что бы он испортился... вряд ли за пару секунд с ним что-то случится непоправимое. А 12 вольт вполне могли его убить. По даташиту он может работать до 5.5 вольт... обычно выдерживают они чуть больше... но 12 - это уже слишком.
1
 Аватар для Санек25
422 / 352 / 19
Регистрация: 14.05.2012
Сообщений: 1,437
25.10.2012, 12:55
собирал этот термометр http://eldigi.ru/site/term/16.php все работает отлично, только резистор понизил с 4,7к на 2,3к...Там и код есть посмотрите может поможет....

Добавлено через 2 минуты
А если датчик убрать показания меняются????
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
08.02.2013, 14:31  [ТС]
И вот я вернулся к этой теме, не знаю увидит ли кто ее но все де не буду создавать новую. Давно я не брался за решение даннной проблемы и вот пару дней мучений и результат. Заработала в протеусе от Мартина Томаса, после редактирования owipolled.h строчки OWI_DELAY_OFFSET_CYCLES перед задержками, снизил с 13 до 0, на железе не работает( Пока буду экспериментировать с резисторами



Пробовал резисторы от 3 КОм до 10 КОм, никакого эффекта, OWI_DELAY_OFFSET_CYCLES менял на разные,то же
Подскажите, чем может отличаться Протеус, что дает ему возможность выполнять программу правильно?
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
08.02.2013, 20:01
Скорее всего, железяку просто сконфигурировал неправильно... либо частота отличается от расчётной.
Я бы вначале попробовал бы подёргать этой ножкой с низкой частотой... около 1 герца и замерить тестером. Тогда можно хотя бы с уверенностью сказать, приходит ли на неё сигнал и примерно оценить точность задержки.
1
29 / 13 / 0
Регистрация: 08.08.2011
Сообщений: 190
09.02.2013, 18:54  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
Скорее всего, железяку просто сконфигурировал неправильно... либо частота отличается от расчётной.
Я бы вначале попробовал бы подёргать этой ножкой с низкой частотой... около 1 герца и замерить тестером. Тогда можно хотя бы с уверенностью сказать, приходит ли на неё сигнал и примерно оценить точность задержки.
Частота процессора должна быть не менее 2,170 МГц, по инструкции к библиотеке, тут думаю это не сильно поможет.
8 000 000 Ul, это же 8 Мгц?
Да и там конфигурировать то нечего вроде в железяке, кроме частоты?
А при подключении тестера на между ногой и резистором, слышно колебательные звуки, но с высокой частотой, не разобрать задержки.

Добавлено через 20 часов 23 минуты
Humanoid, спасибо огромное, все дело оказалось в частоте. Не знал что в AVR Studio при прошивке(2 недели как пользуюсь, до этого PonyProg), надо указывать SUT_CKSEL, объявить частоту в начале программы недостаточно. Типичная ошибка новичка, стыдно конечно, но я очень рад что теперь я с термометром)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2013, 18:54
Помогаю со студенческими работами здесь

Датчик DS18B20
Есть самописный код :rtfm: на atmega8 для работы с датчиком температуры DS18B20. Что в poroteus, что на макетной плате, экран ничего не...

atmega16 и датчик DS18B20
Здравствуйте на частоте 1мгц все работает данные температуры считываются, а вот на частоте 8мгц уже нет, опытным путем установлено, что...

Как правильно запитать датчик DS18B20?
Если пробовать как на схеме на первом рисунке то датчик не работает, если как на втором рисунке то дисплей тускнеет и ничего вообще не...

Ds18b20 AVR конверсия вещественой температуры
/* * 1-wire(mega32a).c * * Created: 13.03.2018 5:40:10 * Author : User */ #define F_CPU 8000000UL//устанавливаем частоту...

DS18b20 stm 32(AVR) измерение отрицательной температуры
Есть такая проблема. Как измерить температуру от нуля до -55грд.Цельсия и вывести на LCD? #include &quot;DS18B20.h&quot; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru