dlinyj: (Default)
[personal profile] dlinyj
Понадобилась мне задачка, на AVR, перевести 10 битное число, снимаемое с АЦП в десятичный формат, чтобы можно было его удобно вывести на дисплей или передать в компутер. Задача оказалось интересной и сложной. Оказалось, что у AVR напрочь отстутствуют команды деления. Не можем делить, но можем вычитать! Отлично. Но и это оказалось не камень преткновения, с 16 разрядным регистром всего несколько команд работает. Это сложение и вычитание с константой. Но и это не всё, сложение/вычитание производится с числом меньше либо равным 63! Мда, задачка достойная настоящего гуру. И я её победил, теребил кучу народу по асе, присылали коды, но не один меня не спас. Низкий поклон в ножки за оказаннаю помощь [livejournal.com profile] gxost в проверке и подсказке алгоритмов. А также проверке моего убогого, но в конце концов рабочего, кода. Для особо любопытных код можно глянуть под катом. //примечание для [livejournal.com profile] 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


Любопытно, что тот же код, без лишнего гемора на С будет несколько строк. Но мы не ищем лёгких путей. Надо мыслить, как мыслит машина!

Date: 2006-08-20 01:38 am (UTC)
From: [identity profile] serg2x2.livejournal.com
ADD ZH,R17;вот тут у нас стояло adc, поменял и всё заработало. Добавлялся в старший разряд фигня...
ADD ZL,R16


по моему тут ошибка, IMHO должно быть
ADD ZL,R16
ADС ZH,R17 ;вот тут у нас стояло adc, поменял и всё заработало. Добавлялся в старший разряд фигня...


то есть поменять местами команды, а ADC оставить

Date: 2006-08-20 10:43 am (UTC)
From: [identity profile] gxost.livejournal.com
точно

Date: 2006-08-20 10:48 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Блин выходит так. Что есличисло больше 1000, то код работает на ура! А если меньше, то надо ставить

ADD ZH,R17
ADD ZL,R16

Короче просто надо сделать проверку R18.

З.Ы. 5 минут назад погонял в отладчике опять на FF. - Лажа.

офтопик ))

Date: 2006-08-22 10:26 pm (UTC)
From: [identity profile] dj-atmex.livejournal.com
прикольно... ;)))))
вот всегда интересовал вопрос. когда мне надо было преобразовывать в BCD я использовал такую схему (это в FPGA):
Image
Тут K155ПР7 - это табличный преобразователь для чисел 0-63. Думаю, логика построения для больших разрядов понятна.

Вот интересно, а если такое дело запрограммировать - это будет работать быстрее? И можно ли обойтись без таблиц. Вы не думали об этом? ;)))


Re: офтопик ))

Date: 2006-08-22 10:43 pm (UTC)
From: [identity profile] dlinyj.livejournal.com
Идея интересная, в действительности. Думаю стоит запостить в [livejournal.com profile] ru_radio_electr, и там подробно обсудить. На логике естественно будет быстрее работать. Можно использовать и мой алгоритм.

Date: 2006-08-22 10:48 pm (UTC)
From: [identity profile] dj-atmex.livejournal.com
мне интересно лишь можно ли такую схему "запрограммировать" - т.е. написать эквивалентный код на асме или си, который будет юзать регистр(ы) с исходным числом и мутить над ним преобразования по этой схеме ;)
просто помнится на одном форуме, где обсуждался алгоритм BCD, давался совершенно дикий исходник на асм-е, который никто не мог понять, но который (ИМХО) работает примерно также как и эта схема.

Re: офтопик ))

Date: 2006-08-22 10:50 pm (UTC)
From: [identity profile] dj-atmex.livejournal.com
а в FPGA это работало (да и работает сейчас, я думаю) со скоростью 80x10^6 чисел/сек ;))

Date: 2006-08-23 06:16 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Т.е. просто выбрирать по таблице значение? Думаю да, можно. Но будет работать медленнее, чем просто считать.

Date: 2006-08-23 06:29 am (UTC)
From: [identity profile] dj-atmex.livejournal.com
почему медленее и медленее чем считать по какому алгоритму? :)

Date: 2006-08-23 06:59 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Не, ну реально, сделай кросспост. А то у меня в сообществе затхло. Там и расроем тему, при том не только мы в двоём. Хотя может я и не прав. Надо подумать, смотря как организовать логику.

Re: офтопик ))

Date: 2006-08-23 06:59 am (UTC)
From: [identity profile] dlinyj.livejournal.com
А схема есть?

Verilog!

Date: 2006-08-23 07:05 am (UTC)
From: [identity profile] dj-atmex.livejournal.com
Есть мой исходник на Verilog. Могу выслать сабж, если надо. Пиши куда. Но это будет после обеда. Ща я на работе :)

Date: 2006-08-23 07:06 am (UTC)
From: [identity profile] dj-atmex.livejournal.com
нивапрос.
сегодня запощу (чуточку позже) :)

Re: Verilog!

Date: 2006-08-23 07:28 am (UTC)
From: [identity profile] dlinyj.livejournal.com
Письмо упадёт на мыло, а камент я удалил, от спама.

Date: 2006-08-24 09:24 am (UTC)
From: [identity profile] dj-atmex.livejournal.com
запостил ;))
извини, что с опозданием - совсем не было времени на поиски этого дела у себя на дисках.
ссылка на файл с реализацией там есть.

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 05:37 pm
Powered by Dreamwidth Studios