Вывод поправил. Проверил работу BCD_3 - тоже гуд. От 0 до 999 работает.
Исправно переключает %/°С. Также выдаёт ошибку при отсутствии датчика.
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);
pirat777knj писал(а):В чём у меня еще может быть проблемка?
pirat777knj писал(а):Пробовал просто инициализировать датчик:
Dmitry__ писал(а):Правда может быть сложность с переходом на atmega8
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)
if (MSB>0x7f) // если минус
{
tt=!((8<<MSB)|LSB)+1; //инвертируем
type=0x11;
}
else
{
type=0;
tt=(8<<MSB)|LSB);
}
pirat777knj писал(а):Это конечно странно...
Изначально в коде была она, а 31 это так... экспериментировал.
pirat777knj писал(а):Как это в нормальный вид привести для конвертера BCD?
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. Выделяем дробную часть, преобразуем дробную часть в целую, переводим в символы и отображаем на дисплее.
tmp = ~tmp + 1;
pirat777knj писал(а):Не работает. Пробовал. Компилятор начинает ругаться на отсутствие скобки!
Какой и откуда!?
tmp = ~tmp;
tmp += 1;
tmp = ~(tmp);
tmp += 1;
pirat777knj писал(а):Плюс у меня не lcd и функции вывода на него ничем не помогут. Увы и ах. На нем то давно б сделал.
if ((scratchpad[1]&128) == 0){ //проверяем старший разряд
LCD_WriteData('+');
}
else{
LCD_WriteData('-');
…..
}
pirat777knj писал(а):Основное непонятное: значение доброй части равно 0,0625 на 1 единицу. Отсюда нужно округлять до десятых и откидывать остаток. Потом эти дело записывать в переменную к целому значению. А вот как тогда это сделать?
//выделяем с помощью битовой маски дробную часть
temperature = (scratchpad[0]&15);
//преобразуем в целое число
temperature = (temperature<<1) + (temperature<<3);// Умножаем на 10
temperature = (temperature>>4);//делим на 16 или умножаем на 0.0625
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4