Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 17.01.2014, 19:41  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию 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")
}
Реклама:
YURALL72 вне форума  
Непрочитано 20.01.2014, 21:08  
kosmos440o
Заблокирован
 
Регистрация: 23.09.2007
Сообщений: 761
Сказал спасибо: 84
Сказали Спасибо 352 раз(а) в 151 сообщении(ях)
kosmos440o на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

в cvavr есть стандартная либа...
kosmos440o вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Atmega128 DS18B20 koznov123 Микроконтроллеры, АЦП, память и т.д 10 01.06.2011 10:39
Минусовая температура в цифровом термометре на ATMega8 vhitman Микроконтроллеры, АЦП, память и т.д 6 25.11.2010 09:59
Подключение DS18B20 r Attiny2313 vaal555 Микроконтроллеры, АЦП, память и т.д 1 27.09.2010 22:06
ATmega8 и DS18B20, не определяется датчик butman Микроконтроллеры, АЦП, память и т.д 21 09.06.2007 22:05


Часовой пояс GMT +4, время: 06:32.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot