Форум РадиоКот https://radiokot.ru/forum/ |
|
Всё по DS18(B/S)20. https://radiokot.ru/forum/viewtopic.php?f=61&t=64022 |
Страница 1 из 59 |
Автор: | Dako [ Сб фев 04, 2012 15:16:32 ] |
Заголовок сообщения: | Всё по DS18(B/S)20. |
Здравствуйте, товарищи коты! Очень много вопросов возникает, потому завёл отдельную тему. Собираю в общем электроградусник на Меге8, DS18B20 b 2-х семисегментных индикаторах. Семисегментники ожили, показывают адекватно число в обоих разрядах, датчик откликается, даже данные выдает и на температуру реагирует. )) НО - врёт: При комнатной температуре индикатор показывает "03", если коэфициент "0,0625" подогнать и сделать к примеру "0,625", показывает "32", если подержаться за датчик рукой постепенно поднимается до "42", то есть на температуру действительно реагирует. Ещё что смущает: разряды то поочерёдно, то одновременно показывают случайные числа на интервал около секунды, я так полагаю что с датчика неверные числа приходят. Помогите пожалуйста, товарищи коты! Текст программы ниже. Код: #include <avr/io.h>
#include <util/delay.h> #include <stdlib.h> #include <avr/interrupt.h> #define W1_PORT PORTC #define W1_DDR DDRC #define W1_PIN PINC #define W1_BIT 0 volatile char count = 0 ; volatile char digit1 ; volatile char digit2 ; //Выводим значение температуры на 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); if((W1_PIN & (1<<W1_BIT)) ==0x00) device = 1; else device = 0; _delay_us(420); return device; } //функция посылает команду на устройство 1-wire void w1_sendcmd(unsigned char cmd) { for(unsigned char i = 0; i < 8; i++) { if((cmd & (1<<i)) == 1<<i) { W1_DDR |= 1<<W1_BIT; _delay_us(2); W1_DDR &= ~(1<<W1_BIT); _delay_us(65); } else { 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; } int main(void) { DDRB = 0xFF ; TIMSK = 0b00000001 ; TCCR0 = 0b00000010 ; char temp ; sei() ; while(1) { temp = temp_18b20() ; if(temp > 1000) //если температура <0 { temp = 4096 - temp ; temp = -temp ; } digit1 = temp/10 ;//выводим на дисплей digit2 = temp%10 ; } }= ~(1 |
Автор: | md5sum [ Сб фев 04, 2012 16:51:09 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Dako писал(а): я так полагаю что с датчика неверные числа приходят В тыщапицотый раз сообщаю: датчики либо работают либо не работают, СОВСЕМ. Врать лично Вам им нет никакого резона. Проверяй алгоритм. Читай тыщапицот тем в которых все уже разжовано, все ошибки описаны. ЗЫ: если CRC не проверять, то что к датчику придираться.... |
Автор: | igor-x [ Сб фев 04, 2012 16:58:40 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
есть предложение открыть сайт http://тыщапицотпроDS18B20.RU |
Автор: | urry [ Сб фев 04, 2012 17:30:44 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
давайте я погадаю на кофейной гуще - у ТС датчик не 18b20 , а 1820 или 18S20. в этом случае при комнатной 18 градусов с учетом младшего разряда в регистре будет 36. 36 умножаем на 0.0625 = 2.25 градуса 36 умножаем на 0.625 = 22 градуса В задаче спрашивается - какая температура дома у ТС, если показывает 32 ? Около 25 - буржуй, однако... У меня сейчас 16... |
Автор: | O-LED [ Сб фев 04, 2012 17:41:28 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
urry писал(а): давайте я погадаю на кофейной гуще - у ТС датчик не 18b20 , а 1820 или 18S20. в этом случае при комнатной 18 градусов с учетом младшего разряда в регистре будет 36. 36 умножаем на 0.0625 = 2.25 градуса 36 умножаем на 0.625 = 22 градуса В задаче спрашивается - какая температура дома у ТС, если показывает 32 ? Около 25 - буржуй, однако... У меня сейчас 16... минвату под пол, окна оклеить, кол-во зубов в батареи удвоить и вы тоже буржуй |
Автор: | Dako [ Сб фев 04, 2012 17:55:12 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
ха-ха! Забавно! Ещё раз всем спасибо, Урри оказался прав, у меня действительно датчик 1820 ))) |
Автор: | ploop [ Сб фев 04, 2012 18:21:08 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
urry объявляется победителем "Битвы экстрасенсов"! |
Автор: | C@at [ Сб фев 04, 2012 18:29:43 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Сколько людей пишут здесь неправду, утверждая что эктрасенов здесь нет... а это что по вашему, за тыщапицот километров увидели; какой датчик, температуру в комнате и из чего сделана комната, и что свет в коридоре до сих пор включен... |
Автор: | Dako [ Сб фев 04, 2012 20:33:52 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
На момент измерения температуры, на улице было -45, спасибо ТЭЦ, г Новосибирск )) |
Автор: | Мастер Ломастер [ Вс фев 05, 2012 09:21:56 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Dako писал(а): На момент измерения температуры, на улице было -45, спасибо ТЭЦ, г Новосибирск )) че-то как-то не верится... даже по брехливым (занижающим) интернет-прогнозам такой температуры в районе Новосибирска не было и нет сейчас... 2-го февраля было -22-24 всего-то...
|
Автор: | Dako [ Вс фев 05, 2012 10:18:27 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Пардон, опечатался -35 было |
Автор: | Dako [ Вс фев 05, 2012 17:40:16 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Дико извиняюсь, господа, но не могу вкурить как контрольная сумма считается? Подскажите или ткните носом пожалуйста ) |
Автор: | md5sum [ Вс фев 05, 2012 17:47:19 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Код: #include <util/crc16.h> uint8_t crc=0; for (i=0;пока все байты не посчитаем;i++) { crc=_crc_ibutton_update(crc,bytes[i]); } Для DS18s20 Если считать только байты данных (от 0 до 7), то crc должно быть равно восьмому. Если считать ВСЕ 9 байт, то в итоге crc должно быть 0. |
Автор: | Dako [ Вс фев 05, 2012 18:30:06 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Скажите, а для DS1820 аналогично считается? |
Автор: | Мастер Ломастер [ Вс фев 05, 2012 18:31:55 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Dako писал(а): Скажите, а для DS1820 аналогично считается? может, пора, наконец, документацию на датчики почитать? даже ведь на русском полно статей - почитайте, не тратьте зря свое время и время тех, кто тут пытается вам помочь.
|
Автор: | Shapa [ Чт фев 09, 2012 22:58:02 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Dako А на счёт того, что у вас датчик белеберду выдает..(навреное, то 55, то 85) вы прерывания отключите, пока датчик опрашиваете. И не надо его дергать чаще чем 1 раз в секунду! Он у нас уже почетный пенсионер, работать так быстро не умеет и не хочет |
Автор: | Dako [ Ср фев 15, 2012 07:27:36 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Не, числа каждый раз разные, в среднем раз в 30 сек выкидывает неправильную температуру, опрашивается раз в 750 мс. Щас усиленно пытаюсь разобраться с алгоритмом расчёта CRC. Пока безуспешно (( |
Автор: | ploop [ Ср фев 15, 2012 07:36:30 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Что там разбираться? Есть ведь готовые библиотеки - бери и пользуйся. ----- по поводу датчиков... У меня 2 датчика на 10-метровом проводе, при ошибке CRC выводится ошибка. Не было ни разу. Сделал затычку - чтобы при первой же ошибке программа зажгла светик и не тушила. Прошла неделя - он не горит. |
Автор: | Dako [ Ср фев 15, 2012 07:48:10 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Пытался вкорячить в код, алгоритм товарища md5sum, то есть в выражение crc=_crc_ibutton_update(crc,bytes[i]); вместо bytes[i] по очереди подсовывал все 8 байт данных, по выходу из цикла сравнивал crc с 9-м полученым байтом. Баг немного видоизменился: стал появляться чаще, но теперь не случайные цифры, а нули только. Пока так.... |
Автор: | Dako [ Ср фев 15, 2012 07:49:35 ] |
Заголовок сообщения: | Re: В тыщапицотый раз про DS18B20. |
Может у меня код кривой, я только учусь |
Страница 1 из 59 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |