![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Измеритель температуры Возвращает структуру:
extern struct __ds18b20_scratch_pad_struct { unsigned char temp_lsb,temp_msb, temp_high,temp_low, conf_register, res1, res2, res3, crc; } __ds18b20_scratch_pad; Нужно сделать следующее: первые 4 бита младшего байта temp_lsb - это дробные доли градуса, причем один бит равен это 0.0625. 3-8 биты старшего байта temp_msb - это сигнатура - + или -. Все что между ними - температура. Я сделал все, кроме программы перевода температуры в понятное число. Нужна подпрограмма, делающая из этих двух байтов число типа float.У меня ну никаких мыслей.. Только операторы попроще, без всяких навороченных библиотек - я пишу под AVR C, в нем только stdio.h Заранее спасибо! |
|||
|
||||
| DigitalDummy |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 7.4.2006 Где: В подвале шоколад ной фабрики. Репутация: нет Всего: 2 |
Я понял что Вам нужно и сделать это очень даже не сложно, но нельзя ли более понятно объяснить порядок бит?
Чтобы такие вещи объяснять правильно, по-моему, нужно указывать кол-во бит и к чему они относятся строго по порядку... Например, если у меня есть 16 битное значение типа unsigned short (WORD) в котором храниться цвет, то я объясняю так: unsigned short Color, в котором: 5 бит - значение цвета R (красный) 6 бит - значение цвета G (зелёный) 5 бит - значение цвета B (синий). Жду отчёта от Вас! А то гадать что у Вас в структуре и где в невыспавшемся состоянии мне трудно... |
|||
|
||||
| Hiehachi |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 27.12.2005 Где: Ukraine->Odess a Репутация: нет Всего: нет |
Разачаровываю.
Датчик DS18B20 фирмы Dallas Semi. Имеет точность 0.5 градуса. Диапазон -40 до +125. Вам еще со знаковыми числами парится прийдется. Добавлено @ 01:44 Еще нет. Самое сложное по сравнению с переводом градусов это мудренный алгоритм CRC по полиному. Я с примеров с DALLAS на x51 процессор перевел этот алгоритм на AVR CPU . Если найду исходник на CRC скину, или напишите на email. [email protected] чтоб напомнить. Он самый сложный по сравнению с переводом структуры. А проверять его надо! |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Не понял в чем вы разочаровываете?
Знаки - это последние 5 бит числа. ИХ определение входит в саму задачу. А поподробне о битах - пожалуйста: имеется 16 бит. Слева направо: 5 бит- либо все 1, либо все 0 - соответственно минус или плюс следующие 7 бит - температура в градусах. следующие 4 бита - дробная часть градусов. Один бит равен 1/16 или 0,0625 градуса. Hiehachi, а поподробней про полиномы... |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Что, неужели никто не знает?
Вот вам функция, как она есть в примере Codevision:
вся обработка в строке return. Только по-моему она обрабатывает только младший байт... |
|||
|
||||
| Hose |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 11.4.2006 Репутация: 1 Всего: 1 |
Не буду писать решения(нет времени проверять), но подскажу принцип работы.
Все сводится к 2ум бинарным операциям: битовый сдвиг(>>) и побитовое "И"(&). У тебя число MyChislo 2 байта, тобишь 16 бит. Тебе нужно достать, например, температуру(6 - 12 биты). xxxxtttttttxxxxx делаешь битовый сдвиг вправо на 5 бит(temp = MyChislo >>5). получаешь 00000xxxxttttttt А потом вырезаешь правые 7 бит с помощью битового "И" temp = temp & 0x7F. 0x7F - это шестнадцатиричное число, в двоичном виде представляется как 7 единиц. В результате получаешь 0000000ttttttt |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Специально для программистов "обожающих" работу с битами, придуманы битовые структуры:
Что-то в таком роде:
В результате получается все то же самое, что написал Hose, только сдвиги и отсечения берет на себя компилятор. -------------------- ... |
|||
|
||||
| =Женек= |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Hose, я сделал так:
что в принципе отражает алгоритм, предложенный вами правда сейчас не могу вывести это на экран... Посмотрите, нет ли элементарной ошибки в коде:
почему-то не работает |
||||
|
|||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
Это сообщение отредактировал(а) SergeCpp - 19.4.2006, 10:14 |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
В смысле? Кто сказал, что это указатель?
Впрочем, дело было в настройках CodeVision. КОд теперь работает. Есть только одна маленгькая проблема, может быть опишу ее позже. |
|||
|
||||
| =Женек= |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 548 Регистрация: 20.2.2005 Репутация: нет Всего: 1 |
Ура! Получилось!
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |