Здравствуйте, товарищи коты! Очень много вопросов возникает, потому завёл отдельную тему. Собираю в общем электроградусник на Меге8, DS18B20 b 2-х семисегментных индикаторах. Семисегментники ожили, показывают адекватно число в обоих разрядах, датчик откликается, даже данные выдает и на температуру реагирует. )) НО - врёт: При комнатной температуре индикатор показывает "03", если коэфициент "0,0625" подогнать и сделать к примеру "0,625", показывает "32", если подержаться за датчик рукой постепенно поднимается до "42", то есть на температуру действительно реагирует. Ещё что смущает: разряды то поочерёдно, то одновременно показывают случайные числа на интервал около секунды, я так полагаю что с датчика неверные числа приходят. Помогите пожалуйста, товарищи коты! Текст программы ниже.
//Выводим значение температуры на 2 семисегментных индикатора ISR(SIG_OVERFLOW0) { if (count==2) count=0 ; switch(count) { case 0:PORTB = digit2;PORTB |= (0<<5);PORTB |= (1<<6);break; case 1:PORTB = digit1;PORTB |= (1<<5);PORTB |= (0<<6);break; } count++ ; }
//функция определяет есть ли устройство на шине unsigned char w1_find() { unsigned char device; W1_DDR |= 1<<W1_BIT; _delay_us(485); W1_DDR &= ~(1<<W1_BIT); _delay_us(65);
W1_DDR |= 1<<W1_BIT; _delay_us(65); W1_DDR &= ~(1<<W1_BIT); _delay_us(5); } } } //функция читает один байт с устройства 1-wire unsigned char w1_receive_byte() { unsigned char data; for(unsigned char i = 0; i < 8; i++) { W1_DDR |= 1<<W1_BIT; _delay_us(2); W1_DDR &= ~(1<<W1_BIT) ; _delay_us(7);
if((W1_PIN & (1<<W1_BIT)) == 0x00) data &= ~(1<<i); else data |= 1<<i; _delay_us(50); } return data; } //функция преобразует полученные с датчика 18b20 данные в температуру int temp_18b20() { unsigned char data[2]; int temp = 0; if(w1_find()==1)//если есть устройство на шине { w1_sendcmd(0xcc);//пропустить ROM код, мы знаем, что у нас одно устройство или передаем всем w1_sendcmd(0x44);//преобразовать температуру _delay_ms(750);//преобразование в 12 битном режиме занимает 750ms w1_find();//снова посылаем Presence и Reset w1_sendcmd(0xcc); w1_sendcmd(0xbe);//передать байты ведущему(у 18b20 в первых двух содержится температура) data[0] = w1_receive_byte();//читаем два байта с температурой data[1] = w1_receive_byte(); //загоняем в двух байтную переменную temp = data[1]; temp = temp<<8; temp |= data[0]; //переводим в градусы temp *= 0.625;//0.0625 градуса на единицу данных } //возвращаем температуру return temp; }
я так полагаю что с датчика неверные числа приходят
В тыщапицотый раз сообщаю: датчики либо работают либо не работают, СОВСЕМ. Врать лично Вам им нет никакого резона. Проверяй алгоритм. Читай тыщапицот тем в которых все уже разжовано, все ошибки описаны. ЗЫ: если CRC не проверять, то что к датчику придираться....
_________________ — Не говорите мне что делать и я не скажу куда Вам идти...
давайте я погадаю на кофейной гуще - у ТС датчик не 18b20 , а 1820 или 18S20. в этом случае при комнатной 18 градусов с учетом младшего разряда в регистре будет 36. 36 умножаем на 0.0625 = 2.25 градуса 36 умножаем на 0.625 = 22 градуса
В задаче спрашивается - какая температура дома у ТС, если показывает 32 ? Около 25 - буржуй, однако... У меня сейчас 16...
давайте я погадаю на кофейной гуще - у ТС датчик не 18b20 , а 1820 или 18S20. в этом случае при комнатной 18 градусов с учетом младшего разряда в регистре будет 36. 36 умножаем на 0.0625 = 2.25 градуса 36 умножаем на 0.625 = 22 градуса
В задаче спрашивается - какая температура дома у ТС, если показывает 32 ? Около 25 - буржуй, однако... У меня сейчас 16...
минвату под пол, окна оклеить, кол-во зубов в батареи удвоить и вы тоже буржуй
Сколько людей пишут здесь неправду, утверждая что эктрасенов здесь нет... а это что по вашему, за тыщапицот километров увидели; какой датчик, температуру в комнате и из чего сделана комната, и что свет в коридоре до сих пор включен...
Заголовок сообщения: Re: В тыщапицотый раз про DS18B20.
Добавлено: Вс фев 05, 2012 09:21:56
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
Dako писал(а):
На момент измерения температуры, на улице было -45, спасибо ТЭЦ, г Новосибирск ))
че-то как-то не верится... даже по брехливым (занижающим) интернет-прогнозам такой температуры в районе Новосибирска не было и нет сейчас... 2-го февраля было -22-24 всего-то...
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Заголовок сообщения: Re: В тыщапицотый раз про DS18B20.
Добавлено: Вс фев 05, 2012 18:31:55
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
Dako писал(а):
Скажите, а для DS1820 аналогично считается?
может, пора, наконец, документацию на датчики почитать? даже ведь на русском полно статей - почитайте, не тратьте зря свое время и время тех, кто тут пытается вам помочь.
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Dako А на счёт того, что у вас датчик белеберду выдает..(навреное, то 55, то 85) вы прерывания отключите, пока датчик опрашиваете. И не надо его дергать чаще чем 1 раз в секунду! Он у нас уже почетный пенсионер, работать так быстро не умеет и не хочет
Не, числа каждый раз разные, в среднем раз в 30 сек выкидывает неправильную температуру, опрашивается раз в 750 мс. Щас усиленно пытаюсь разобраться с алгоритмом расчёта CRC. Пока безуспешно ((
Что там разбираться? Есть ведь готовые библиотеки - бери и пользуйся.
----- по поводу датчиков... У меня 2 датчика на 10-метровом проводе, при ошибке CRC выводится ошибка. Не было ни разу. Сделал затычку - чтобы при первой же ошибке программа зажгла светик и не тушила. Прошла неделя - он не горит.
Пытался вкорячить в код, алгоритм товарища md5sum, то есть в выражение crc=_crc_ibutton_update(crc,bytes[i]); вместо bytes[i] по очереди подсовывал все 8 байт данных, по выходу из цикла сравнивал crc с 9-м полученым байтом. Баг немного видоизменился: стал появляться чаще, но теперь не случайные цифры, а нули только. Пока так....
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения