Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Сб сен 19, 2020 05:12:52
У кого-нибудь остался архив MULT_KNUTH.zip из сообщения
https://radiokot.ru/forum/viewtopic.php ... 5&start=83 ?
Вс сен 20, 2020 22:18:06
это "тупое" суммирование частичных произведений пишется элементарно за несколько минут, без всякого чужого архива.
Вс сен 20, 2020 22:42:27
А Карацубой не быстрее будет?
Пн сен 21, 2020 08:19:59
Умножение 32*32 занимает 132 такта, что даст алгоритм Карацубы?
Спойлер
- Вложения
-
- KNUT_32.PNG
- (72.5 KiB) Скачиваний: 422
Пн сен 21, 2020 11:55:28
akl, если есть аппаратная операция умножения, то мало что. Если же ее нет, то - заметное ускорение.
Вт авг 24, 2021 20:33:45
Здравствуйте уважаемые.Прошерстил форумы и думаю это самая подходящая ветка.Нужна помощь ибо у меня голова не варит уже.Итак задача опроса данных с оптической линейки и вывод на дисплей тм1638.Уже сделано:линейка опрашивается по прерыванию и данные выводятся на табло но! вместо одного миллиметра ,десятой , сотой отображается количество импульсов на тот самый миллиметр...один импульс это 5 микрон а одна сотка это 2 импульса по 5 микрон...пишу на си для тинки 88.Алгоритм с делилками на целочисленное значение не подходит.Может у когото есть мысли поделитесь .при необходимости кусок кода предоставлю.
Вт авг 24, 2021 21:00:36
Ничего не понял, но если один импульс это сколько-то микрон, то N импульсов в микроны переводятся умножением на N, а не делением...
Вт авг 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 раз.
Вт авг 24, 2021 21:09:59
Понятнее не стало
Вт авг 24, 2021 21:12:34
if (VAL_Y==VAL_Ycl ) {mic_y++ ;} else {mic_y--;} обработчик прерывания
Добавлено after 1 minute 31 second:Понятнее не стало
что именно не понятно? как работает мой код ? я прибавляю по нарастающей по 5 микрон дважды для сотки и так к каждому разряду по единице до целого милиметра
Вт авг 24, 2021 22:17:09
culibin 100 писал(а):думаю это самая подходящая ветка.
это самая НЕ подходящая ветка.
или ты считаешь, что предложил хитрый и необычный алгоритм, чтобы другие люди могли применить его у себя?
так ты сильно ошибаешься.
в этой теме люди показывают свои "хитрости", которые могут быть полезны другим людям.
Вт авг 24, 2021 22:21:01
я просил как раз подсказать мне реализовать алгоритм а не рекламирую свой.
Ср авг 25, 2021 08:18:08
я так и не понял, в чем проблема?
вместо простого счетчика импульсов вы применяете поразрядный (аналог BCD) счет. ну, не знаю, чем это оправдано, но вполне приемлемо.
и чо?
я бы делал иначе: считал импульсы в обычном счетчике, а уже перед выводом на индикатор производил бы вычисления и преобразования в "читабельный" вид. в прерываниях счет типа counter++, в главном цикле расчет и вывод.
никакой "необычности" или "оригинальности" в этом алгоритме нет и не нужно
Чт авг 26, 2021 09:57:22
if (VAL_Y==VAL_Ycl ) {mic_y++ ;} else {mic_y--;} вот я и делаю тут как написали типа counter++.читабельный вид портит что микроны должны прибавляться по 5 за импульс и отображаться также .в разряде отображается либо 5 либо 0 а сотки отображаются как и положено от 1 до 9.задача простенькая но чет я наверно старею...еще нудобство что нужно минимально загрузить ядро мк иначе прерывания начинают глотаться при увеличении скорости движения линейки энкодера.
Чт авг 26, 2021 12:48:20
МК по идее должен уметь считать внешние импульсы аппаратно... Может, это лучше, чем прерывание на каждый импульс?
Пт авг 27, 2021 14:51:35
...читабельный вид портит что микроны должны прибавляться по 5 за импульс и отображаться также .в разряде отображается либо 5 либо 0 а сотки отображаются как и положено от 1 до 9.задача простенькая но чет я наверно старею...еще нудобство что нужно минимально загрузить ядро мк иначе прерывания начинают глотаться при увеличении скорости движения линейки энкодера.
Думаю, выражение 1000*S=5*N решит проблему. S[мм]-отсчет энкодерной линейки. 1000 учитывается десятичной точкой на табло.
Если счетчик с каждым импульсом изменяет свое состояние на 5, умножение не нужно. Для энкодера счетчик должен быть реверсивный. В прерывании определяется направление и меняется состояние счетчика.
Чт сен 02, 2021 12:20:39
попробую разобраться.. точка при целых миллиметрах у меня отображается постоянно. и что в выражении 1000*S=5*N значит N?
Чт сен 02, 2021 12:43:03
N это число импульсов энкодера.
N=199 S=0.995; N=200 S=1.000; N=201 S=1.005
Чт сен 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"
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.