Перейти к содержанию

непонятки с DS18b20.Help!


ironmass

Рекомендуемые сообщения

1 час назад, ironmass сказал:

попробывал опрашивать датчики не в прерывании,а в основном цикле.Ложных срабатываний стало в раза 4 больше,пробывал по разному,ни как.

А фраза "контрольная сумма" Вам знакома ?

Вместо того, чтобы придерживаться советов, типа :

В 27.02.2018 в 15:27, Alex сказал:

Откройте хелп на свою версию компилятора, не мучайтесь с методом тыка. Он никогда нормально не работал.

Вы упорно продолжаете биться головой о стенку.

Ссылка на комментарий
Поделиться на другие сайты

22 часа назад, Alex сказал:

Откройте хелп на свою версию компилятора, не мучайтесь с методом тыка. Он никогда нормально не работал.

открывал,он общий по  работе компилятора,может я не туда жмыкаю

 

23 часа назад, snn_krs сказал:

Попробуй запретить прерывания на время опроса датчика

пробывал не помогает

 

 

Ссылка на комментарий
Поделиться на другие сайты

Показывайте схему подключения датчика и код функции ds18b20_temperature вместе со всеми остальными (ресет, чтение/запись битов, байтов,...).

Тьфу, блин... Это же скрытая библиотека CV...
Тогда совет - найти нормальную бибилиотеку, с открытым кодом, либо написать код самому. Чтобы было понятно что, как и почему происходит.
И не забывайте про контрольную сумму в протоколе датчиков. Она не напрасна придумана !

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

// т.к. при первом чтении датчиков считывается мусор
// первое чтение датчиков делаем в холостую
	temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);//опрос датчика температуры подогревателя 1 
	delay_ms(500);//ждем 500 мс для получения температуры подогревателя 1
	temper1=ds18b20_temperature(&ds18b20_rom_codes[1][0]);//опрос датчика температуры подогревателя 2 
	delay_ms(500);//ждем 500 мс для получения температуры подогревателя 2

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

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

36 minutes ago, Alex said:

Это же скрытая библиотека CV...

float ds18b20_temperature(unsigned char *addr)
{
unsigned char resolution;
if (ds18b20_read_spd(addr)==0) return -9999;
resolution=(__ds18b20_scratch_pad.conf_register>>5) & 3;
if (ds18b20_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(conv_delay[resolution]);
if (ds18b20_read_spd(addr)==0) return -9999;
w1_init();
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & ((int) bit_mask[resolution]))*0.0625;
}

У меня библиотека не скомпилированная CVAVR 3.12. Контрольная сумма проверяется в ds18b20_read_spd

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Исправил проблему,изменил тип переменной temper на char,было int.И все заработало без ложных срабатываний.

Осталась одна непонятка,почему при установки функции инициализации ds18b20

ds18b20_init(&ds18b20_rom_codes[0][0],0,100,DS18B20_9BIT_RES);  
ds18b20_init(&ds18b20_rom_codes[1][0],0,100,DS18B20_9BIT_RES);

ИЛИ ТАК

ds18b20_init(0,0,100,DS18B20_9BIT_RES); 
ds18b20_init(1,0,100,DS18B20_9BIT_RES);

компилятор ругается только на вторую строчку,а если вторую строчку убрать,а первую оставить,то нормально компилируется. 

Ссылка на комментарий
Поделиться на другие сайты

12 minutes ago, ironmass said:

компилятор ругается только на вторую строчку,а если вторую строчку убрать,а первую оставить,то нормально компилируется. 

Такое бывает если копируешь строчку. Попробуй набрать первую строчку вручную или просто после первой строчки сделать пару пустых (Enter)

Ссылка на комментарий
Поделиться на другие сайты

В 05.03.2018 в 19:48, snn_krs сказал:

Попробуй набрать первую строчку вручную или просто после первой строчки сделать пару пустых (Enter)

Точно,все заработало.

Спасибо всем за советы.

Можно тему закрывать.

Изменено пользователем ironmass
Ссылка на комментарий
Поделиться на другие сайты

  • 3 месяца спустя...

пацаны кто хорошо знаком с дс18б20.

Подскажите как получить дробную часть с датчика этого?

Есть такой кусок:

void ds_read_temp(void)
{
	ds_reset_pulse(1<<PIN);          //послать импульс сброса                                       /
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику не использу¤ адрес
ds_write_byte(CONVERT_TEMP,1<<PIN);      //запустить преобразование
HAL_Delay (1000);               //дать врем¤ дл¤ измерени¤
ds_reset_pulse(1<<PIN);          //послать импульс сброса              
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику не использу¤ адрес
ds_write_byte(READ_DATA_COMAND,1<<PIN);      //команда, заставл¤юща¤ датчик выдать 9 байт своей пам¤ти
for(int i=0; i<9; i++ )           //прочитать 9 байт в массив
ds_buff[i] = ds_read_byte(1<<PIN);
	
	temp = ds_buff[1];
	uint8_t temp_f = (ds_buff[0]&15);
		temp = temp<<8;
		temp |= ds_buff[0];
		
 sprintf(temp_buff, "%d,%02d" , (temp>>4), temp%16);
}

через запятую хочу отобразить дробную часть . Но нифига не выводится. То 24.8 то 25.0 и т.д. 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

8 минут назад, snn_krs сказал:

А вывод попробуйте так

попробовал и так , но отображается с шагом 0.5 град. 

Вот сейчас так у меня:

void ds_read_temp(void)
{
    ds_reset_pulse(1<<PIN);          //послать импульс сброса                                       /
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику не использу¤ адрес
ds_write_byte(CONVERT_TEMP,1<<PIN);      //запустить преобразование
HAL_Delay (1000);               //дать врем¤ дл¤ измерени¤
ds_reset_pulse(1<<PIN);          //послать импульс сброса              
ds_write_byte(SKIP_ROM_ADR,1<<PIN);//разрешить доступ к датчику не использу¤ адрес
ds_write_byte(READ_DATA_COMAND,1<<PIN);      //команда, заставл¤юща¤ датчик выдать 9 байт своей пам¤ти
for(int i=0; i<9; i++ )           //прочитать 9 байт в массив
ds_buff[i] = ds_read_byte(1<<PIN);
    
    temp = ds_buff[1];
    uint8_t temp_f = (ds_buff[0]&15);
        temp = temp<<8;
        temp |= ds_buff[0];
        temp *=10; 
      temp/=16;
    if(temp > 10000)//если температура <0    
    {
        temp = 40960 - temp;
      znak =  '-';
    }else { znak =  '+';

    }
    if (znak=='+') sprintf(temp_buff, "%d,%d" , (temp/10), (temp%10));
    else 
    {
    sprintf(temp_buff, "%d.%d" , ((temp/10)*-1), temp%10);
    }        

}

 

Подозреваю что по умолчанию стоит 9бит. разрешение. Как задать 12 бит?

 

Есть такие процедуры в Н файле:

uint8_t ds_reset_pulse(uint16_t PinMask);
void ds_write_bit(uint8_t bit,uint16_t PinMask);
uint16_t ds_read_bit(uint16_t PinMask);
void ds_write_byte(uint8_t byte, uint16_t PinMask);
uint8_t ds_read_byte(uint16_t PinMask);
uint16_t ds_read_temp(void);

в этой библиотеке нет функции инициализации датчика .

 

Обязательно нужно чтобы задать разрешение 12 бит узнать адрес датчика и по нем установить разрешение 12бит?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Да,  только что вычитал из дш.  А почему тогда разрешение 9бит?

В коде нигде нет задания разрешения.. 

Или у меня вычисления не правильно выполняются? 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Скорее всего вычисления не правильные.

57 minutes ago, artos5 said:

        temp *=10;   

   temp/=16;

При делении младшие биты будут удалены

Попробуйте так

temp = ds_buff[1];
temp = temp << 8;
temp |= ds_buff[0];
temp = temp >> 4;
uint16_t temp_f ds_buff[0];
temp_f = temp_f & 0x0F;
temp_f = temp_f * 100;
temp_f = temp_f / 16;
sprintf( temp_buff, "%d.%d", temp, temp_f );

 

Изменено пользователем snn_krs
Ссылка на комментарий
Поделиться на другие сайты

В общем такой прикол.  У меня датчик работает с шагом 0,5град. А у напарника на другой плате и датчике с моей прошивой с шагом 0.1град.

Я вспомнил что этот датчик когда то включал на 9бит.разрешение. Они что запоминают эту команду,  и в дальнейшем работают на 9бит.?

Или это у меня датчик уже плохой? 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Сегодня на свежую голову почитал документацию . Да у них еепром есть и если ранее работал датчик в режиме 9 бит , то так и будет в дальнейшем пока не "переключишь" принудительно :)

Также прочитал 4 байт данных с датчика , он ответил 0х1F , что означает режим 9 бит. Щас дописываю код инициализации чтобы установить режим работы 12бит.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Всем привет, датчик DS18B20, 0 байт читается и биты в 0 байте реагируют на изменение температуры, 1 байт совсем не читается, все остальные байты после 1 байта читаются. Есть 2 датчика оба так работают. 

Может у кого то была такая проблема и как её решить?

Изменено пользователем zwxt
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

×
×
  • Создать...