Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.12.2007, 15:06
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
to alkl
не переживайте, понял )
Действительно, была объявлена как unsigned
Но потом появились еще баги, которые были успешно побороты )))
Теперь колдую над стандартными библиотеками cvavr для ds18b20 так как из-за универсальности функции слишком перегружены - убираю ненужное.
Остался последний вопрос:
что означает эта строчка
Код:
|
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625; |
Первый раз вижу указатель непонятно на что , да и это
Код:
|
*((int *) &__ds18b20_scratch_pad.temp_lsb) |
[/code]
|
|
|
|
17.12.2007, 18:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Сообщение от day177
|
Первый раз вижу указатель непонятно на что , ...
|
Если сказано " (int *)", то это указатель не "непонятно на что", а на int. Как это ни парадоксально - что написано, то и есть.
Сообщение от day177
|
...да и это
Код:
|
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])*0.0625; |
|
Да и тут ничего сложного, идем внутрь определения и читаем на обратном пути следующее:
1. взять адрес элемента temp_lsb структуры __ds18b20_scratch_pad
2. привести его к типу указателя на int
3. получить целое (со знаком), находящееся по этому адресу (автоматически из пары Least Significant Byte и Most Significant Byte получается двухбайтовая целая величина)
4. взять битовую маску из массива масок по индексу resolution (то есть, для каждого разрешения - своя маска)
5. отмаскировать полученной маской полученное ранее целое
6. умножить полученный винегрет на 0.0625 (хм, я бы сдвинул на 4 вправо и не жужжал ![Голова кругом](images/smilies/icon_rolleyes.gif) )
И всего-то...
|
|
|
|
17.12.2007, 18:40
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
to tempora
большое спасибо, то что надо ) сижу врубаюсь
sasareccer
а нет ли случаем той самой баблиотечки (ds18b20.h+ds18b20.lib), а то качать новый кодвижен из-за этих библиотек дорого (платный трафик ![Обижен](images/smilies/icon_beee.gif) )
|
|
|
|
17.12.2007, 19:21
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от day177
|
а нет ли случаем той самой баблиотечки (ds18b20.h+ds18b20.lib), а то качать новый кодвижен из-за этих библиотек дорого (платный трафик )
|
|
|
|
|
17.12.2007, 19:22
|
|
Гражданин KAZUS.RU
Регистрация: 30.04.2006
Сообщений: 984
Сказал спасибо: 5
Сказали Спасибо 18 раз(а) в 14 сообщении(ях)
|
Сообщение от day177
|
to tempora
большое спасибо, то что надо ) сижу врубаюсь
sasareccer
а нет ли случаем той самой баблиотечки (ds18b20.h+ds18b20.lib), а то качать новый кодвижен из-за этих библиотек дорого (платный трафик )
|
Прикрепленный файл: 5371510.rar
|
|
|
|
17.12.2007, 23:40
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
to dimonbest
пасиба, поглядел функции, никаких отличий, видимо проблема была в самом CVAVR (юзаю 1.2.5.2)
Выкладываю проект (202Кб): два датчика с паразитным питанием, поочередно выводятся значения каждого (на время примерно от 100 до 200 мс (зависит от количества выводимых символов)).
Осталось победить последний трабл - при первом выводе температуры показывает ошибку. Кто найдет в чем дело - буду сильно благодарен
Прикрепленный файл: 9314623.rar
|
|
|
|
18.12.2007, 10:09
|
|
Частый гость
Регистрация: 20.07.2006
Сообщений: 37
Сказал спасибо: 2
Сказали Спасибо 7 раз(а) в 4 сообщении(ях)
|
Сообщение от day177
|
to dimonbest
пасиба, поглядел функции, никаких отличий, видимо проблема была в самом CVAVR (юзаю 1.2.5.2)
|
Заглянул в архив от dimonbest
Там три файлика:
ds18b20.lib
ds1820.lib
ds1820.h
А четвертого нет: ds18b20.h
Вот его, четвёртый файл, посылаю.
(Хотя, в общем-то речь шла о ds18b20, а не про ds1820.)
Если не трудно, напиши потом где же всё-таки была проблемма.
Прикрепленный файл: 161805.rar
|
|
|
|
18.12.2007, 11:45
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
грабля с крякозябрами при выводе отрицательных чисел была в процедуре получения-преобразования значения температуры. Чуть подправил кодвиженовскую процедуру и все заработало.
В файлах *.h обычно хранятся прототипы функций, а сами функции находятся в *.lib
|
|
|
|
18.12.2007, 21:01
|
|
Прохожий
Регистрация: 01.11.2007
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
[quote="day177"] to dimonbest
пасиба, поглядел функции, никаких отличий, видимо проблема была в самом CVAVR (юзаю 1.2.5.2)
попробуйте так
return (((int)__ds18b20_scratch_pad.temp_msb‹‹ ![Горд собой](images/smilies/icon_dovl.gif) |
__ds18b20_scratch_pad.temp_lsb)*0.0625;
переделка с ds1820, вроде работало
Прикрепленный файл: 9314623.rar
|
|
|
|
28.01.2008, 01:56
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
опять торможу ![Обижен](images/smilies/icon_beee.gif)
Что (какое значение и в каком виде) возвратит выражение:
Код:
|
return (*((int *) &__ds18b20_scratch_pad.temp_lsb) & bit_mask[resolution])››4; |
если измеренное значение будет например 24.5? Сама функция float, возвращаемое значение int (т.е. без запятой)..... Задача в том чтобы получить число после запятой (в данном примере 5) В общем помогите пожалуйста
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:05.
|
|