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


Любопытно, что тот же код, без лишнего гемора на С будет несколько строк. Но мы не ищем лёгких путей. Надо мыслить, как мыслит машина!
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

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 01:56 pm
Powered by Dreamwidth Studios