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

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


ironmass

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

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

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

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

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

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

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

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

 

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

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

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

 

 

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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

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

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

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

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

Исправил проблему,изменил тип переменной 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 пользователей онлайн

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