Даллас. Быстрое преобразование температуры.


Картинка для привлечения внимания, есличто.
А что касается темы — пришла мысль, и её требуется записать, что я сейчас и делаю.
Итак, есть термометр ds18b20, и я как-то уже рассказывал, как брать с него температуру, и показывать на экране. Делалось это умножением на 625 с последующим делением на сто, преобразованием в BCD, и выводом, вставляя запятую перед второй справа цифрой.
Однако же придумался более шустрый метод сделать то же самое. Следите за руками: отделяем четыре бита справа, и то что осталось — это целое значение температуры в градусах. Его можно смело выводить на наш экранчик.
Теперь дробная часть (сотые доли) — у нас осталось 4 бита, которым соответствуют весовые коэффициенты 50,25,12,6. Просто складываем их, и получаем наши две циферки после запятой, которые выводятся аналогичным образом…

ldi	r17,0		
		sbrc	r16,0x08
		subi	r17,-50
		sbrc	r16,0x04
		subi	r17,-25
		sbrc	r16,0x02
		subi	r17,-12
		sbrc	r16,0x01
		subi	r17,-6

Какбэ всё. Сорри, если боян.

UPD: Благодарю партайгеноссе ACE за содержательные коменнты.
  • +8
  • 19 марта 2014, 22:14
  • Gornist

Комментарии (8)

RSS свернуть / развернуть
Ага, а следующий пост про левые четыре бита — оказывается датчик может измерять и отрицательную температуру. )
0
  • avatar
  • Kino
  • 19 марта 2014, 22:33
Да ладно. Эта тема ужо была наиполнейшим образом раскрыта в «SFF, The». Нужно всего четыре команды для полного обеззначивания показаний датчика, и приведения к восхитительной единообразности вывода…

		sbrs	var11,7		; Если температура отрицательная,
		rjmp	pc+3
		neg	var10		; Делаем её положительной.....
		com	var11
0
та я не об этом. я от том, что в даташите собсно даже табличка есть как это всё конвертируется. зачем два байта расстягивать на целые темы на форумах?
0
У меня в одном проектике с ds18b20 данные сразу отправляются на комп по RS485, а там уже все пережовывается в температуру…
0
Мне кажется сотые доли градуса с ds18b20 нафиг не нужны. Достаточно десятых. А их легко получить как ((x>>1) + (x>>3)), что эквивалентно домножению на 10 и делению на 16. И делать это сразу для всего числа, не только дробной части, а при выводе отделяя запятой последнюю цифру. Мне кажется, в большинстве примеров, что я видел, сделано так.
+2
  • avatar
  • ACE
  • 20 марта 2014, 11:46
Тоже хороший способ.
0
Чё-та тут подумал, решил уточнить. Идея правильная, только делать, как я написал, нельзя. Надо так:
(x + (x >> 2)) >> 1
В первом случае частично теряются дробные части. К примеру, для температуры в 15/16 градуса в первом случае получаем ((15>>1)+(15>>3))=(7+1)=8, т.е. 0.8 градуса. Во втором: (15+(15>>2))>>1=(15+3)>>1=18>>1=9, т.е. 0.9, что ближе к реальным 0,9375.
+1
А я, зачастую, не заморачиваюсь. Редко, когда надо измерять температуру автономно. Так что, в 99% случаев, кидаю в комп то, что выдал датчик и пережевываю компом. Даже самый извращенский алгоритм комп прожует и не подавится.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.