при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
если бы понимали - не говорили бы такой ерунды. пакет из 8-и байт позволяет при помощи CRC определить - верные данные пришли, или из-за помехи или иных причин они исказились. читая только первые 2 байта вы никогда не узнаете, что датчик у вас пургу несет...CCCP писал(а):Зачем 8, когда температура в 2х?
Я понимаю, что всё написано в даташите и нескольких учебниках по СИ...
верните индикацию в прерывания! откорректируйте (или напишите сами) функции обмена по 1-wire так, чтобы прерывания запрещались не на целую функцию, а только на момент передачи-приема одного бита. в конце-концов, поищите в интернете - библиотек для 1-wire с исходниками множество!QZ_ писал(а):Потом кое как выдрал вывод в главный цикл, избавился от обозначенной CCCP паузы, но всеравно дисп помигивает. это сильно достает. как бы мне избавиться от такой проблемы?
к сожалению не осталось той версии исходникаИсходник покажи.
вот ща если толку не выйдет, завтра все назад верну (индикацию в прерывание)Вывод на семисегментник из прерывания по таймеру делай, а считывание температуры из main.
Пока не вернешь динамическую индикацию в прерывание, у тебя так и будет изображение на семисегментнике дергаться!QZ_ писал(а):diehard писал:к сожалению не осталось той версии исходникаИсходник покажи.![]()
щас чета жестокое замутил (вроде дисп почти не дергается, но и термометр не робит пока). исходник прилагается. щас работаю над ним.
вот ща если толку не выйдет, завтра все назад верну (индикацию в прерывание)Вывод на семисегментник из прерывания по таймеру делай, а считывание температуры из main.
Несколько грубовато и высокомерно. Вопрос был именно о чтении температуры, а не о CRC. Понять достоверные данные или нет, труда то не составит, показания, скорее всего, будут напоминать генератор случайных чисел. Когда речь идёт о работе датчиков на значительном удалении, при сильном уровне помех, да, нужно убеждаться в верности данных, но когда разбираешься в принципе работы, об этом можно и не думать. А вообще, я уже давно во всём разобрался, в том числе и с CRC.ARV писал(а):если бы понимали - не говорили бы такой ерунды. пакет из 8-и байт позволяет при помощи CRC определить - верные данные пришли, или из-за помехи или иных причин они исказились. читая только первые 2 байта вы никогда не узнаете, что датчик у вас пургу несет...CCCP писал(а):Зачем 8, когда температура в 2х?
Я понимаю, что всё написано в даташите и нескольких учебниках по СИ...
Точность и разрешение это разные вещи. 12bit и разрешающая способность 1/16 градуса, ну а исходник есть в CV.Тарас писал(а):У меня вопросик по теме как получить данные с датчика с точностью 0.1 градус?
Можно посмотреть исходник такой реализации?
научитесь задавать вопросы, если уж на то пошло.CCCP писал(а):ARV рекомендую научиться для начала правильно понимать вопросы, и вести себя посдерженее.
Код: Выделить всё
// обработаем старший байт - если он отрицателен то все биты надо инвертировать
temp = ds_scratch_pad.temp_msb;
if((temp>>6)&1)
{
below=1;
temp = temp^0b11111111;
}
else
below=0;
ds_temp = (float)((temp&1)*16+((temp>>1)&1)*32+((temp>>2)&1)*64);
// теперь младший
temp = ds_scratch_pad.temp_lsb;
// если число отрицательно - инвертируем
if(below)
temp=temp^0b11111111;
ds_temp = ds_temp + (float)((temp&1)*0.0625+((temp>>1)&1)*0.125+((temp>>2)&1)*0.25+((temp>>3)&1)*0.5+((temp>>4)&1)+((temp>>5)&1)*2+((temp>>6)&1)*4+((temp>>7)&1)*8);
if(below)
ds_temp = (float)(0-ds_temp);
Это ты определенно перемудрилclawham писал(а):Ребятки, не ссорьтесь!
Лучше подскажите как мне попроще сделать преобразование двух байтного слова температуры ДС-ки с разрещением в 12 бит в простой флоат
я делаю пока что такно это ж примитивноКод: Выделить всё
// обработаем старший байт - если он отрицателен то все биты надо инвертировать temp = ds_scratch_pad.temp_msb; if((temp>>6)&1) { below=1; temp = temp^0b11111111; } else below=0; ds_temp = (float)((temp&1)*16+((temp>>1)&1)*32+((temp>>2)&1)*64); // теперь младший temp = ds_scratch_pad.temp_lsb; // если число отрицательно - инвертируем if(below) temp=temp^0b11111111; ds_temp = ds_temp + (float)((temp&1)*0.0625+((temp>>1)&1)*0.125+((temp>>2)&1)*0.25+((temp>>3)&1)*0.5+((temp>>4)&1)+((temp>>5)&1)*2+((temp>>6)&1)*4+((temp>>7)&1)*8); if(below) ds_temp = (float)(0-ds_temp);знаю что можно просто разделить на 0.0625 но откуда возьмётся знак и куда прилепить старший байт?