|
Преобразвание bin-hex, Из bin на 7-сегментный индикатор |
|
|
|
Apr 29 2008, 22:42
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Проблема следующая. После оцифровки сигнала в АЦП, в регистре имеется 8бит данных. Задача преобразовать этот двоичный регистр в три, к которые будут отображаться на трёх семисегментных индикаторах соответственно. В индикаторах должен отображаться десятичный эквивалент сигнала (0-255). Подскажите, легко ли это реализовать на ассемблере, и где про это можно почитать? Спасибо.
Сообщение отредактировал Kuznec9999 - Apr 29 2008, 22:43
|
|
|
|
|
Apr 29 2008, 23:03
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Цитата(rezident @ Apr 30 2008, 02:59)  Ключевое слово для поиска по форуму - BCD. Вот в теме про исходники вроде что-то было. http://electronix.ru/forum/index.php?showtopic=10934А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.htmlСпасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования. Скажите, а что такое BCD? Так называется данное преобразование?
Сообщение отредактировал Kuznec9999 - Apr 29 2008, 23:04
|
|
|
|
|
Apr 29 2008, 23:49
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Kuznec9999 @ Apr 30 2008, 02:03)  Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования. Вы меня, конечно, извините, но исходник на С это и есть алгоритм, записанный практически чистейшим английским языком. Цитата(Kuznec9999 @ Apr 30 2008, 02:03)  Скажите, а что такое BCD? Так называется данное преобразование? В таких случаях обычно сначало спрашивают гугля.
Эскизы прикрепленных изображений
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 29 2008, 23:54
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Kuznec9999 @ Apr 30 2008, 05:03)  Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования. Дык алгоритм может быть реализован на любом языке программирования. А алгоритм реализованный на ЯВУ проще понять, чем асм-овый ИМХО. Цитата(Kuznec9999 @ Apr 30 2008, 05:03)  Скажите, а что такое BCD? Так называется данное преобразование? Binary-coded decimal из Википедии.
|
|
|
|
|
Apr 30 2008, 01:33
|

Профессионал
    
Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486

|
Есть много методов преобр. Самый быстрый - табличный(если не жалко памяти), самый медленный - вычитаешь из bin 1 - прибавляешь 1 к 3-х байтному числу, анализируя достижение каждого байта числа 10, если 10 - сбрасываешь его и прибавляешь 1 к след. байту, и т.д. Есть оптимальные алгоритмы в букварях http://lord-n.narod.ru/walla.htmlпоищи, не помню где именно.
Сообщение отредактировал domowoj - Apr 30 2008, 01:46
--------------------
И на камнях растут деревья!
|
|
|
|
|
Apr 30 2008, 04:52
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(Kuznec9999 @ Apr 30 2008, 03:03)  Спасибо. Жаль, что все исходники в основном на Си. А мне хотелось бы разобраться в алгоритме этого преобразования. Алгоритм этого преобразования описан у Титце-Шенка на стр. 321-322 (в инете можно найти если у тебя нет). Правда, реализовать его на С проблематично - он изобилует сдвигами и проверками переноса из 3-го разряда в 4-й. Цитата(rezident @ Apr 30 2008, 02:59)  А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.htmlБоюсь что ваш алгоритм не самый эффективный. А вообще-то все уже написано до нас: в аппнотах в avr204.asm
Сообщение отредактировал 777777 - Apr 30 2008, 05:01
|
|
|
|
|
Apr 30 2008, 06:26
|
Группа: Новичок
Сообщений: 6
Регистрация: 20-03-05
Из: Ukraina
Пользователь №: 3 527

|
--------------------
Терпи, терпи — терпець тебе шліфує, сталить твій дух — тож і терпи, терпи. В.Стус
|
|
|
|
|
Apr 30 2008, 06:40
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(TarasH @ Apr 30 2008, 10:26)  Цитата В данной статье рассматривается программа "bin16bcd5" (см. Приложение, Программа 1), написанная Терешкиным А. В. согласно алгоритму, изложенному в [1], и выполняющая ту же задачу. Последняя программа по быстродействию, длине кода и количеству используемых регистров оказалась более эффективной, чем первая. Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 10 вычитаний на каждую цифру, т.е. всего 50, плюс кучу проверок, а в avr204.asm коротенький цикл выполняется лишь 16 раз.
|
|
|
|
|
Apr 30 2008, 08:34
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(777777 @ Apr 30 2008, 09:40)  Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 10 вычитаний на каждую цифру, т.е. всего 50, плюс кучу проверок, а в avr204.asm коротенький цикл выполняется лишь 16 раз. Ну так сравнить код и всё! В avr204.asm цикл для bin2BCD16 не такой и коротенький. Внутри 16 проходов цикла сдвига делается ещё десятичная коррекция, команды для которой у AVR нет. Это у 51-го можно коррекцию делать во время сдвига, выходит аккуратно и быстро. Коррекция там сама сделана как цикл по байтам результата, итого это три прохода. Это, конечно, быстрее, чем делением на 10, но в целом отвратительная реализация, попытка перенести на архитектуру AVR решение, которое на неё плохо ложится. Во внутреннем цикле два вычитания, итого уже 16*3*2 = 96 гарантированных вычитаний. Ещё там максимум четыре косвенных обращения к регистрам как к памяти через указатель Z, которые вместе эквивалентны четырём словным вычитаниям. Ещё эквивалент максимум 16*3*4 = 192 вычитания. Итого 288 макс. И Вы говорите, что 50 _максимум_ это много? Ну и их там не 50. Для последней цифры единички вычитать не нужно вообще, для предпоследней вычитания байтовые, а не словные, для первой будет вычитаться максимум 7 раз. Ну там ещё компенсационные сложения для восстановления числа, итого там "лень считать, но в переводе на словные вычитания точно не больше 40". Итого: avr204.asm Код ;* Number of words :25 ;* Number of cycles :751/768 (Min/Max) ;* Low registers used :3 (tBCD0,tBCD1,tBCD2) ;* High registers used :4(fbinL,fbinH,cnt16a,tmp16a) ;* Pointers used :Z 25 слов, 9 регистров, больше 750 тактов. Метод вычитания с atmel.ru Код ;* Количество слов кода :25 + возврат ;* Количество циклов :25/176 (Мин/Макс) + возврат ;* Использованные младшие регистры :нет ;* Использованные старшие регистры :4(fbinL,fbinH/tBCD0,tBCD1,tBCD2) ;* Использованные указатели :нет Столько же слов, в два раза меньше регистров, минимум в четыре раза быстрее.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 30 2008, 08:49
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата Это, конечно, быстрее, чем делением на 10 А что вас так смущает деление на 10? В пределах байта это 4 сдвига и 4 сложения Равно как и умножение
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 30 2008, 12:08
|
Участник

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157

|
Попробовал avr204.asm, а именно bin2bcd8... На выходе числа не соответствуют входу (контроллер mega8)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|