Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
30.03.2010, 09:08
|
|
Прописка
Регистрация: 09.10.2007
Сообщений: 235
Сказал спасибо: 27
Сказали Спасибо 24 раз(а) в 24 сообщении(ях)
|
Re: Термометр на ds18b20
Зачем опрашивать каждый датчик через 1 сек?
Алгоритм намного проще: выдаете общую команду на замер температуры.
После поочередно считываете значения с датчиков.
Я делал так: таймер на 1 сек; в прерывании таймера сначала считывал значения с датчиков, потом выдавал общую команду на замер температуры (преобразование).
Считывание занчения занимает 1мс+(8+2)*0,2мс=3мс. Преобразование по ДШ длится 750мс. Итого (1000мс-750мс)/3мс=80 датчиков за интервал 1 сек!
Если хотите и достоверность проверять, то затратите на один датчик 1мс+(8+9)*0,2мс=4,4мс, и за время прерывания сможете 250/4,4=50 датчиков опросить!
|
|
|
|
19.04.2010, 23:29
|
|
Временная регистрация
Регистрация: 19.04.2010
Сообщений: 92
Сказал спасибо: 30
Сказали Спасибо 83 раз(а) в 37 сообщении(ях)
|
Re: Термометр на ds18b20
Сообщение от ALEKSEY188
|
А что просто умножить на десять дробное значение нельзя?
Например так:
ldi temp,0b00001000 ; Значения для преобразования (дробь)
andi temp,0b00001111 ; Обнуляем старшую тетраду (на всякий случай)
lsl temp
mov tmp,temp
lsl temp
lsl temp
add tmp,temp
mov temp,tmp
andi tmp,$f0
swap tmp ; первая дробная цифра в tmp
; оставшиеся дробные разряды в temp
; Если нужно больше дробных разрядов, выполняем этот участок большее число раз!!!
|
Специально зарегился, чтобы внести нужные на мой взгляд пояснения. Боюсь, что не всем понятно: а нафига автор умножает на 10, когда цена бита равна 0,0625 град С? На самом деле дробное значение у Вас умножается не на 10, а на 0,625 (10/16) . Т.е. на 0,0625х10. И соответственно Вы получаете первую цифру после запятой. Если по порядку: 1) х10, 2) отброс мусора (andi tmp,$f0), 3) деление на 16 (swap tmp) и . Может кому интересно, а то лепит народ бездумно чужие библиотеки из СИ .
|
|
|
|
20.04.2010, 04:46
|
|
Заблокирован
Регистрация: 14.04.2008
Адрес: Украина, совсем рядом от террористов!
Сообщений: 388
Сказал спасибо: 32
Сказали Спасибо 85 раз(а) в 62 сообщении(ях)
|
Re: Термометр на ds18b20
Сообщение от SHIM1
|
Специально зарегился, чтобы внести нужные на мой взгляд пояснения. Боюсь, что не всем понятно: а нафига автор умножает на 10, когда цена бита равна 0,0625 град С? На самом деле дробное значение у Вас умножается не на 10, а на 0,625 (10/16). Т.е. на 0,0625х10. И соответственно Вы получаете первую цифру после запятой. Если по порядку: 1) х10, 2) отброс мусора (andi tmp,$f0), 3) деление на 16 (swap tmp) и. Может кому интересно, а то лепит народ бездумно чужие библиотеки из СИ .
|
DS18B20 результат измерения два байта, 12бит целое число градусов и 4 бита двоичная дробь, в градусах Цельсия, а это означает что нужно только преобразовать из двоичной системы в десятичную и на экран. Для того чтобы преобразовать число из одной позиционной системы в другую в нашем случае из двоичной в десятичную, нужно двоичную дробь умножить на основание системы в которую переводим. Вообще стоит почитать очень интересная наука дискретная математика, проиграйтесь с бумажкой переводите туда сюда из двоичной в десятичную и обратно. Приведенный мною код не бездумная библиотека на С а вполне осознаваемый алгоритм, эффективнее которого я не видел, если Вы знаете способ сделать лучше очень хотелось бы взглянуть, только не на рассуждения а на рабочий участок!!!
|
|
|
|
20.04.2010, 11:27
|
|
Временная регистрация
Регистрация: 19.04.2010
Сообщений: 92
Сказал спасибо: 30
Сказали Спасибо 83 раз(а) в 37 сообщении(ях)
|
Re: Термометр на ds18b20
Сообщение от ALEKSEY188
|
DS18B20 результат измерения два байта, 12бит целое число градусов и 4 бита двоичная дробь, в градусах Цельсия, а это означает что нужно только преобразовать из двоичной системы в десятичную и на экран. Для того чтобы преобразовать число из одной позиционной системы в другую в нашем случае из двоичной в десятичную, нужно двоичную дробь умножить на основание системы в которую переводим. Вообще стоит почитать очень интересная наука дискретная математика, проиграйтесь с бумажкой переводите туда сюда из двоичной в десятичную и обратно. Приведенный мною код не бездумная библиотека на С а вполне осознаваемый алгоритм, эффективнее которого я не видел, если Вы знаете способ сделать лучше очень хотелось бы взглянуть, только не на рассуждения а на рабочий участок!!!
|
Я так и думал... Не подскажете ли, уважаемый, где можно почитать о преобразовании двоичных чисел в десятичные методом умножения ? А еще лучше "проиграйтесь с бумажкой" и убедитесь в полной чуши сего "вполне осознаваемый алгоритм". Кстати, а что говорит "интересная наука" о числе 0,0625 и как так оно само собой у Вас получается ? И еще, на закуску: целую часть Вы также осознанно умножаете?
|
|
|
|
20.04.2010, 15:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Термометр на ds18b20
Сообщение от SHIM1
|
А еще лучше "проиграйтесь с бумажкой" и убедитесь в полной чуши сего "вполне осознаваемый алгоритм".
|
А что - это типа какой то хак?
Имеем число Fixed Point - 80,5 - это и есть значение температуры. Младшие 4 бита - дробная часть. Т.е число выглядит так - 0x0508 или в двоичной 0х0000010100001000 Нам это в принципе неважно для осознания алгоритма, мы работаем со значением. Для выделения десятых долей надо умножить наше число на 10 - получим 805,0. Дробная часть осталась на своем месте, только тоже выросла в 10 раз и один ДЕСЯТИЧНЫЙ разряд перешел в целую часть. До этого момента нам было не важно как представлено число, сколько разрядов в нем дробная часть, а сколько целая. Мы работали с ним как с целым. Дальше просто - нам надо отбросить эту ненужную дробную часть. Так как она занимает младшие 4 бита - сдвигаем наше число вправо на 4 разряда. Все - имеем значение 805. Остается преобразовать его в десятичное представление и можно выводить на экран/в терминал, не забыв отделить последний разряд запятой. А пояснения типа "умножаем на самом деле на 0,625" только запутать способны. Потому как алгоритм звучит - умножаем на 10 и отбрасываем дробную часть. И сразу понятна физика процесса Причем если дробная часть будет не в 4 битах, а в 6 это нас не запутает - алгоритм будет тот же - умножение и отбрасывание. Или Вы нам предложите умножать на 0,15625?
Последний раз редактировалось kison; 20.04.2010 в 15:38.
|
|
|
|
20.04.2010, 15:35
|
|
Заблокирован
Регистрация: 14.04.2008
Адрес: Украина, совсем рядом от террористов!
Сообщений: 388
Сказал спасибо: 32
Сказали Спасибо 85 раз(а) в 62 сообщении(ях)
|
Re: Термометр на ds18b20
Сообщение от SHIM1
|
Не подскажете ли, уважаемый, где можно почитать о преобразовании двоичных чисел в десятичные методом умножения?
|
Вот почитайте!
|
|
|
|
20.04.2010, 16:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Термометр на ds18b20
http://www.remexpert.com/ipb/topic1285.html
0.625 - это 5/8 - для получения сдвигаем вправо на 1 разряд - получаем 4/8 и сдвигаем вправо на 3 разряда - получаем 1/8, их складываем.
|
|
|
|
20.04.2010, 18:34
|
|
Заблокирован
Регистрация: 14.04.2008
Адрес: Украина, совсем рядом от террористов!
Сообщений: 388
Сказал спасибо: 32
Сказали Спасибо 85 раз(а) в 62 сообщении(ях)
|
Re: Термометр на ds18b20
Алгоритм конкретно к датчику DS.
1)Определяем знак, инвертируем, если нужно, отделяем целую часть от дробной, вызываем подпрограмму BCD и вывод на экран, все как обычно. Ставим после целого запятую.
2)Дробную часть умножаем на 10 пример 0.1*10=1.0, все просто как топор. Помещаем 4 битную дробь в регистр, младшие четыре бита дробь, за ним условная запятая, старшие равны нулю, умножаем на 10, все, что за условной запятой это двоично-десятичный эквивалент двоичной дроби, в нашем случае число десяток, готовое к выводу на экран. Если обнулить старшие 4 бита и еще раз умножить на 10 то получим число соток и т.д.
Проще всего умножение 10 организовать как 10=8+2. х- множимое, можно преобразовать х*10= х*2+х*8, в итоге алгоритм умножения сводится к трем сдвигам и одному сложению: сдвигаем x на один разряд в лево(умножаем на 2), запоминаем x в y, сдвигаем х на два разряда в лево (умножаем на 8 ) следуем x+y. В итоге преобразование выполняется за 5 машинных циклов (для AVR), это быстрее чем аппаратный умножитель!!!
Сообщение от urry
|
http://www.remexpert.com/ipb/topic1285.html
0.625 - это 5/8 - для получения сдвигаем вправо на 1 разряд - получаем 4/8 и сдвигаем вправо на 3 разряда - получаем 1/8, их складываем.
|
Не сомневаюсь, что это работает, но назвать это эффективным и элегантным способом трудно!!! Лично для меня это способ сэкономить рубль, потратив два!!!
Последний раз редактировалось ALEKSEY188; 20.04.2010 в 18:38.
|
|
|
|
20.04.2010, 18:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Re: Термометр на ds18b20
Сообщение от ALEKSEY188
|
Не сомневаюсь, что это работает, но назвать это эффективным и элегантным способом трудно!!!
|
ФЛАГ В РУКИ, БАРАБАН НА ГРУДЬ, простите...
Чего экономим ?
Не вижу смысла в дальнейшем разговоре.
Удачи типа.
|
|
|
|
20.04.2010, 19:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Термометр на ds18b20
Вообще действительно забавно - чтение с датчика несколько тысяч тактов, проверка CRC сотни, а затем экономим десяток тактов. Как бы овчинка выделки не стоит. Я метод со сдвигами использовал с tiny, потому как там умножителя нет. А с мегой мне пофигу - я УМНОЖАЮ на 10, ну займет это лишних 10-20 тактов, да и черт с ним На фоне считывания это незаметно. Зато если умножение еще где используется, то место экономится
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:19.
|
|