?

Log in

No account? Create an account
  Journal   Friends   Calendar   User Info   Memories
 

Электронный миссионер

20th August, 2006. 3:24 am. Перевод двоичного числа в десятичное.

Понадобилась мне задачка, на AVR, перевести 10 битное число, снимаемое с АЦП в десятичный формат, чтобы можно было его удобно вывести на дисплей или передать в компутер. Задача оказалось интересной и сложной. Оказалось, что у AVR напрочь отстутствуют команды деления. Не можем делить, но можем вычитать! Отлично. Но и это оказалось не камень преткновения, с 16 разрядным регистром всего несколько команд работает. Это сложение и вычитание с константой. Но и это не всё, сложение/вычитание производится с числом меньше либо равным 63! Мда, задачка достойная настоящего гуру. И я её победил, теребил кучу народу по асе, присылали коды, но не один меня не спас. Низкий поклон в ножки за оказаннаю помощь gxost в проверке и подсказке алгоритмов. А также проверке моего убогого, но в конце концов рабочего, кода. Для особо любопытных код можно глянуть под катом. //примечание для gxost - ошибка была в одном операторе, выделен жирным с каментом. Read more...Collapse )
Любопытно, что тот же код, без лишнего гемора на С будет несколько строк. Но мы не ищем лёгких путей. Надо мыслить, как мыслит машина!

Read 15 Notes -Make Notes

20th August, 2006. 11:56 am. Великий ассемблер!

В общем, да... serg2x2 был прав. У меня там был недочёт. Но так просто сложение с переносом делать нельзя, т.к. мы бит переноса портим в вычитании. Пришлось ставить оператор, обнуляющий этот флаг. В результате код, в котором был баг, будет таким:
	clc	;Очищаем флаг переноса! Очень важный момент
	push	r18
	ADD	ZL,R16
	ADC	ZH,R17;Складываем старший байт учитывая перенос.

Как оказалось флаг переноса мы подсираем в вычитании. Приходится его обнулять принудительно. Когда написал онным образом в дебагере код был прогнан с разными цифирями и всё работало на ура!
З.Ы. Просто асм на ночь - это жопа!

Read 3 Notes -Make Notes

20th August, 2006. 6:34 pm.

Обожаю RISC архитектуру - столько геммороя на пустом месте :)

Make Notes

Back A Day - Forward A Day