Перевод двоичного числа в десятичное.
Aug. 20th, 2006 03:24 amПонадобилась мне задачка, на AVR, перевести 10 битное число, снимаемое с АЦП в десятичный формат, чтобы можно было его удобно вывести на дисплей или передать в компутер. Задача оказалось интересной и сложной. Оказалось, что у AVR напрочь отстутствуют команды деления. Не можем делить, но можем вычитать! Отлично. Но и это оказалось не камень преткновения, с 16 разрядным регистром всего несколько команд работает. Это сложение и вычитание с константой. Но и это не всё, сложение/вычитание производится с числом меньше либо равным 63! Мда, задачка достойная настоящего гуру. И я её победил, теребил кучу народу по асе, присылали коды, но не один меня не спас. Низкий поклон в ножки за оказаннаю помощь
gxost в проверке и подсказке алгоритмов. А также проверке моего убогого, но в конце концов рабочего, кода. Для особо любопытных код можно глянуть под катом. //примечание для
gxost - ошибка была в одном операторе, выделен жирным с каментом.
Любопытно, что тот же код, без лишнего гемора на С будет несколько строк. Но мы не ищем лёгких путей. Надо мыслить, как мыслит машина!
ldi r16,0x03; mov ZH,r16 ldi r16,253; mov ZL,r16 tysych: LDI r16,0xE8 LDI r17,3 SUB ZL,R16 SBC ZH,R17 brcs non_tys inc r18 rjmp tysych non_tys: push r18 ADD ZH,R17;вот тут у нас стояло adc, поменял и всё заработало. Добавлялся в старший разряд фигня... ADD ZL,R16 LDI R18,0 sotnya: SBIW ZL,50 SBIW ZL,50 BRMI NON_SOT inc r18 rjmp sotnya NON_SOT: push r18 LDI R18,0 ADIW ZL,50 ADIW ZL,50 desyat: SBIW ZL,10 BRMI non_des inc r18 rjmp desyat non_des: push r18 ADIW ZL,10 push ZL
Любопытно, что тот же код, без лишнего гемора на С будет несколько строк. Но мы не ищем лёгких путей. Надо мыслить, как мыслит машина!
no subject
Date: 2006-08-20 01:38 am (UTC)ADD ZH,R17;вот тут у нас стояло adc, поменял и всё заработало. Добавлялся в старший разряд фигня...
ADD ZL,R16
по моему тут ошибка, IMHO должно быть
ADD ZL,R16ADС ZH,R17 ;вот тут у нас стояло adc, поменял и всё заработало. Добавлялся в старший разряд фигня...
то есть поменять местами команды, а ADC оставить
no subject
Date: 2006-08-20 10:43 am (UTC)no subject
Date: 2006-08-20 10:48 am (UTC)ADD ZH,R17
ADD ZL,R16
Короче просто надо сделать проверку R18.
З.Ы. 5 минут назад погонял в отладчике опять на FF. - Лажа.
офтопик ))
Date: 2006-08-22 10:26 pm (UTC)вот всегда интересовал вопрос. когда мне надо было преобразовывать в BCD я использовал такую схему (это в FPGA):
Тут K155ПР7 - это табличный преобразователь для чисел 0-63. Думаю, логика построения для больших разрядов понятна.
Вот интересно, а если такое дело запрограммировать - это будет работать быстрее? И можно ли обойтись без таблиц. Вы не думали об этом? ;)))
Re: офтопик ))
Date: 2006-08-22 10:43 pm (UTC)no subject
Date: 2006-08-22 10:48 pm (UTC)просто помнится на одном форуме, где обсуждался алгоритм BCD, давался совершенно дикий исходник на асм-е, который никто не мог понять, но который (ИМХО) работает примерно также как и эта схема.
no subject
Date: 2006-08-23 06:16 am (UTC)no subject
Date: 2006-08-23 06:29 am (UTC)no subject
Date: 2006-08-23 06:59 am (UTC)no subject
Date: 2006-08-23 07:06 am (UTC)сегодня запощу (чуточку позже) :)
no subject
Date: 2006-08-24 09:24 am (UTC)извини, что с опозданием - совсем не было времени на поиски этого дела у себя на дисках.
ссылка на файл с реализацией там есть.
Re: офтопик ))
Date: 2006-08-22 10:50 pm (UTC)Re: офтопик ))
Date: 2006-08-23 06:59 am (UTC)Verilog!
Date: 2006-08-23 07:05 am (UTC)Re: Verilog!
Date: 2006-08-23 07:28 am (UTC)