AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
23.05.2011, 12:13
|
|
Частый гость
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
ds18b20 и atmega8 вывод температуры с десятичным знаком
добрый день, у меня такая проблемка: не знаю как вывести температуру с десятичным знаком.
код такой
devices=w1_init(); //ищем датчики
while(devices›0) //бесконечный цикл, если датчик подключен
{
temper=ds18b20_temperature(0);
if(temper != -9999) // нет ошибок
{
//Анализ на отрицательную температуру
if( temper›1000 ) { temper=4096-temper; temper=-temper; show_digital(temper, 0,4);}
real_digital(temper,0);
} else real_digital(666,0); // если датчиков нет
delay_ms(500);
}
}
real_digital(666,0); // если датчиков нет
delay_ms(500);
}
буду очень рад помощи.
всё работает и отображается на 7seg индикторе. но оч хочется вывод с десятичным знаком градуса.
буду очень рад помощи.
|
|
|
Сказали "Спасибо" yuta_86
|
|
|
23.05.2011, 12:42
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
Можно сделать табличку соответствия четырех младших бит измеренного значения десятичной цифре, с округлением по вашему вкусу. Выводить запятую и правее эту цифру на дисплей. Это будет не очень затратно - просто символьный массив из 16 байт с индексацией этими четырьмя младшими битами.
|
|
|
Сказали "Спасибо" dadigor
|
|
|
23.05.2011, 12:43
|
|
Частый гость
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
не совсем понятно. можете показать не примере?
|
|
|
Сказали "Спасибо" yuta_86
|
|
|
23.05.2011, 13:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
Это нужно для понтов? У 18В20 погрешность пара градусов... Если нужна точность - есть микросхемы с погрешностью 0,1 градус при комнатных температурах и пол-градуса во всем диапазоне
|
|
|
|
23.05.2011, 13:31
|
|
Частый гость
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
Сообщение от niXto
|
Это нужно для понтов? У 18В20 погрешность пара градусов...
|
погрешность 0.5 градуса.
а что это так трудно реализовать? если очень тогда молчу....
|
|
|
Сказали "Спасибо" yuta_86
|
|
|
23.05.2011, 13:37
|
|
Вид на жительство
Регистрация: 21.11.2009
Сообщений: 342
Сказал спасибо: 4
Сказали Спасибо 149 раз(а) в 66 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
Функция - конвертирует 12-битное число, считанное из 18В20 в температуру с точностью 0.1град. Нужно сконвертировать результат в ВСD, вывести на индикатор и поставить точку в нужном месте.
Код:
|
// convert 12-bit temperature data of ds18b20 to signed celsius fixed-point (with tenth)
S16 ds1w_12bit2tenth(U16 value) {
U8 value_sign = (value ›› 8) & 0x80; // remember sign of value
if (value_sign) value = 0 - value; // convert to absolute value
value = (value ›› 1) + (value ›› 3); // convert from 12-bit to fixed point
if (value_sign) value = 0 - value; // restore sign of result
return value;
} |
|
|
|
|
23.05.2011, 13:39
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
Младший бит 12-разрядного кода температуры, а я так понимаю, что Вы снимаете 12 бит с Далласа, равен 0,0625 градуса Цельсия. Соответственно
0000b = 0,0000 = 0,0 цифра 0
0001b = 0,0625 ~ 0,1 цифра 1
0010b = 0,1250 ~ 0,1 цифра 1
0011b = 0,1875 ~ 0,2 цифра 2
0100b = 0,2500 ~ 0,3 цифра 3
0101b = 0,3125 ~ 0,3 цифра 3
0110b = 0,3750 ~ 0,4 цифра 4
0110b = 0,4375 ~ 0,4 цифра 4
....
и так далее до 1111b, также округляя значение этих бит до первой цифры после запятой.
В соответствии с этим, надо объявить что-то типа:
unsigned int Desyat_Zifra[16] = { 0, 1, 1, 2, 3, 3, 4, 4, ...};
или так, в зависимости от Вашего способа вывода на ЖКИ
unsigned char Desyat_Zifra[16] = { '0', '1', '1', '2', '3', '3', '4', '4', ...};
Искомая цифра для 12-разрядного значения temper:
Desyat_Zifra[temper & 0xF]
А далее - мне пока не очень ясно, что именно делают
show_digital(temper, 0,4); и real_digital(temper,0);
|
|
|
Сказали "Спасибо" dadigor
|
|
|
23.05.2011, 13:46
|
|
Частый гость
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
show_digital (целое число, ставить ли точку, с какого разряда выводить)
real_digital(целое число, где ставить точку);
хотелось бы получить число вещественное с датчика, а там уже вывести на 7-сег индикатор так как мне хочется.
|
|
|
Сказали "Спасибо" yuta_86
|
|
|
23.05.2011, 14:19
|
|
Прописка
Регистрация: 10.09.2010
Сообщений: 113
Сказал спасибо: 31
Сказали Спасибо 27 раз(а) в 27 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
temper=ds18b20_temperature(0);
Здесь temper - 12тибитное? Тогда преобразовав его в положительное 12битное, надо из его целой части, откинув дробную, сделать число, в 10 раз большее и прибавить к нему десятичную цифру - округленное значение дробной части
temper = (temper ›› 4) * 10 + Desyat_Zifra[temper & 0xF]
и выводить, как число в диапазоне от 0 до 1250, не забыв про знак и запятую
|
|
|
Сказали "Спасибо" dadigor
|
|
|
23.05.2011, 14:21
|
|
Частый гость
Регистрация: 12.01.2011
Сообщений: 36
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: ds18b20 и atmega8 вывод температуры с десятичным знаком
здесь temper int
|
|
|
Сказали "Спасибо" yuta_86
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:03.
|
|