Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.01.2014, 17:29
|
#1
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
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")
}
Не пинайте плиз за код,я любитель.Пишу ток для собственных нужд,как смог научиться.
|
|
|
|
16.01.2014, 19:11
|
#2
|
Гражданин KAZUS.RU
Регистрация: 01.09.2007
Сообщений: 898
Сказал спасибо: 278
Сказали Спасибо 57 раз(а) в 54 сообщении(ях)
|
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
|
|
|
16.01.2014, 19:51
|
#3
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
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
|
|
|
16.01.2014, 19:58
|
#4
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: ds18b20 отрицательная температура
Там все просто. Если биты отрицательной температуры не установлены, то температура в 16 раз меньше кода. Если установлены, то надо 255 еще вычесть из результата.
|
|
|
|
16.01.2014, 20:00
|
#5
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: ds18b20 отрицательная температура
YURALL72, Это не ради "спасибки".
Это чтоб понял - в чём причина. (потому собсно на АСМе.)
|
|
|
|
16.01.2014, 20:06
|
#6
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: ds18b20 отрицательная температура
Всем спасибо,пока не получается.(((Вроде всё верно делаю .Объеденяю
старший и младший байты и если число отрицательное - побитное инвертирование и +1.А дальше как с положительным числом.Ну вот в дробной части что-то не клеется,беда прямо.
|
|
|
|
16.01.2014, 20:10
|
#7
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: ds18b20 отрицательная температура
Сообщение от Easyrider83
|
Там все просто. Если биты отрицательной температуры не установлены, то температура в 16 раз меньше кода. Если установлены, то надо 255 еще вычесть из результата.
|
У меня потерялся 0.1 градус в дробной части,при отриц. значениях.При полож. и целая и дробная части в норме.
|
|
|
|
16.01.2014, 20:15
|
#8
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: ds18b20 отрицательная температура
Сообщение от YURALL72
|
У меня потерялся 0.1 градус
|
"Задаю наводящий вопрос" (с)
|
|
|
|
16.01.2014, 20:51
|
#9
|
Прописка
Регистрация: 29.06.2007
Сообщений: 217
Сказал спасибо: 143
Сказали Спасибо 13 раз(а) в 11 сообщении(ях)
|
Re: ds18b20 отрицательная температура
Сообщение от omercury
|
"Задаю наводящий вопрос" (с)
|
вот я это и делаю:
в ctb_t (объявлена как int)на этот момент находятся старший и младший байты температуры.
ctb_t=~ctb_t; //инвертируем число
ctb_t++; //и +1 т.е. переводим из дополнит. кода в нормальный
А может дробную часть не нужно трогать?Но в примерах (гуглил) всё вместе
инвертируют.Да и сбой даёт только дробная часть.
|
|
|
|
16.01.2014, 21:02
|
#10
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,982
Сказал спасибо: 2,554
Сказали Спасибо 11,862 раз(а) в 5,944 сообщении(ях)
|
Re: ds18b20 отрицательная температура
Чой-то я запамятовал, о какой дробной части Вы говорите? Где ДШ говорит, что в двоичном коде температуры есть дробная часть?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:18.
|
|