Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Модератор форума: demanik, ivan_fd  
Проблема с конвертацией результата от ds1307
MiXaS Дата: Пт, 23.01.2015, 09:14  |                                                                                                                Сообщение # 31
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

А зачем так сложно?
Из даташита известно, что 1 бит = 0,0625 гр С (18b20). Совмещаем в одну переменную 2 байта температуры и умножаем на (для 18B20) 0,0625 (для 18s20) 0.5. И ВСЕ!
Мне еще не понятно почему опрашивают 11 бит для определения знака? В том же документе написано, что этим занимается 15 бит. Для отрицательных температур я использовал вот такую формулу:

Float = $ffff-Temp +1
Float =Float * 0.0625,
где ТЕМР - 2-х байтная температура от датчика.
ЯНДЕКС Дата: 23.01.2015
AndrF Дата: Пт, 23.01.2015, 11:14  |                                                                                                                Сообщение # 32
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Цитата MiXaS ()
Мне еще не понятно почему опрашивают 11 бит для определения знака? В том же документе написано, что этим занимается 15 бит
Ну, в принципе, можно использовать и 11-ый. По табличке 2 в этом файлике это хорошо видно.

И, раз на то пошло, то поделюсь небольшим примером из Swordfish - может кто почерпнет для себя нечто новое по обработке пресловутых байтиков температуры:


Код
{
****************************************************************************
* Name    : GetTemp (OVERLOAD)                    *
* Purpose : Read the device temperature                    *
****************************************************************************
}      
public sub GetTemp(byref pTemp as shortint, byref pFraction as word)
      dim LSB as byte

      OW.WaitForHigh
      ReadSP
      pTemp = FSP(0).AsWord >> 4
      LSB = FSP(0) and $0F
      select FSP(4)
         case cr9Bit  : pFraction = (LSB >> 3) * 5
         case cr10Bit : pFraction = (LSB >> 2) * 25
         case cr11Bit : pFraction = (LSB >> 1) * 125
         case cr12Bit : pFraction = LSB * 625
      end select      
end sub
{
****************************************************************************
* Name    : GetTempAsStr                    *
* Purpose : Read device temperature and return as formatted string         *
****************************************************************************
}     
public function GetTempAsStr() as string
      dim TempA as shortint
      dim TempB as word
      dim Format as byte
         
      GetTemp(TempA, TempB)
      Format = FSP(4) and $60
      Format = (Format >> 5) + 1
      Result =  DecToStr(TempA) + "." + DecToStr(TempB,Format)
end function

Маленькое пояснение - FSP - это массив из 9 байт куда считываются данные DS18B20. Остальное, вроде, должно быть понятно.

Сообщение отредактировал AndrF - Пт, 23.01.2015, 11:19
ivan_fd Дата: Пт, 23.01.2015, 12:21  |                                                                                                                Сообщение # 33
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата MiXaS ()
А зачем так сложно?

Ничего сложного нету. Это все для того, что бы не использовать в коде числа с плавающей точкой.
Я понимаю, что написать flt1 =   0.0625 *  Temp_read   -  намного проще.
Но зайдем с другой стороны. Такая простая строчка кода, как flt1 =   0.0625 *  Temp_read
добавляет к коду 189 слов и 19  байт переменных.

Цитата MiXaS ()
Мне еще не понятно почему опрашивают 11 бит

Потому, что датчик использует для хранения значений температуры только 11 бит, а с 12 по 16 - биты
знака. То есть нам хватит проверять 12 бит для определения знака.

Сообщение отредактировал ivan_fd - Пт, 23.01.2015, 12:26
MiXaS Дата: Пт, 23.01.2015, 12:34  |                                                                                                                Сообщение # 34
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 549
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата ivan_fd ()
Но зайдем с другой стороны. Такая простая строчка кода, как flt1 =   0.0625 *  Temp_read добавляет к коду 189 слов и 19  байт переменных.


Согласен.
Цитата ivan_fd ()
Потому, что датчик использует для хранения значений температуры только 11 бит, а с 12 по 16 - биты знака. То есть нам хватит проверять 12 бит для определения знака.


Я открыл даташит на 18s20 и увидел, что он отличается от 18b20. У него весь старший байт это SSSSSSS
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск: