Что не так было? Формула пересчёта, или битность на датчике неверная была выставлена?
Не знаю, у меня код свой, совсем другой А тип датчика сам определяется. Можно и "B" подцеплять, и "S". Это вы уже там потом с Олегом его код добьёте и выясните причину. Если, конечно, ему не лень будет
глянул как протеус релиз делает - показалось странновато. Сделал проект в МплабХ - совпало по размеру . Загрузил новый хекс в протеус - работает как и должно. Собрал код Alex-а, загрузил хекс в протеус - работает отлично . Прицепил в протеусе вместо DS18B20 DS18S20 - в моем случае сдвинулась температура срабатывания примерно, как говорилось, на порядок ~20..30С. Код Alex-а прекрасно работает. Формула у Alex-а (t*10)/16, у меня (t*5)/8 з.ы. поищу - где-то должно быть в чулане несколько PIC12F629, по свободе на беспаечной соберу макет - там можно и пиккитом поотлаживать .
выходит датчик у ТС фэйк? перетерка ис DS18S20 ??? опять продаваны надули а считать DEV ID датчика там разве невозможно перед замерами?? и выдать на ножку тест(светодиод) ошибку датчика
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
У нас года 3 назад продавцы "терморегуляторов для инкубаторов" на ушах стояли - у закупленых тысячами DS18В20 по умолчанию 9-бит разрешение стояло, может и сейчас так продолжается. В последней прошивке для ТС делал проверку если разрешение 9-бит - исправляем на 12-бит.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
выходит датчик у ТС фэйк? перетерка ис DS18S20 ???
Неа. Самый что ни на есть настоящий DS18B20 на ядре C4. В проекте STH0024 v.3 у меня эти датчики прекрасно работают в 12-ти битном режиме (18S20 так не может ), т.е. "выводят" температуру с разрешением 0,0625°С. Повторю - 18S20 такого не может, только с разрешением 0,5°С. Проблема определённо софтовая.
BOB51 Я уже здесь жаловался на поиск, естественно сначала искал, но видимо что-то пошло не так...
Во-первых скорости здесь не требуется, остывание кессона медленный процесс, подогрев более быстрый. В течении суток подогрев (тепловентилятор 500Вт.) включается 3-4 раза на 10...15мин. А во-вторых, в купе с отключением питания исключает влияние саморазогрева датчика в результате интенсивного обмена данными, которое может приводить к погрешности до 1,4°С в сторону увеличения температуры.
Добавлено after 2 hours 59 minutes 17 seconds: Погонял прошивку от Alex. Собственно мои хотелки реализованы в полном объёме. Явных багов не замечено, на предмет наличия скрытых ещё погоняю, но уже и так ясно - всё работает как положено.
Всем кто принимал участие низкий поклон.
_________________ Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. Всегда с уважением, Александр.
Последний раз редактировалось korob Вс май 20, 2018 13:19:10, всего редактировалось 1 раз.
Отчитаюсь - собрал макетик, прошил протеусной прошивкой с собакой и црц: самое сложное было найти в современном холодильнике снег или лед чтоб охладить датчик. Все работает нормально, как и в протеусе.
Однако! Попробую ещё разок прошивку с проверкой CRC, может коряво залилась . Ну а остальные у Вас тоже нормально работают? Или как у меня, со сдвигом на ~30°С?
_________________ Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. Всегда с уважением, Александр.
Есть микросхема DS1620, готовый термостат, микроконтроллер не нужен, программирование на любом языке тоже не требуется. Прошивается по протоколу SPI, т.е. можно прошить простейшим программатором "5 проводков". Стоит, если поискать, рублей 200. Если не найдете - обращайтесь, у меня есть лишние. Могу и прошить сразу.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
поэксперементировал - взял код работы с DS18B20 от производителя самого датчика (Application Note 162: Interfacing the DS18x20/DS1822 1- Wire Temperature Sensor in a Microcontroller Environment), скопипастил в протеусный проект. Повысил температуру срабатывания, чтоб со льдом не мучиться - если temperature >= 30.0С то GP2=0, если temperature <= 28.0С GP2=1. Нагрев легко осуществляется всего двумя пальцами. Минутную задержку закоментировал. В протеусе работает, в железе тоже. Спойлер
//Application Note 162: Interfacing the DS18x20/DS1822 1- Wire Temperature Sensor in a Microcontroller Environment ////////////////////////////////////////////////////////////////////////////// // OW_RESET - performs a reset on the one-wire bus and // returns the presence detect. Reset is 480us, so delay // value is 480. Presence checked, // another 70us later. // unsigned char ow_reset(void) { unsigned char presence; DQ = 0; //pull DQ line low DQ_TRIS = 0; __delay_us(480); // leave it low for 480us DQ_TRIS = 1; // allow line to return high __delay_us(70); // wait for presence presence = DQ; // get presence signal __delay_us(440); // wait for end of timeslot return(presence); // presence signal returned } // 0=presence, 1 = no part
////////////////////////////////////////////////////////////////////////////// // READ_BIT - reads a bit from the one-wire bus. The delay // required for a read is 15us, so the DELAY routine won't work. // We put our own delay function in this routine in the form of a // for() loop. // unsigned char read_bit(void) { DQ = 0; // pull DQ low to start timeslot DQ_TRIS = 0; __delay_us(2); DQ_TRIS = 1; // then return high __delay_us(15); // delay 15us from start of timeslot return(DQ); // return value of DQ line }
////////////////////////////////////////////////////////////////////////////// // WRITE_BIT - writes a bit to the one-wire bus, passed in bitval. // void write_bit(char bitval) { DQ = 0; // pull DQ low to start timeslot DQ_TRIS = 0; if(bitval==1) DQ_TRIS = 1; // return DQ high if write 1 __delay_us(104); // hold value for remainder of timeslot DQ_TRIS = 1; }// Delay provides = 104us
////////////////////////////////////////////////////////////////////////////// // READ_BYTE - reads a byte from the one-wire bus. // unsigned char read_byte(void) { unsigned char i; unsigned char value = 0; for (i=0;i<8;i++) { if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then // shifts it left __delay_us(120); // wait for rest of timeslot } return(value); }
////////////////////////////////////////////////////////////////////////////// // WRITE_BYTE - writes a byte to the one-wire bus. // void write_byte(char val) { unsigned char i; unsigned char temp; for (i=0; i<8; i++) // writes byte, one bit at a time { temp = val>>i; // shifts val right 'i' spaces temp &= 0x01; // copy that bit to temp write_bit(temp); // write bit in temp into } __delay_us(104); }
if (DALLAS==1) bitset (TEMP,j); if (DALLAS==1) bitset (TEMP,j); if (DALLAS==1) bitset (TEMP,j); if (DALLAS==1) bitset (TEMP,j); if (DALLAS==1) bitset (TEMP,j); if (DALLAS==1) bitset (TEMP,j); else bitclr (TEMP,j);
GIE=1; // en interrupt __delay_us(60); } return TEMP;
}
void init_DS_9b (void){ unsigned char i,j;
FLAG_DS.ERR_DS=0;
i=RESET_dallas (); if (i!=0) {FLAG_DS.ERR_DS=1; return;}
// highByte lowByte degree=(BUFF_DS[1]<<8) | BUFF_DS[0]; //Convert the two bytes of the temperature in the 16-bit integer if (testbit (BUFF_DS[1],7)) {FLAG_DS.minus_C=1; // minus test degree=(degree^0xFFFF)+1; } // Invert the bits, if the sign is negative and adds one else FLAG_DS.minus_C=0; /* * With positive (S=0) temperature is necessary to obtain these meanings divide by 16, and then converted to a decimal representation. * In subzero (S=1) temperatures it is necessary to invert these meanings produced bit by bit and add 1, * then divide by 16, and then converted to a decimal representation. */
Если честно, то мне не нравятся блокирующие функции. Их первый признак - бесконечные delay. Оно канешна заманчиво, но не куртуазно. Ибо не масштабируется в иные проекты совершенно. Хотя многих привлекают простотой.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения