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

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

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

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

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

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

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

 
Опции темы
Непрочитано 16.01.2014, 17:29  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию ds18b20 отрицательная температура

Всем привет!Помогите пожалуйста!Делаю часы-таймер,для подсветки рассады.Захотел туда всунуть датчик ds18b20.Нашёл у себя куски кода,давно работал с ними - остались.Решил проверить,состыковал с динамической индикацией,набросал проект в Протеусе .Возникла проблема.
Положительные значения выводятся отлично,и десятые доли градуса тоже.А
отрицательные целые нормально,десятые врут на 0.1.
Второй день сижу,не могу найти ошибку.Пишу в кодевижне 2.04.Протеус 7.7.
Привожу кусок кода где быстрее всего ошибка.Прерываний вообще нету в пробном проекте.
//ПОДПРОГРАММА ЧТЕНИЯ ТЕМПЕРАТУРЫ ИЗ ДАТЧИКА-1(РАБОЧЕГО)
//читается младшим битом вперёд
void RTEMPER1(void)
{
int mlb_t=0;//для младшего байта тем-ры датчика
int ctb_t=0;//для старшего байта тем-ры датчика
int temper=0;//для темп-ры
int drob=0; //для дробной части темп-ры
int tmp=0; //вспомогательная
unsigned char minys=0;//хранение минуса


//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 и тем самым сдвигаем на индикаторе цифры влево освобождая
//правый знак для десятых
drob=drob*625/1000;//выделяем первый десятичный знак после запятой
temper=ctb_t+drob; //слажуем целую и дробные части в итоге мы получаем целое число
//а запятую зажигаем на индикаторе т.е. на индикаторе мы как-бы
//делим 4-х разрядное число на 10 и получаем 3- хразрядное + десятые


temp_rab=temper;//копируем текущую темп-ру рабочего датчика в глобальную переменную

//#asm("sei")
}
Не пинайте плиз за код,я любитель.Пишу ток для собственных нужд,как смог научиться.
Реклама:
YURALL72 вне форума  
Непрочитано 16.01.2014, 19:11  
bass1981
Гражданин KAZUS.RU
 
Регистрация: 01.09.2007
Сообщений: 898
Сказал спасибо: 278
Сказали Спасибо 57 раз(а) в 54 сообщении(ях)
bass1981 на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

http://chipenable.ru/index.php/progr...roystvami.html Вот по этой статье неделю назад подключал используя библиотеки правда AVRStudio..... Работает все ОК.

Процедура преобразования
Код:
    scratchpad[0] = OWI_ReceiveByte(BUS);
    scratchpad[1] = OWI_ReceiveByte(BUS);
     
    /*выводим знак и преобразуем число, если оно отрицательное*/
   
    if ((scratchpad[1]&128) == 0){
      //LCD_WriteData('+');
	TempZnak=1;
    }
    else{
      //LCD_WriteData('-');
      TempZnak=0;
      tmp = ((unsigned int)scratchpad[1]‹‹8)|scratchpad[0];
      tmp = ~tmp + 1;
      scratchpad[0] = tmp;
      scratchpad[1] = tmp››8;  
    }
bass1981 вне форума  
Сказали "Спасибо" bass1981
YURALL72 (16.01.2014)
Непрочитано 16.01.2014, 19:51  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

Когда-то делал на АСМе.
Может в коня...
Это для температуры без дробной части.
PHP код:
;****************************************
;
Подпрограмма вычисления температуры
Результат в w1rdbuf
;****************************************
tCalk:
        
ldi        w1cnt,4                ;Загружаем счетчик интераций(деление на 16)
tCalkloop:
        
ror        Command_1            ;High Делим на 2
        ror        Command_0            
;Low
        dec        w1cnt                
;Следующий
        brne    tCalkloop            
;И так 4 раза
        ClrSc                        
;Очищаем временные регистры результата
;Проверяем знак температуры
sbrs    Command_0
,7
rjmp    NoZnak
neg        Command_0
ldi        temp
,0b00001111                ;Загружаем код знака "-" минус
mov        sc2
,temp
NoZnak
:
;****************************************
;
Преобразование в десятичный формат 
omercury вне форума  
Сказали "Спасибо" omercury
YURALL72 (16.01.2014)
Непрочитано 16.01.2014, 19:58  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

Там все просто. Если биты отрицательной температуры не установлены, то температура в 16 раз меньше кода. Если установлены, то надо 255 еще вычесть из результата.
Easyrider83 вне форума  
Непрочитано 16.01.2014, 20:00  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

YURALL72, Это не ради "спасибки".
Это чтоб понял - в чём причина. (потому собсно на АСМе.)
omercury вне форума  
Непрочитано 16.01.2014, 20:06  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

Всем спасибо,пока не получается.(((Вроде всё верно делаю .Объеденяю
старший и младший байты и если число отрицательное - побитное инвертирование и +1.А дальше как с положительным числом.Ну вот в дробной части что-то не клеется,беда прямо.
YURALL72 вне форума  
Непрочитано 16.01.2014, 20:10  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

Сообщение от Easyrider83 Посмотреть сообщение
Там все просто. Если биты отрицательной температуры не установлены, то температура в 16 раз меньше кода. Если установлены, то надо 255 еще вычесть из результата.
У меня потерялся 0.1 градус в дробной части,при отриц. значениях.При полож. и целая и дробная части в норме.
YURALL72 вне форума  
Непрочитано 16.01.2014, 20:15  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

Сообщение от YURALL72 Посмотреть сообщение
У меня потерялся 0.1 градус
"Задаю наводящий вопрос" (с)
PHP код:
neg        Command_0 
omercury вне форума  
Непрочитано 16.01.2014, 20:51  
YURALL72
Прописка
 
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
YURALL72 на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

Сообщение от omercury Посмотреть сообщение
"Задаю наводящий вопрос" (с)
PHP код:
neg        Command_0 
вот я это и делаю:
в ctb_t (объявлена как int)на этот момент находятся старший и младший байты температуры.
ctb_t=~ctb_t; //инвертируем число
ctb_t++; //и +1 т.е. переводим из дополнит. кода в нормальный
А может дробную часть не нужно трогать?Но в примерах (гуглил) всё вместе
инвертируют.Да и сбой даёт только дробная часть.
YURALL72 вне форума  
Непрочитано 16.01.2014, 21:02  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,982
Сказал спасибо: 2,554
Сказали Спасибо 11,862 раз(а) в 5,944 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: ds18b20 отрицательная температура

Чой-то я запамятовал, о какой дробной части Вы говорите? Где ДШ говорит, что в двоичном коде температуры есть дробная часть?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
 

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

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

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, время: 01:21.


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