Операцию деления можно исключить, умножив код на 160 (0,1ºC), 1600(0,01ºC) и т.д. Младший байт отбрасывается (при усечении) или его 7-бит прибавляется к результату, расположенному в старших байтах, а затем оный отбрасывается.
у меня в термометре нет ни умножения, ни деления. есть только сдвиги. сначала я вывожу целую часть, потом дробную часть умножаю на 10 сдвигами и сложением, и сразу получаю цифру десятых.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Приветствую!Настало время CRC.теорию вроде как понял, осталось реализовать. 1. Первое, что не понятно это СRC8==100110001, как вообще это вычислено? принимаем это как константу так понял. 2. считываю 56 бит с датчика, куда и как столько данных поместить?в какую-то одну переменную или разбить на байты по 8 бит,то тогда вообще не понятно как мне применить ИЛИ-НЕ с 8 битным байтом и 9 битным СRC8...
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
по-моему, настало время изучить документацию как следует. там все написано - и что считывать, и куда, и как CRC считать. и на сайте полно статей, и даже моя есть среди них. И даже с примерами...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется... скушно, бабоньки!
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:2 Медали: 1
Starichok51 писал(а):
нет ни умножения, ни деления
Starichok51 писал(а):
умножаю на 10 сдвигами и сложением
Это как ? 2 предложения и оба друг другу противоречат Когда считанное значение делится на 16, получается всё абсолютно тоже самое - выделение целого и дробной частей. А как уже деление делать, сдвигами или операцией деления - дело тридесятое. Так что, Вы делаете всё тоже самое, только через ...
ну, не корректно выразился. нет "явного" умножения, с использованием команды mul. а умножение косвенное - через сдвиги и сложение. считанные 2 байта я 4 раза сдвигаю влево (умножение на 16 сдвигами). в одном регистре получается целая часть, в другом регистре остается дробная часть. сначала вывожу целую часть, потом дробную "умножаю" на 10 и вывожу получившуюся цифру десятых.
в общем-то, дело вкуса каждого человека, как ему делать...
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
как же я тупанул со своим желанием избавиться от применения команды mul... это же не 2 байта умножить на 2 байта... тут надо-то всего 2 строчки - загрузить в регистр число 10 и перемножить 2 регистра. а я взялся двигать, складывать...
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
С Новым годом всех!!! Сил нет уже втыкать к код, ошибки не вижу но она есть. Считываю ROM побитно в DATA_REGISTR, первый считанный бит 1 ,хоть и должен быть 0. остальные биты считываются исправно. Откуда берется первая 1?
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Starichok51 писал(а):
потом дробную часть умножаю на 10 сдвигами и сложением, и сразу получаю цифру десятых.
А как с округлением? Лично я десятые от этой 18х20 делал по таблице в 16 байт. Четыре младших бита кода температуры - вход в таблицу, на выходе - десятичная цифра, которую следует светить после точки. Можно прямо в ASCII, если надо.
Таблица такая:
Код:
"0112334456678899"
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Если нужно округление то как обычно: temperature = (scratchpad * 10 + (16/2)) / 16; //Деление с округлением К числителю прибавить половину знаменателя.
А как с округлением? Лично я десятые от этой 18х20 делал по таблице в 16 байт.
после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых. а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Вот именно, зависит. На STM32, да даже на больших АВР-ках, программируя на Си, естественно, этой ерундой никто не будет заниматься. А вот на мелких ATtiny, на которых нет даже команды умножения и под которые пишут на Асме - самое то. И этой 18х20 даже полноценное преобразование 2->10 не нужно: считаем, сколько раз можно вычесть 100 (без цикла, поскольку вычесть получится не больше одного раза) - получили старшую цифру, в цикле считаем, сколько раз можно вычесть из остатка 10 - вот вторая цифра, остаток - третья, десятые - по таблице. Ну, еще не забыть, что число может быть и отрицательным, тогда надо запомнить где-то знак минуса и сделать всему числу NEG. Максимум, два десятка машинных команд плюс 16-байтовая таблица, и все.
И вся эта возня, естественно, не ради скорости, а ради компактности кода - подобная задачка легко влезет и в тиньку с 1К флеши (512 машинных команд максимум).
Добавлено after 20 minutes 9 seconds:
Starichok51 писал(а):
после умножения на 10 получаем целое число (от 0 до 9), потом смотрим старший бит остатка в дробной части. если есть старший бит, то делаем инкремент получившейся цифры десятых. а можно и по таблице. с таблицей, пожалуй, будет быстрее, чем умножать и потом анализировать округление.
Программируя на Си, лучше всего умножить код числа на 100, прибавить к нему 5 и преобразовать в строку, после чего отбросить последнюю цифру, предпоследняя будет десятыми, остальные - целой частью. Да, перед этим надо учесть минус.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения