Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Re: Хитрые, необычные алгоритмы и код

Сб сен 19, 2020 05:12:52

У кого-нибудь остался архив MULT_KNUTH.zip из сообщения https://radiokot.ru/forum/viewtopic.php ... 5&start=83 ?

Re: Хитрые, необычные алгоритмы и код

Сб сен 19, 2020 09:26:27

Держите.
MULT_KNUTH.zip
(1.67 KiB) Скачиваний: 285

Re: Хитрые, необычные алгоритмы и код

Вс сен 20, 2020 22:18:06

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

Re: Хитрые, необычные алгоритмы и код

Вс сен 20, 2020 22:42:27

А Карацубой не быстрее будет?

Re: Хитрые, необычные алгоритмы и код

Пн сен 21, 2020 08:19:59

Умножение 32*32 занимает 132 такта, что даст алгоритм Карацубы? :dont_know:
Вложения
KNUT_32.PNG
(72.5 KiB) Скачиваний: 413

Re: Хитрые, необычные алгоритмы и код

Пн сен 21, 2020 11:55:28

akl, если есть аппаратная операция умножения, то мало что. Если же ее нет, то - заметное ускорение.

Re: Хитрые, необычные алгоритмы и код

Вт авг 24, 2021 20:33:45

Здравствуйте уважаемые.Прошерстил форумы и думаю это самая подходящая ветка.Нужна помощь ибо у меня голова не варит уже.Итак задача опроса данных с оптической линейки и вывод на дисплей тм1638.Уже сделано:линейка опрашивается по прерыванию и данные выводятся на табло но! вместо одного миллиметра ,десятой , сотой отображается количество импульсов на тот самый миллиметр...один импульс это 5 микрон а одна сотка это 2 импульса по 5 микрон...пишу на си для тинки 88.Алгоритм с делилками на целочисленное значение не подходит.Может у когото есть мысли поделитесь .при необходимости кусок кода предоставлю.

Re: Хитрые, необычные алгоритмы и код

Вт авг 24, 2021 21:00:36

Ничего не понял, но если один импульс это сколько-то микрон, то N импульсов в микроны переводятся умножением на N, а не делением...

Re: Хитрые, необычные алгоритмы и код

Вт авг 24, 2021 21:08:33

переменные int sot_y,dec_y,edc_y,deced_y,soted_y;
переменные temp_y1- temp_y8 хранят результаты счета для вывода на табло

if (mic_y==2){temp_y8=0;mic_y=0;if(sot_y<10){sot_y++;temp_y7=sot_y;};}else {temp_y8=5;}; если один импульс то вывожу на экран 5 а когда приходит второй вывожу 0 и добавляю сотку
if (sot_y==10){sot_y=0;if(dec_y<10){dec_y++;temp_y6=dec_y;};}; тут если собралось десять соток до добавляю десятку вывод цифр соответственно обновляется при каждой смене.
if (dec_y==10){dec_y=0;if(edc_y<10){edc_y++;temp_y5=edc_y;};}; далее все повторяется для следующих разрядов

if (edc_y==10){edc_y=0;if(deced_y<10){deced_y++;temp_y5=deced_y;};};
if (deced_y==10){deced_y=0;if(soted_y<10){soted_y++;temp_y5=soted_y;};};
Последний раз редактировалось culibin 100 Вт авг 24, 2021 21:22:33, всего редактировалось 1 раз.

Re: Хитрые, необычные алгоритмы и код

Вт авг 24, 2021 21:09:59

Понятнее не стало

Re: Хитрые, необычные алгоритмы и код

Вт авг 24, 2021 21:12:34

if (VAL_Y==VAL_Ycl ) {mic_y++ ;} else {mic_y--;} обработчик прерывания

Добавлено after 1 minute 31 second:
Понятнее не стало

что именно не понятно? как работает мой код ? я прибавляю по нарастающей по 5 микрон дважды для сотки и так к каждому разряду по единице до целого милиметра

Re: Хитрые, необычные алгоритмы и код

Вт авг 24, 2021 22:17:09

culibin 100 писал(а):думаю это самая подходящая ветка.
это самая НЕ подходящая ветка.
или ты считаешь, что предложил хитрый и необычный алгоритм, чтобы другие люди могли применить его у себя?
так ты сильно ошибаешься.
в этой теме люди показывают свои "хитрости", которые могут быть полезны другим людям.

Re: Хитрые, необычные алгоритмы и код

Вт авг 24, 2021 22:21:01

я просил как раз подсказать мне реализовать алгоритм а не рекламирую свой.

Re: Хитрые, необычные алгоритмы и код

Ср авг 25, 2021 08:18:08

я так и не понял, в чем проблема?
вместо простого счетчика импульсов вы применяете поразрядный (аналог BCD) счет. ну, не знаю, чем это оправдано, но вполне приемлемо.
и чо?
я бы делал иначе: считал импульсы в обычном счетчике, а уже перед выводом на индикатор производил бы вычисления и преобразования в "читабельный" вид. в прерываниях счет типа counter++, в главном цикле расчет и вывод.
никакой "необычности" или "оригинальности" в этом алгоритме нет и не нужно

Re: Хитрые, необычные алгоритмы и код

Чт авг 26, 2021 09:57:22

if (VAL_Y==VAL_Ycl ) {mic_y++ ;} else {mic_y--;} вот я и делаю тут как написали типа counter++.читабельный вид портит что микроны должны прибавляться по 5 за импульс и отображаться также .в разряде отображается либо 5 либо 0 а сотки отображаются как и положено от 1 до 9.задача простенькая но чет я наверно старею...еще нудобство что нужно минимально загрузить ядро мк иначе прерывания начинают глотаться при увеличении скорости движения линейки энкодера.

Re: Хитрые, необычные алгоритмы и код

Чт авг 26, 2021 12:48:20

МК по идее должен уметь считать внешние импульсы аппаратно... Может, это лучше, чем прерывание на каждый импульс?

Re: Хитрые, необычные алгоритмы и код

Пт авг 27, 2021 14:51:35

...читабельный вид портит что микроны должны прибавляться по 5 за импульс и отображаться также .в разряде отображается либо 5 либо 0 а сотки отображаются как и положено от 1 до 9.задача простенькая но чет я наверно старею...еще нудобство что нужно минимально загрузить ядро мк иначе прерывания начинают глотаться при увеличении скорости движения линейки энкодера.

Думаю, выражение 1000*S=5*N решит проблему. S[мм]-отсчет энкодерной линейки. 1000 учитывается десятичной точкой на табло.
Если счетчик с каждым импульсом изменяет свое состояние на 5, умножение не нужно. Для энкодера счетчик должен быть реверсивный. В прерывании определяется направление и меняется состояние счетчика.

Re: Хитрые, необычные алгоритмы и код

Чт сен 02, 2021 12:20:39

попробую разобраться.. точка при целых миллиметрах у меня отображается постоянно. и что в выражении 1000*S=5*N значит N?

Re: Хитрые, необычные алгоритмы и код

Чт сен 02, 2021 12:43:03

N это число импульсов энкодера.
N=199 S=0.995; N=200 S=1.000; N=201 S=1.005

Re: Хитрые, необычные алгоритмы и код

Чт сен 02, 2021 15:10:11

в чем разница S[мм]-отсчет энкодерной линейки. от N это число импульсов энкодера?мне же и нужно из импульсов сделать миллиметры соответственно из N получить S. из формулы понятно что
N (то что насчитало прерывание от линейки множим на 5 микрон за каждый импульс ) затем делим на 1000 и получаем реальное кол-во мм ( некое число DATA_Y) которое нужно отобразить на табло?
отображаю таким алгоритмом
temp_y1 =16;//INDEX_NEGATIVE_SIGN;
temp_y2 = DATA_Y/1000000%10;//Вывод цифры - "7"
temp_y3 = DATA_Y/100000%10; //Вывод цифры - "6"
temp_y4 = DATA_Y/10000%10; //Вывод цифры - "5"
temp_y5 = DATA_Y/1000%10;//Вывод цифры - "4"
temp_y6 = DATA_Y/100%10; //Вывод цифры - "3"
temp_y7 = DATA_Y/10%10; //Вывод цифры - "2"
temp_y8 = DATA_Y/1%10;//Вывод цифры - "1"
Ответить