1. Для чего Вы в конце каждого тайм-слота переводите шину на выход ? Она должна оставаться в высокоимпедансном состоянии.
2. Ошибочка в DS_RX. :
Код: Выделить всё
DS=0;
DSIO=1;
Да и в DS_TX таже петрушка.
Код: Выделить всё
DS=0;
DSIO=1;
там еще проще: в первых двух байтах уже находится значение температуры в формате int - в дополнительном коде! не надо никуда ничего переносить вообще, только скорректировать "дробную часть", если необходимо!Аlex писал(а):Там же всё просто. старший бит отвечает за знак, остальное - данные.
Можно делать вообще просто. Перекидывайте оба принятых байта в знаковую int и в ней будет лежать готовая знаковая температура.
Код: Выделить всё
unsigned char scratchpad[9]; // в этот массив вы считываете из датчика данные
int *temperature = scratchpad; // а здесь автоматически будет получаться температура!!!!
// когда проверите, что все считано верно (CRC корректна), можете использовать температуру напрямую
printf("T=%d", *temperature/2); // деление на 2 - это отбрасывание "дробной части" для DS1820Ну я это и имел в виду, только сказал другими словами, более понятными новичку. И с указателями не стал грузить человека, а то он окончательно запутался быARV писал(а):там еще проще: в первых двух байтах уже находится значение температуры в формате int - в дополнительном коде!
Немного поправлю, если Вы не против :Код: Выделить всё
int *temperature = scratchpad; // а здесь автоматически будет получаться температура!!!!
Код: Выделить всё
int *temperature = (int *)scratchpad;
Код: Выделить всё
*((char*)&tmp)= arr[0];
*((char*)&tmp+1)= arr[1];
tmp*=10;
tmp/=(dev_fam==0x10)?2:16;
я не противАlex писал(а):Немного поправлю, если Вы не против :Код: Выделить всё
int *temperature = (int *)scratchpad;
ARV писал(а):однако warning - не error все-таки
Спасибо огромное! Переделал. Все заработало как надо!Аlex писал(а): Для чего Вы в конце каждого тайм-слота переводите шину на выход ? Она должна оставаться в высокоимпедансном состоянии.
Код: Выделить всё
void DS_TX (unsigned char dsd){
unsigned char b;
DSIO=0;
for (b=1; b<9; b++){
DS=0;
__delay_us(10);
if (dsd&0b00000001) DS=1;
dsd=dsd>>1;
__delay_us(50);
DS=1;
}
DSIO=1;
}Код: Выделить всё
unsigned char DS_RX(void){
unsigned char a, b;
for (b=0; b<8; b++){
DSIO=0;
DS=0;
DSIO=1;
__delay_us(10);
a=a>>1;
if (DS==1) a=a|(1<<7);
__delay_us(50);
// DSIO=0;
}
return a;
}Bkmz писал(а):11111111 = -0.0
А что удивительного? Это значит температура в диапазоне от 0 до -0.4-=Vovka=- писал(а):Bkmz писал(а):11111111 = -0.0
Получается в Протеусе ошибка? И -0.0 это на самом деле все же -0.5? Похоже придется зимы ждать что бы сравнить с нормальным градусникомGudd-Head писал(а):Допкод как раз и придумали чтобы избавиться от проблемы "+0" и "-0".
С быдлокодом может быть всё что угодно.Bkmz писал(а):Получается в Протеусе ошибка?
Морозилки нету, что ли?Bkmz писал(а):Похоже придется зимы ждать что бы сравнить с нормальным градусником
А личку почитать?Bkmz писал(а):Вот результаты испытаний. Обычный градусник -19. Домашняя метеостанция -19,2. DS18S20 -17,5. Если верить даташиту, а не протеусу, то будет -18,0. И это ближе к правильному значению. А в итоге получается, что он все же на 1 градус завышает в данном диапазоне.
По умолчанию.-=Vovka=- писал(а):А какое разрешение датчика выставлено?
Прочитал. Спасибо.BOB51 писал(а):А личку почитать?
А тут написать ?BOB51 писал(а):А личку почитать?
![]()