roboforum.ru

Технический форум по робототехнике.
Текущее время: 26 ноя 2024, 17:45

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 19 фев 2017, 12:35 
Не в сети

Зарегистрирован: 16 авг 2015, 00:22
Сообщения: 112
Вывод поправил. Проверил работу BCD_3 - тоже гуд. От 0 до 999 работает.
Исправно переключает %/°С. Также выдаёт ошибку при отсутствии датчика.


Вложения:
3.c [11.95 КиБ]
Скачиваний: 536
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 25 фев 2017, 15:29 
Не в сети

Зарегистрирован: 16 авг 2015, 00:22
Сообщения: 112
В чём у меня еще может быть проблемка?
Пробовал просто инициализировать датчик:
Код:
DHT_OUT = 0;
    delay_ms(19);      //Стартовый импульс до 20мс
    DHT_OUT = 1;
    DHT_DDR = 0;
    delay_us(31);      //Пауза 30мкс
    if(DHT_IN != 0)    //  ответ датчика:
      {                //  Последовательно низкий уровень 80мс
         type=0x44;    //                и высокий уровень 80мс
         return 1;     //  Далее идёт передача 5 байт данных:
      }                //  0 - низкий уровень 50 мкс + высокий уровень 26 мкс
    vvv=0;             //  1 - низкий уровень 50 мкс + высокий уровень 70 мкс
    delay_us(79);

Всегда возвращает ошибку(((
Неужели датчик накрылся?
Есть еще 18b20. Может его прикрутить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 27 фев 2017, 14:51 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
pirat777knj писал(а):
В чём у меня еще может быть проблемка?

А в чем вообще проблемы? Я не буду телепатией и криптоанализом заниматься :). Опиши проблемы...

pirat777knj писал(а):
Пробовал просто инициализировать датчик:

Эммм, лично я не писал с "нуля" опрос DHT22. Вместо этого я взял стандартный код arduino для DHT22.

Курить пдф ради написания с "нуля" чтение DHT22 не хочу, но беглый просмотр твоего кода и описания DHT22, показал что и не должно работать.
У тебя: "Стартовый импульс до 20мс", Пауза 30мкс, далее ты проверяешь DHT_IN и если он не ноль, то ошибка. Если посмотреть картинку, то через 30 мкс. там и должна быть "1".
Изображение

Твой код похож на "по ссылке выше", но отличается уже на стадии init. Тут уже очень сложно давать советы, или не меняй код, пока не получил рабочий вариант, или прикручивай проверенные библиотеки от дуины. Правда может быть сложность с переходом на atmega8 :(

Добавлено спустя 9 минут 44 секунды:
Dmitry__ писал(а):
Правда может быть сложность с переходом на atmega8

Хотя, чел перенес код на atmega8:
http://blog.tataranovich.com/2012/03/atmega8.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 27 фев 2017, 16:54 
Не в сети

Зарегистрирован: 16 авг 2015, 00:22
Сообщения: 112
Код:
unsigned char n, k, idx;
    data[0] = data[1] = data[2] = data[3] = data[4] = 0;
    DHT_OUT = 0;
    delay_ms(18);
    DHT_OUT = 1;
    DHT_DDR = 0;
    delay_us(50);
    if(DHT_IN != 0)

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

Вот 18b20 повесил. Он работает, правда у меня с преобразованием пока не получается.
Данные с него получаю, а вот конвертировать в нормальных вид не выходит(((
Код:
   if (MSB>0x7f)                 // если минус
        {
        tt=!((8<<MSB)|LSB)+1;    //инвертируем
        type=0x11;
        }
        else
        {
         type=0;
         tt=(8<<MSB)|LSB);
         }


Как это в нормальный вид привести для конвертера BCD?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 27 фев 2017, 17:44 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
pirat777knj писал(а):
Это конечно странно...
Изначально в коде была она, а 31 это так... экспериментировал.

Ну я могу давать советы только по тому коду, который ты выкладываешь. Представляешь какие сложности? Ты выкладываешь не тот код на который просишь помощь :)
pirat777knj писал(а):
Как это в нормальный вид привести для конвертера BCD?

В коде полная каша, вот это: "(8<<MSB)" по русски читается как: сдвинуть число 8 влево на MSB значений. Твой вопрос легко гуглится:
http://chipenable.ru/index.php/programming-avr/item/86-
Код:
1.  Определяем знак температуры и отображаем его на дисплее
Для работы с символьным дисплеем можно использовать библиотеку lcd_lib или любую другую.
   
   LCD_Goto(5,0);            //устанавливаем курсор в нужное место
    if ((scratchpad[1]&128) == 0){   //проверяем старший разряд
      LCD_WriteData('+');
    }
    else{
      LCD_WriteData('-');
      …..
    }



Цитата:
2. Если значение температуры отрицательное, преобразуем его в положительное
В DS18B20 для представления отрицательной температуры используется дополнительный код. Особенность этого кода заключается в том, что он позволяет осуществлять операции вычитания через сложение. Чтобы получить дополнительный код числа, нужно выполнить над числом поразрядную инверсию (~) и прибавить к результату единицу.

tmp = ~tmp + 1;

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

unsigned int tmp;

// «склеиваем» нулевой и первый байты ОЗУ датчика
tmp = ((unsigned int)scratchpad[1]<<8)|scratchpad[0];

//выполняем операцию логического отрицания
tmp = ~tmp + 1;

//помещаем результат в соответствующие переменные
scratchpad[0] = tmp;
scratchpad[1] = tmp>>8;


Цитата:
3. Выделяем с помощью битовых масок целую часть температуры, переводим в символы и отображаем на дисплее.


Цитата:
4. Выделяем дробную часть, преобразуем дробную часть в целую, переводим в символы и отображаем на дисплее.


Дальше используй свой отлаженный "BCD_3"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 27 фев 2017, 22:11 
Не в сети

Зарегистрирован: 16 авг 2015, 00:22
Сообщения: 112
:crazy:
Как бы не так!
Код:
tmp = ~tmp + 1; 

Не работает. Пробовал. Компилятор начинает ругаться на отсутствие скобки!
Какой и откуда!?
Плюс у меня не lcd и функции вывода на него ничем не помогут. Увы и ах. На нем то давно б сделал.
Основное непонятное: значение доброй части равно 0,0625 на 1 единицу. Отсюда нужно округлять до десятых и откидывать остаток. Потом эти дело записывать в переменную к целому значению. А вот как тогда это сделать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 27 фев 2017, 23:38 
Не в сети
Аватара пользователя

Зарегистрирован: 13 янв 2011, 15:25
Сообщения: 8033
Откуда: Санкт-Петербург
pirat777knj писал(а):
Не работает. Пробовал. Компилятор начинает ругаться на отсутствие скобки!
Какой и откуда!?


Ошибки тут нет. Что за компилятор?
Попробуй: "tmp = ~(tmp) + 1;". Или вообще в две строчки:
Код:
tmp = ~tmp;
tmp += 1;

Если ругнется, то в скобки:
Код:
tmp = ~(tmp);
tmp += 1;


pirat777knj писал(а):
Плюс у меня не lcd и функции вывода на него ничем не помогут. Увы и ах. На нем то давно б сделал.

Ну так пример дан не ради вывода на lcd, а для алгоритма преобразования данных. Ведь легко читаемый код, например как получили знак температуры:
Код:
    if ((scratchpad[1]&128) == 0){   //проверяем старший разряд
      LCD_WriteData('+');
    }
    else{
      LCD_WriteData('-');
      …..
    }


Просто замени "LCD_WriteData('-');" на свою реализацию вывода информации. Ведь ты будешь как-то различать отриц. температуры?

pirat777knj писал(а):
Основное непонятное: значение доброй части равно 0,0625 на 1 единицу. Отсюда нужно округлять до десятых и откидывать остаток. Потом эти дело записывать в переменную к целому значению. А вот как тогда это сделать?

Так в той ссылке все сказано :shock:
Цитата:
//выделяем с помощью битовой маски дробную часть
temperature = (scratchpad[0]&15);

//преобразуем в целое число
temperature = (temperature<<1) + (temperature<<3);// Умножаем на 10
temperature = (temperature>>4);//делим на 16 или умножаем на 0.0625


Вот это: "temperature = (scratchpad[0]&15);" оставит данные дробной части (4 бита).
Дальше идет умножение на 10 и деление на 16. В temperature будет двоичное представление дробной части температуры, причем в целом виде. Открой пдф на DS18B20, посмотри например значение 0.5 град. "+0.5°C 0000 0000 0000 1000", что в Hex будет "0008h". Умножь это на 10 и раздели на 16 = 5.
5 - это дробная часть температуры в целом виде (домноженное на 10).
Не понимаю в чем проблема :pardon:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 28 фев 2017, 00:50 
Не в сети

Зарегистрирован: 16 авг 2015, 00:22
Сообщения: 112
Хм... Я путаюсь в операциях. Мя смутило что он смещения использовал. Над попробовать завтра. Спасибо за разъяснения


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Газоразрядный термометр
СообщениеДобавлено: 28 фев 2017, 23:37 
Не в сети

Зарегистрирован: 16 авг 2015, 00:22
Сообщения: 112
Ну просто прям огроменное спасибо. Заставил таки это работать))))
Вот дождусь когда из китая DHT22 придёт и начну опять ковыряться))


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO