Dlinyj (dlinyj) wrote,
Dlinyj
dlinyj

Category:

Перевод двоичного числа в десятичное.

Понадобилась мне задачка, на 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


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

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 15 comments