Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.01.2014, 19:41
|
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: ds18b20 отрицательная температура
Спасибо Всем,но Ваш код мне не поможет.Я и свой с трудом понимаю.В общем проблему решил.В частности сам толком не понимаю как(.
Ввёл дополнительную переменную типа float.И если число отрицательное,прибавляю к обработке "дробной" части 0.5.А если положительное не добавляю.Тогда всё выводится корректно.Буду стараться чётко представить,что происходит с числами.
//ПОДПРОГРАММА ЧТЕНИЯ ТЕМПЕРАТУРЫ ИЗ ДАТЧИКА-1(РАБОЧЕГО)
//читается младшим битом вперёд
void RTEMPER1(void)
{
unsigned int mlb_t=0;//для младшего байта тем-ры датчика
unsigned int ctb_t=0;//для старшего байта тем-ры датчика
unsigned int temper=0;//для темп-ры
unsigned int drob=0; //для дробной части темп-ры
unsigned int tmp=0; //вспомогательная
unsigned char minys=0;//хранение минуса
float fdrob;
//reset_d1 (); //ВЫЗЫВАЕТСЯ ПОДПРОГРАММА СБРОСА ДАТЧИКА на ассемблере
RESETD1 (); //ВЫЗЫВАЕТСЯ ПОДПРОГРАММА СБРОСА ДАТЧИКА на си
wrt_byte (0xcc); //ВЫЗЫВАЕТСЯ ПОДПРОГРАММА ПЕРЕСЫЛКИ БАЙТА ДАТЧИКУ
//И КОМАНДА "ПРОПУСКА ПЗУ" $CC ОТПРАВЛЯЕТСЯ В ДАТЧИК
wrt_byte (0xbe); //ВЫЗЫВАЕТСЯ ПОДПРОГРАММА ПЕРЕСЫЛКИ БАЙТА ДАТЧИКУ
//И КОМАНДА "ПРОЧИТАТЬ ТЕМПЕРАТУРУ" $BE ОТПРАВЛЯЕТСЯ В ДАТЧИК
// #asm("cli")
mas_rab[0]=read_byte();//МЛАДШИЙ БАЙТ СЧИТЫВАЕТСЯ
mas_rab[1]=read_byte();//СЧИТЫВАЕТСЯ СТАРШИЙ БАЙТ
mas_rab[2]=read_byte();//СЧИТЫВАЕТСЯ И СОХРАНЯЕТСЯ БАЙТ ПОЛЬЗОВАТЕЛЯ 1
mas_rab[3]=read_byte();//СЧИТЫВАЕТСЯ И СОХРАНЯЕТСЯ БАЙТ ПОЛЬЗОВАТЕЛЯ 2
mas_rab[4]=read_byte();//СЧИТЫВАЕТСЯ И СОХРАНЯЕТСЯ БАЙТ КОНФИГУРАЦИИ
mas_rab[5]=read_byte();//СЧИТЫВАЕТСЯ И СОХРАНЯЕТСЯ НЕИСПОЛЬЗУЕМЫЙ БАЙТ
mas_rab[6]=read_byte();//СЧИТЫВАЕТСЯ И СОХРАНЯЕТСЯ НЕИСПОЛЬЗУЕМЫЙ БАЙТ
mas_rab[7]=read_byte();//СЧИТЫВАЕТСЯ И СОХРАНЯЕТСЯ НЕИСПОЛЬЗУЕМЫЙ БАЙТ
mas_rab[8]=read_byte();//СЧИТЫВАЕТСЯ И СОХРАНЯЕТСЯ БАЙТ КОНТРОЛЬНОЙ СУММЫ
mlb_t=mas_rab[0]; //МЛАДШИЙ БАЙТ СЧИТЫВАЕТСЯ
ctb_t=mas_rab[1]; //СЧИТЫВАЕТСЯ СТАРШИЙ БАЙТ
minys=0; //стираем код минуса
tmp=ctb_t; //делаем копию ctb_t
tmp=tmp‹‹8; //значашие старшие разряды тем-ры в старший байт слова tmp
ctb_t=tmp+mlb_t; //ctb_t=cтаршие разряды тем-ры+мл-шие разряды тем-ры+дробная часть
//т.е. 2 байта темпер-ры впихиваем в одно слово
//***************температура отрицательная************************************* **********
if ((tmp & 0xf800)==0xf800)//5 старших битов старшего байта темп-ры DS18B20 это
//знак температуры S=1-отриц и S=0-полож "SSSS STTT TTTT DDDD" T-целая часть тем-ры D-дробная
//маскируя числом 0b1111 1000 0000 0000 = 0xf8 и сравнивая с ним мы узнаём:tmp=0xf800 значит
//S=1 т. е. темп-ра отриц. ,tmp!=0xf800 значит S=0 темп-ра полож.
{
minys=10; //темп-ра отриц. записуем код минуса
ctb_t=~ctb_t; //инвертируем число
ctb_t++; //и +1 т.е. переводим из дополнит. кода в нормальный
};
//************************************************** ************************************
drob=ctb_t; //копируем слово темп-ры
drob &=0b0000000000001111; //выделяем дробную часть
ctb_t=ctb_t››4; //сдвигаем целую часть темп-ры на нормальное место вправо
//левую часть слова маскировать не надо т.к. если темп-ра полож.тоона и так =0 а если отриц.
//то при переводе из допол-го кода в нормальный она обнулится
ctb_t=ctb_t*10;// *на10 и тем самым сдвигаем на индикаторе цифры влево освобождая
//правый знак для десятых
fdrob=drob;
fdrob=fdrob*625/1000;//выделяем первый десятичный знак после запятой
if (minys==10)fdrob= fdrob+0.5; //если температура отрицательная +0.5
temper=ctb_t+fdrob; //слажуем целую и дробные части в итоге мы получаем целое число
//а запятую зажигаем на индикаторе т.е. на индикаоре мы как-бы
//делим 4-х разрядное число на 10 и получаем 3- хразрядное + десятые
temp_rab=temper;//копируем текущую темп-ру рабочего датчика в глобальную переменную
//#asm("sei")
}
|
|
|
|
20.01.2014, 21:08
|
|
Заблокирован
Регистрация: 23.09.2007
Сообщений: 761
Сказал спасибо: 84
Сказали Спасибо 352 раз(а) в 151 сообщении(ях)
|
Re: ds18b20 отрицательная температура
в cvavr есть стандартная либа...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:33.
|
|