Преобразования 16 bit to 5 digit ASCII

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение dccharacter » 17 июл 2013, 05:42

http://www.microchip.su/showthread.php?t=2162
Всего 33 инструкции!!!
А это сколько? 1 инструкция = 1 такт? Т.е. на 1МГц будет 33 мкс одна конвертация?

Добавлено спустя 59 секунд:
Для обратного преобразования(HEX2DEC) подобный "суперминиалгоритм" известен(см. старую конференцию) и он аналогичен, к примеру, всем известной команде DAA от процессора Z80 и т.п.(т.е. если посмотреть, то в АЛУ процессора эта и подобные ей команды выполняются по такому алгоритму, но аппаратно). А здесь уже преобразование DEC2HEX, но тоже, как посмотрю похожий алгоритм(только наоборот).

Мой моск
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 17 июл 2013, 06:14

dccharacter писал(а):А это сколько? 1 инструкция = 1 такт? Т.е. на 1МГц будет 33 мкс одна конвертация?

1 инструкция 4 такта (для pic).
dccharacter писал(а):Мой моск

:)
Да, алгоритм симметричен, сдвигаем влево регистр (умножение на 2 в двоичном формате), десятичная коррекция (+6 если больше 9-ти, 0x0a+6 = 0x10 : избыточные коды больше "9" переносятся в след. разряд). Получаем двоичнодесятич. коррекцию.
Сдвигаем вправо регистр (деление на 2 в двоичном формате), десятичная коррекция (вычитание 6-ти из лишних заемных бит: f - 6 =9). Получаем десятичнодвоичную коррекцию.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Angel71 » 17 июл 2013, 06:28

Dmitry__, daa и das это десятичная коррекция. :) какгбэ
не поверишь, но на первых порах изучения программирования переваривалось громадное кол-во всяких алгоритмов, в том числе и намного более интерестных, чем с этими bcd. только одно дело хорошенько усвоить логические операции и сдвиги, совсем другое пытаться всякую экзотику "тренируй мозги" возводить в ранг обязаловки. ну так, често, можешь с ходу вспомнить, допустим алгоритм деления чисел с фиксированной/плавающей точкой? сомневаюсь, что не изучал и очень сильно сомневаюсь, что вспомнишь. я вот максимум помню, что это делается через вычитание и сдвиги + что алгоритмов умножения или деления, вагон и маленькая тележка.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение dccharacter » 17 июл 2013, 06:33

Dmitry__ писал(а):
dccharacter писал(а):А это сколько? 1 инструкция = 1 такт? Т.е. на 1МГц будет 33 мкс одна конвертация?

1 инструкция 4 такта (для pic).

Но это вроде тольлко первая инструкция, остальные на префетчинге и т.д. вроде получаются кагбэ 1 такт, не?

Добавлено спустя 1 минуту 59 секунд:
Dmitry__ писал(а)::)
Да, алгоритм симметричен, сдвигаем влево регистр (умножение на 2 в двоичном формате), десятичная коррекция (+6 если больше 9-ти, 0x0a+6 = 0x10 : избыточные коды больше "9" переносятся в след. разряд). Получаем двоичнодесятич. коррекцию.
Сдвигаем вправо регистр (деление на 2 в двоичном формате), десятичная коррекция (вычитание 6-ти из лишних заемных бит: f - 6 =9). Получаем десятичнодвоичную коррекцию.

Ну это я в своих часах делал... Только пива было выпито ого-го сколько
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 17 июл 2013, 06:49

Angel71 писал(а):ну так, често, можешь с ходу вспомнить, допустим алгоритм деления чисел с фиксированной/плавающей точкой? сомневаюсь, что не изучал и очень сильно сомневаюсь, что вспомнишь.

Ляхко, да еще избавлюсь от арифметики с плав. точкой в 99 случаях из 99, в отличии от тебя, т.к. это впитано с кровью матери и вижу все глюки быдлокодеров :wink: Что я и сделал в тексовских часах. Кста, а ведь кто-то создает библиотеки для недопрограммеров, они с асм вставками, оптимизация по самое не балуйся, они кто? наверно нечеловеки :)
УЧИ АССЕМБЛЕР! :)
dccharacter писал(а):вроде получаются кагбэ 1 такт, не?

Не, все инструкции по 4 такта, а если есть переход (опустошение конвейера), вот тогда еще +4 такта

Добавлено спустя 5 минут 45 секунд:
Angel71 писал(а):Dmitry__, daa и das это десятичная коррекция. какгбэ

Это я как бэ знаю, я спрашивал к чему ты это? В чем шутка, брат?:
Dmitry__ писал(а):Angel71 писал(а):
про daa и das, пардон это неудачная шутка.

Не понял, про что это?
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение arm-17 » 17 июл 2013, 10:13

тут надо подумать :roll:
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение ALS » 17 июл 2013, 16:01

- Мужики, у вас изолента есть ?
- ???
- Вот, я вам принес...

Гугл, "avr math routines", третья ссылка : http://avr-asm.tripod.com

---
Кстати, то, что нашел dccharacter на "совеЦком" форуме, уже давно, года с 2000-го, есть у буржуев. Только в более человеческом виде и с НОРМАЛЬНЫМИ комментариями.
Там еще много ништяков и именно на асме, вот только большинству современных программеров (не в обиду присутствующим) год от года все более быстрые камни подавай, по-другому они уже не умеют...
Аватара пользователя
ALS
 
Сообщения: 803
Зарегистрирован: 24 окт 2011, 23:32
Откуда: Севастополь
прог. языки: асм

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Angel71 » 17 июл 2013, 16:35

Dmitry__,
Не понял, про что это?

про то, что вещи, которые за хз сколько лет не понадобятся ни разу, вносить в список обязаловки "гыы, да вы не программеры" мягко говоря плохая шутка. сюда же асм и оптимизации/быстрые алгоритмы. всё предельно просто. если есть возможность взять камень с запасом по ресурсам, берётся. если нет возможности и действительно нужно оптимизировать, используется готовый код. и только, если ничего готового нет или он по каким-то весомым причинам не подходит для данной задачи, вот только тогда всё делается самостоятельно, хоть на асме. стремление везде всунуть собственноручно написаный вылизно-оптимизированном код на асме, когда уже есть готовый код или ресурсов мк хватает, это не больше, чем оптимизация ради оптимизации (варианта всего два - или арт или глупость). ну или объясни доходчиво, без всяких "все быдлокодеры, а йа граф", зачем кодить перевод в строку, если есть готовая ф-я, которая в такты и память не упирается? или когда упирается, но писать велосипед, когда уже есть нормально вылизаный готовый код? зачем мудрить с быстрым делением, в случаях, когда есть возможность взять мк, который умеет это аппаратно? зачем под задачу выбирать мк, который 100500 упрётся в тактовую или флеш или озу, в случаях, когда за примерно те же деньги (или когда разница несущественна) можно взять мк с достаточными ресурсами и не тратить кучу времени на оптимизацию ради оптимизации? и т.д.
ALS писал(а):по-другому они уже не умеют...

дело не в том, что не умеют или в принципе не способны. задача задаче рознь. смотри, допустим нужно сделать робота-пылесоса. есть две команды разработчиков, по 2 человека в каждой. навыки/знания у всех одинаковые, з/п то же, у всех $1000. условно за $10 можно взять или плату с мегой или плату с каким-нибудь армом, у которого поболее тактовой, флеша, озу, есть fpu/dsp, переферия пошустрей и вообще потребление примерно такое же. первая команда берёт авр, вторая арм. первые сходу ставят крест на си и полностью всё ваяют на асме, жутко всё вылизывая и им поф, реально была такая необходимость или это просто оптимизация ради оптимизации. вторые активно юзают стандартные библиотеки и копипастят нормально вылезаный готовый код. первые к примеру тратят на проект год, вторые, допустим 1-2месяца. пока первые будут доделывать, вторые давным давно во первых заработают денег, во вторых смогут или начать работать над следующей версией или займутся другим проектом. +выйти на рынок первым иногда намного важней, чем бежать за уехавшим поездом и кричать "постойте, да мы же не для вас старались, мы же всё ради исскуства... смотрите как мы вылизали код. мы же не быдлокодеры и предлагаем вам более дорогой продукт с более ущербным процом, но с точно такими же потребительскими свойствами".
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение denim » 17 июл 2013, 17:29

Не знаю был ли ответ, выискивать среди срача не охота.
Мой рецепт преобразования чисел в ASCII коды выглядит так:
Число 236, например.
(236/100)+30=X (ASCII первого символа)
((236-X*100)/10)+30=Y (ASCII второго символа)
236-X*100-Y*10+30=Z (ASCII третьего символа)
denim
 
Сообщения: 280
Зарегистрирован: 12 окт 2012, 13:32
Откуда: Sevastopol

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 17 июл 2013, 20:50

Этот алгоритм и есть у ТС.
ALS писал(а):Гугл, "avr math routines", третья ссылка

Так тут уже ворох ссылок, в том числе и родные аппноты от атмела.

dccharacter, а чего это у тебя в часах не пошли itoa и sprintf ? Вроде бы говорил что ленивый, а вроде "Ну это я в своих часах делал... Только пива было выпито ого-го сколько"
Пачиму?

arm-17, выкладываю твой исходник с доработками, убери pdf в расширении и погоняй в студии. Форум сьедает форматирование программы, а читать без табуляции сложно...
Для начала, надо выдернуть все Forward, Back, bin16_ascii из прерываний. В прерывании оставить только установку нужных флагов для обработки. Например как ниже, это не совсем корректно, т.к. можно выставить оба флага, но сейчас пойдет.
Код: Выделить всё

.def   flags   = r0   ; state flags
   .equ   EventForward   = 0   ;=1 если надо обслужить прямой счет
   .equ   EventRevers   = 1   ;=1 если надо обслужить обратный счет

В инициализации обнулить clr flags.

В основном цикле Inf нельзя все время инициировать прерывания как у тебя. Это делается 1 раз и забывается. т.е. "ldi temp1,(1__INT1)+(1__INT0)" переносим в инициализацию. Вот основной цикл, постоянная проверка флагов и если надо - переход на обработку:
Код: Выделить всё
Inf:   sbrc   flags, EventForward   ;переход если установлен EventForward
   rjmp   Forward         ;
   sbrc   flags, EventRevers   ;соотв. для EventRevers
   rjmp   Forward         ;

   rjmp   Inf      ;бесконечный цикл



а в самих обработчиках сбрасывать соотв. флаг:
Код: Выделить всё
cbr   flags, (1__EventForward)   ;сбросить флаг, обработали событие

Форум глючит, в сообщениях нельзя вставлять значок "стрелочка влево (знак меньше), у меня по тексту заменено на "__"
test.asm.pdf
(5.11 КиБ) Скачиваний: 0
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение dccharacter » 17 июл 2013, 20:56

Потому что я часы делал не с нуля а из исходников. Там вывод на экран уже хитро реализован - я его не переписывал. А вот настройку часов я делал сам, поэтому долго тупил над тем, что такое это BCD или как там его и сам делал коррекцию. А спринтф-ы оттуда отладочные пришлось вырезать, чтобы куча буферов поместилась, потому что я не умею по-другому. У меня все одной простыней понаписано, почти без функций. Ну короче могу поискать код если кому поржать охота.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Dmitry__ » 17 июл 2013, 21:01

Я так и подумал, щаз придет ангел и выдаст: "ПОМЕНЯЙ ПРОЦЕССОР, это всегда можно сделать" :D
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение Angel71 » 17 июл 2013, 22:14

Dmitry__, :D неа, всё было не так. пришла баба яга и намекнула, что в случаях, когда можно взять камушек повкусней, именно так и нужно делать. вместо оптимизации без всякой надобности лучше заняться чем-то другим. если можно скопипастить хороший код, нужно копипастить (вникать, как он работает никогда не вредило).
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение arm-17 » 18 июл 2013, 02:43

Dmitry__ Привет!
вложения test.asm.pdf не открываются :(

http://electroclub.fatal.ru/RusAVR/Doc/ ... CDapp2.htm
Как туда заводить числа? ЭТО САМЫЙ ГЛАВНЫЙ ВОПРОС :) ???
Аватара пользователя
arm-17
 
Сообщения: 46
Зарегистрирован: 15 июл 2013, 15:15
Откуда: г.Москва
прог. языки: ASM

Re: Преобразования 16 bit to 5 digit ASCII

Сообщение dccharacter » 18 июл 2013, 03:04

arm-17 писал(а):вложения test.asm.pdf не открываются :(

А подумать?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Пред.След.

Вернуться в Микроконтроллеры

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

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