реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Преобразвание bin-hex, Из bin на 7-сегментный индикатор
Kuznec9999
сообщение Apr 29 2008, 22:42
Сообщение #1


Участник
*

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



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

Сообщение отредактировал Kuznec9999 - Apr 29 2008, 22:43
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 29 2008, 22:59
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Ключевое слово для поиска по форуму - BCD. Вот в теме про исходники вроде что-то было. http://electronix.ru/forum/index.php?showtopic=10934
А я как-то вот такой алгоритм (правда на Си) предлагал http://caxapa.ru/116486.html
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение Apr 29 2008, 23:03
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 29 2008, 23:49
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 29 2008, 23:54
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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


Профессионал
*****

Группа: Участник
Сообщений: 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


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 30 2008, 04:52
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 30 2008, 05:24
Сообщение #8


Беспросветный оптимист
******

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



Цитата(domowoj @ Apr 30 2008, 04:33) *
Есть много методов преобр.
Самый быстрый - табличный(если не жалко памяти),
самый медленный - вычитаешь из bin 1 - прибавляешь 1 к 3-х байтному числу, анализируя достижение
каждого байта числа 10, если 10 - сбрасываешь его и прибавляешь 1 к след. байту, и т.д.

cranky.gif 01.gif
итого 255 итераций для преобразования числа 255?
01.gif 01.gif 01.gif
а просто поделить на 10 никак?

Я бы сделал так:
Код
char number;
char digit1=0; // 1 цифра
char digit2=0; // 1 цифра
char digit3=0; // 1 цифра
...
number=...     //

...
if(number>=200)
{
  digit1=2;
  number-=200;
}
else

  if(number>=100)
  {
    digit1=1;
    number-=100;
  }
digit2=number/10;
digit3=number-digit2*10;

не претендую на оптимальность , но сам так делаю


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 30 2008, 05:43
Сообщение #9


Профессионал
*****

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



Цитата(MrYuran @ Apr 30 2008, 09:24) *
не претендую на оптимальность , но сам так делаю

Да уж... Господа, читайте классику, она вечна. smile.gif И программа в avr24.asm основана именно на алгоритме, описанном у Титце-Шенка (см. выше).
Go to the top of the page
 
+Quote Post
TarasH
сообщение Apr 30 2008, 06:26
Сообщение #10





Группа: Новичок
Сообщений: 6
Регистрация: 20-03-05
Из: Ukraina
Пользователь №: 3 527



Смотри сюда http://www.atmel.ru/Articles/Atmel13.htm


--------------------
Терпи, терпи — терпець тебе шліфує,
сталить твій дух — тож і терпи, терпи.
В.Стус
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 30 2008, 06:40
Сообщение #11


Профессионал
*****

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



Цитата(TarasH @ Apr 30 2008, 10:26) *


Цитата
В данной статье рассматривается программа "bin16bcd5" (см. Приложение, Программа 1), написанная Терешкиным А. В. согласно алгоритму, изложенному в [1], и выполняющая ту же задачу.
Последняя программа по быстродействию, длине кода и количеству используемых регистров оказалась более эффективной, чем первая.


Че-то я не представляю как она могла оказаться быстрее, если в ней требуется выполнить до 10 вычитаний на каждую цифру, т.е. всего 50, плюс кучу проверок, а в avr204.asm коротенький цикл выполняется лишь 16 раз.
Go to the top of the page
 
+Quote Post
blackfin
сообщение Apr 30 2008, 06:58
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Ещё пару ссылок:

int >> str
itoa на asm, из темы "51 vs AVR"...

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

Сообщение отредактировал blackfin - Apr 30 2008, 07:00
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 30 2008, 08:34
Сообщение #13


Нечётный пользователь.
******

Группа: Свой
Сообщений: 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)
;* Использованные указатели        :нет

Столько же слов, в два раза меньше регистров, минимум в четыре раза быстрее.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 30 2008, 08:49
Сообщение #14


Беспросветный оптимист
******

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



Цитата
Это, конечно, быстрее, чем делением на 10

А что вас так смущает деление на 10?
В пределах байта это 4 сдвига и 4 сложения
Равно как и умножение


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение Apr 30 2008, 12:08
Сообщение #15


Участник
*

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



Попробовал avr204.asm, а именно bin2bcd8... На выходе числа не соответствуют входу (контроллер mega8)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 19:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.0152 секунд с 7
ELECTRONIX ©2004-2016