Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 01:22

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 11:04 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 13 ноя 2012, 18:53
Сообщения: 40
Откуда: KZ
lizard66 писал(а):
Пример ТСа получился у меня длинной 87 КОПов и выполняется за 80/87 такта в зависимости от необходимости коррекции результата


Поясните пожалуйста новичку кто такой ТС и что такое КОП?

P.S> Аббревиатуру ТС уже несколько раз встречаю на форуме. Единственное что приходит на ум - TC -автор темы произв. от англ. topic creator. Я прав?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 12:10 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
Ink писал(а):
на асме з80.

Да уж, были времена. :)
Ink писал(а):
дальние треки он стал вычислять НЕРЕАЛЬНО ДОЛГО. так что не везде такой метод подходит.
и даже универсальная быстрая делилка (а не на конкретную константу) полкило флеша точно не займет.

Не мудрено, Z80 в 32 раза медленней меги на 20ти мегагерцах, и это на самых быстрых инструкциях.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 12:11 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
Fedyun4ik писал(а):
Поясните пожалуйста новичку кто такой ТС и что такое КОП?

P.S> Аббревиатуру ТС уже несколько раз встречаю на форуме. Единственное что приходит на ум - TC -автор темы произв. от англ. topic creator. Я прав?

Примерно так и есть.

КОП – код операции (старинное), в данном контексте команда ассемблера. В RISK код операции объединен с данными для увеличения общей производительности. В упомянутом Ink Z80(арх. Фон Неймана), данные надо было продолжать зачитывать из памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 13:28 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
lizard66 писал(а):
Безусловно, за скорость придется платить, но мне кажется, уважаемые Гуру несколько сгущают краски
Перечитывал, долго думал... Это я попал в уважаемых Гуру, получается. Фигасе. С другой стороны, я на 80-м и на 51-й столько богатющих (до логарифмов) арифметик сделал, столько их в живые серийные приборы поставил, что могу хоть в этом считать себя бывшим специалистом в МК-технике:)
lizard66 писал(а):
Загадочный алгоритм, с которым не разобрался ТС действительно достаточно быстрый, реализация на асме у меня получилась всего менее, чем в три раза длинней классического деления из апноты AVR200.
Так все же,ты говоришь о сравнении "загадочного" с апноутным. Если я верно понял, то отнимание степеней 10 (назовем это алгоритмом Johnny0007) ты не рассматривал на предмет сравнения? А было бы интересно.
Но мой подход в данном случае таков: есть универсальные арифметики, которые строятся в соответствии с заданными критериями (скорость-объем памяти, как правило). В такой унивесральной арифметике делим хоть на 10, хоть на 100500 - какая разница. Особенно, если плавающая точка. Здесь мы говорим не об этом случае. Верно?
А есть программы, в которых нужно просто преобразовать целочисленный код в 2-10-е представление. По-моему, у ТС именно этот случай. А для чего используется такое преобразование, коллеги? Да для вывода в удобном человеку виде. Этот вывод нужен этому самому человеку не чаще, чем раз на пару сотен миллисекунд. То есть, это разовая операция на огромный (для любого МК) период времени! Никаких вхождений ее в длинную цепочку повторяющихся (зацикленных) вычислений речи нет. Тогда давайте себе ответим на вопрос: кого ипет ее быстродействие?
Я себе ответил лет 25 назад, что никого не ипет :) И я использовал отнимание во всех случаях, когда на морду прибора нужно было вывести понятное персоналу число. Наглядно, самому себе понятно (не забываем о сопровождении программ, мы в ответе за тех, кого мы создали), компактно и вполне быстро, пусть даже и не рекордно.
До сих пор живу в уверенности, что так и надо делать. Потому упрямо плюсую алгоритм имени Johnny0007 :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 14:41 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
drvlas писал(а):
Если я верно понял, то отнимание степеней 10 (назовем это алгоритмом Johnny0007) ты не рассматривал на предмет сравнения? А было бы интересно.


Не рассматривался по причине не предсказуемости времени выполнения. Время выполнения этого метода зависит от значения аргумента. Задача стояла быстро поделить на 10 и приведен вариант на «С», иначе и вопроса не было бы. Давайте вычитать степени из 2^32, сколько уйдет времени?

drvlas писал(а):
Но мой подход в данном случае таков: есть универсальные арифметики, которые строятся в соответствии с заданными критериями (скорость-объем памяти, как правило). В такой унивесральной арифметике делим хоть на 10, хоть на 100500 - какая разница. Особенно, если плавающая точка. Здесь мы говорим не об этом случае. Верно?


Согласен, но в условии делим на 10 аргумент «uint32_t»

drvlas писал(а):
А есть программы, в которых нужно просто преобразовать целочисленный код в 2-10-е представление. По-моему, у ТС именно этот случай. А для чего используется такое преобразование, коллеги? Да для вывода в удобном человеку виде. Этот вывод нужен этому самому человеку не чаще, чем раз на пару сотен миллисекунд. То есть, это разовая операция на огромный (для любого МК) период времени! Никаких вхождений ее в длинную цепочку повторяющихся (зацикленных) вычислений речи нет. Тогда давайте себе ответим на вопрос: кого ипет ее быстродействие?


К сожалению, зачем ему это надо ТС не поведал, а по сему, совет типа «туалетной нет, возьмите нождачную» может оказаться не в теме. ТС хотел аналог на асме приведенного на «С» алгоритма – извольте, и он действительно быстрый.

drvlas писал(а):
Потому упрямо плюсую алгоритм имени Johnny0007 :)


Я использую методику из AVR200.

Для расчета тригонометрии можно использовать метод степенных рядов, получается вполне компактно, а в либах почему то табличный метод плюс интерполяция какого там порядка.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 16:59 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
Чтобы разговор поддержать :)

lizard66 писал(а):
Давайте вычитать степени из 2^32, сколько уйдет времени?
.... в условии делим на 10 аргумент «uint32_t»
Ну, тут уж разное может быть. Например, берется 32-битное "с запасом". Я вот люблю целочисленную арифметику, так довольно часто при работе с обычными "измерительными" переменными (т.е. имеющими разрядность до 16 бит) объявляю ЛОНГи, ибо помножить-разделить удобно, не думая о разрядной сетке. А в конце концов, когда доходит до представления тому же человеку с его идиотской приверженностью к степеням десятки, реальное число и имеет битов до 16. Вот его прокрутить 4 раза (10000, 1000, 100 и 10) - плевое дело.
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.

lizard66 писал(а):
совет типа «туалетной нет, возьмите нождачную» может оказаться не в теме. ТС хотел аналог на асме приведенного на «С» алгоритма – извольте, и он действительно быстрый.
Да, мы тут все мастера на такие советы. Но бывает, что ТС и не догадывается о других подходах. Вот тогда "наждачная" вдруг и решает проблему :)

lizard66 писал(а):
Для расчета тригонометрии можно использовать метод степенных рядов, получается вполне компактно, а в либах почему то табличный метод плюс интерполяция какого там порядка.
О, скока пришлось по математическим справочникам порыться! А Интернета не было... На самом деле алгоритмов - просто море! Выбор бывает мучительным. Я уж не помню, но кажется, корень квадратный был у меня каким-то очень необычным. Не с первой попытки, истесна...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 19:43 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
кстати, если кому интересно голову поломать:
Микроконтроллеры. Это же просто! Фрунзе А.В. 2002. Том 3
-куча всяких математических алгоритмов, правда для x51

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 22:06 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
drvlas писал(а):
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.

Не придумал ничего лучше того, что под спойлером :). Длинна 55 КОПов время выполнения для 4,294,967,295(0xffffffff) – 1048 тактов, время работы тем больше, чем больше девяток в аргументе. Получилось дольше чем универсальное деление «сдвиг/вычитание» из AVR200. Может у кого то этот метод получится быстрей?
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 22:27 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
lizard66 писал(а):
drvlas писал(а):
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.

Не придумал ничего лучше того, что под спойлером :). Длинна 55 КОПов время выполнения для 4,294,967,295(0xffffffff) – 1048 тактов, время работы тем больше, чем больше девяток в аргументе. Получилось дольше чем универсальное деление «сдвиг/вычитание» из AVR200. Может у кого то этот метод получится быстрей?
Ну, куда уж быстрей... Я вообще асма авр не осваивал.
Но, давай посмотрим на то, что есть. Для нереально большого числа 4,294,967,295 получили 1000 тактов - это 50 мкс на 20 МГц? Неужто я так угадал... Или не так считать надо?
Ну, если я даже ошибаюсь. Тоже не слишком разочаровывает. Операция, которая (предположительно) работает раз на 200 мс (200000 мкс), займет не 50 мкс, а 100 или 200. От цикла - менее 0,1 %. Вполне сносно. А для чисел до 65К? Еще лучше. Я бы так и делал. Исключительно из-за наглядности метода. Хотя то, что ты написал, я не понимаю :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 22:47 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
drvlas писал(а):
Для нереально большого числа 4,294,967,295 получили 1000 тактов - это 50 мкс на 20 МГц? Неужто я так угадал... Или не так считать надо?

Подставил число поменьше – 999.999.999, получилось 1288 тактов. При 256 – 508 тактов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 12 янв 2013, 22:59 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
drvlas писал(а):
Операция, которая (предположительно) работает раз на 200 мс (200000 мкс), займет не 50 мкс, а 100 или 200. От цикла - менее 0,1 %. Вполне сносно.

Смотря где надо заюзать. Три волосины на голове это мало, в супе – много. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 08:23 
Заглядывает иногда

Зарегистрирован: 09 фев 2012, 23:51
Сообщения: 35
Прочитал, очень интересно.
Мне надо выводить на 3-х цифровой индикатор число пользователю.
В начале сделал вычитаниями 100,10,1, всё работает, но хочется же всегда чего то побыстрее.
Пользователю будет выводиться на индикатор время в процентах оставшегося заряда АКБ у велофары, либо время оставшееся.
http://www.youtube.com/watch?v=YvMnI_GQdGs


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 09:56 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 618
Откуда: Челябинск
lizard66 писал(а):
drvlas писал(а):
Да и 4,294,967,295 - 9 циклов. Я потому и спросил, пробовал ли ты. Самому-то влом проверять, но думаю, не более сотни микросекунд на АВР.

Не придумал ничего лучше того, что под спойлером :). Длинна 55 КОПов время выполнения для 4,294,967,295(0xffffffff) – 1048 тактов, время работы тем больше, чем больше девяток в аргументе. Получилось дольше чем универсальное деление «сдвиг/вычитание» из AVR200. Может у кого то этот метод получится быстрей?
Show
Это код можно сделать короче и, соответственно, быстрее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 10:23 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
putman писал(а):
всё работает, но хочется же всегда чего то побыстрее.
Пользователю будет выводиться на индикатор время в процентах оставшегося заряда АКБ у велофары
Приделай электромоторчик, будет быстрее ехать :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 10:41 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Цитата:
В начале сделал вычитаниями 100,10,1, всё работает, но хочется же всегда чего то побыстрее.

Что-то я не пойму, вся эта байда для вывода на индикацию??? Да блин тут секунду считать можно, и обсчитать траекторию посадки на Луну за это время. Я то думал какой-нибудь мудрёный фильтр, или что-то подобное, где каждая микросекунда дорога...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 10:49 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
ploop писал(а):
Я то думал какой-нибудь мудрёный фильтр, или что-то подобное, где каждая микросекунда дорога...
Дык, а я о чем. Честно говоря, мне и не хватает фантазии придумать такую задачу, где нужно использовать указанный перевод в "мудреном фильтре". Разве что создание виртуальной машины с двоично-десятичной системой счисления. Так и то: на входе преобразовал и баста. Дальше уж речь идет о 2-10-й арифметике :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 11:53 
Заглядывает иногда

Зарегистрирован: 09 фев 2012, 23:51
Сообщения: 35
drvlas писал(а):
putman писал(а):
всё работает, но хочется же всегда чего то побыстрее.
Пользователю будет выводиться на индикатор время в процентах оставшегося заряда АКБ у велофары
Приделай электромоторчик, будет быстрее ехать :)

Извините, что задал глупый вопрос, просто хотелось быстрее, ну и пусть что времени много для вывода на индикатор.
Больше не буду =)
Моторчик уже есть, 1 Квт., на старте в пике 3 Квт, макс. скорость 63 по плоскачу в безветрие.

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 12:42 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
putman писал(а):
макс. скорость 63 по плоскачу в безветрие.
Не спеши, дорогой. Будь внимателен и осмотрителен. Без шуток.

Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 13:09 
Старожил
Аватара пользователя

Зарегистрирован: 16 окт 2011, 11:19
Сообщения: 853
Откуда: Харьков
Bill писал(а):
lizard66 писал(а):
Не придумал ничего лучше того, что под спойлером .... Может у кого то этот метод получится быстрей?
Это код можно сделать короче и, соответственно, быстрее.

Ну, дык поучаствуйте, может что то на заметку можно будет взять ;)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 13:42 
Старожил
Аватара пользователя

Зарегистрирован: 03 сен 2011, 21:13
Сообщения: 13139
Откуда: г.Мариинск, Кемеровская обл. , мать Россия
>>Извините, что задал глупый вопрос, просто хотелось быстрее, ну и пусть что времени много для вывода на индикатор.

А вопрос совсем не глупый и многих интересует. В результате таких вопросов и рождаются шедевры программирования

_________________
Лишний повод не бриться: Если у меня растёт борода, значит, это зачем-то нужно? О, Господи, неужели я - философ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 15:37 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2193
Откуда: Нальчик
drvlas писал(а):
Поскользнулся-упал-закрытый перелом бедра. Готовимся к операции. Я стану на пару тысяч баксов легче :)

Брат..... я не понял..... это ты про себя?..... Или все таки теще операция нужна?.....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 15:45 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4189
Откуда: Киев
Брат, я так проЦиЦировал классику совейского кино :)
Теще, ей, любимой. А в ее не юные годы... В общем, когда посидишь пару часов в приемном отделении, куда пачками везут народ с поломанными ногами, начинаешь переживать за велосипедистов. Так что, уважаемый ТС, извини за оффтоп, но я под впечателнием.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 16:15 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2010, 16:57
Сообщения: 2193
Откуда: Нальчик
Успокоил.....
Хотя..... и тещу тоже жалко....

Насчет вывода данных на индикатор:
Если данные быстро меняются, а дисплей обновлять с частотой 10 Гц или больше, то показания начинают сливаться, и не возможно высмотреть отдельое измерение.....
Я поэтому занижаю скорость обновления индикатора, примерно до 5 Гц.... наглядность процесса остается более менее, и показания не мажутся скачками цифер.....
Это соответственно 200мс на сеанс, а за 200 мс можно я не знаю чего вычислить..... помоему, можно не ломать голову, а применить наиболее наглядный и простой алгоритм.... я например раньше методом johnny0007 пользовался..... а как перешел на Си, стал использовать остаток от деления на 10, еще нагляднее процедура, хотя и попрожорливее наверное.....

зы Обновления - это я не имел ввиду динамическую индикацию.... имел ввиду периодичность вывода на дисплей новых данных.


Последний раз редактировалось ShadS 14 янв 2013, 16:39, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 16:38 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3995
а если, скажем, надо экономить батарейку, то деления циклами - зло. так что, опять надо плясать от задачи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Деление на 10.
СообщениеДобавлено: 14 янв 2013, 18:57 
Заглядывает иногда

Зарегистрирован: 09 фев 2012, 23:51
Сообщения: 35
Батарейку экономить не надо, она экономится только во время "простоя" велосипеда, драйвер впадает в спячку.
Деление на 100,10,1 для вывода на индикатор у меня происходит довольно часто - 31 раз в секунду, но от общего времени процессора это малая толика. Так что пока нет жестких рамок по времени оставлю эту затею.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB