roboforum.ru

Технический форум по робототехнике.

Газоразрядный термометр

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Газоразрядный термометр

Сообщение pirat777knj » 19 фев 2017, 12:35

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

Re: Газоразрядный термометр

Сообщение pirat777knj » 25 фев 2017, 15:29

В чём у меня еще может быть проблемка?
Пробовал просто инициализировать датчик:
Код: Выделить всёРазвернуть
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. Может его прикрутить?
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Dmitry__ » 27 фев 2017, 14:51

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
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Газоразрядный термометр

Сообщение pirat777knj » 27 фев 2017, 16:54

Код: Выделить всёРазвернуть
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?
pirat777knj
 
Сообщения: 112
Зарегистрирован: 16 авг 2015, 00:22

Re: Газоразрядный термометр

Сообщение Dmitry__ » 27 фев 2017, 17:44

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"
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Газоразрядный термометр

Сообщение pirat777knj » 27 фев 2017, 22:11

:crazy:
Как бы не так!
Код: Выделить всёРазвернуть
tmp = ~tmp + 1;  

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

Re: Газоразрядный термометр

Сообщение Dmitry__ » 27 фев 2017, 23:38

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:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Газоразрядный термометр

Сообщение pirat777knj » 28 фев 2017, 00:50

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

Re: Газоразрядный термометр

Сообщение pirat777knj » 28 фев 2017, 23:37

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

Пред.

Вернуться в Микроконтроллеры

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

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