Страница 256 из 400

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 05:39:31
akl

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 06:19:55
Demiurg
ILYAUL писал(а):...

Код: Выделить всё

//------------------------------------------------------------------------
#define tab_h(x) HIGH(x), LOW(x)
#define tab_l(x) LOW(x), HIGH(x)
//------------------------------------------------------------------------

/************************************************************************/
#if (BCD==YES)

.dseg

HEX_DEC_BUFFER:
.equ	HEX_DEC_BUFFER_LENGHT = 5
.byte	HEX_DEC_BUFFER_LENGHT

.cseg

Hex_Dec:
	ldx		HEX_DEC_BUFFER
	ldz		Tab_10_16*2

	ldi		r19, 4

Hex_Dec_Cycle:
	lpm		r17, Z+
	lpm		r16, Z+

	rcall	Hex_Dec_Digit
	st		X+, r18

	dec		r19
	brne	Hex_Dec_Cycle

	mov		r16, r14
//	ori		r16, 0x30
	st		X+, r16
Hex_Dec_End:
	ret

Hex_Dec_Digit:
	ldi		r18,-1
Hex_Dec_Digit_Cycle:
	inc		r18
	sub		r14,r16
	sbc		r15,r17
	brsh	Hex_Dec_Digit_Cycle
	add		r14,r16
	adc		r15,r17
//	ori		r18,0x30
	ret


Tab_10_16:
.db tab_h (10000)
.db tab_h (1000)
.db tab_h (100)
.db tab_h (10)

#endif
//==================

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 08:39:05
ILYAUL
Вообщем- то для него этого достаточно

Код: Выделить всё

;**************************************************
;*    ;;+Подпрограмма преобразования в BCD;;*     *
;**************************************************
CONVBCD:
		clr		temp				;+ Преобразуем в BCD
BCD1:
		subi	temp1,10
		brcs	EndBCD
		inc		temp
		rjmp	BCD1
EndBCD:		
		subi	temp1,-10
		ori		temp1,'0'			; перевод в ASCII
		cp		temp,zero
		breq	XXXX
		ori		temp,'0'			;/ в temp1 младшее значение в temp - старшее
		ret
XXXX:
		ldi		temp,0x20			;| Убираем первый , незначащий ноль
		ret

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 09:09:04
Gudd-Head
Я тут подумал и упрощаю задачу:
надо получить 3 байта:
1ый — знак (скажем, $A = "+", $B = "-");
2ой — целая часть температуры в двоичном формате (процедура перевода в BCD в проге уже есть);
3ий — дробная часть (0 или 5).

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 09:19:22
ILYAUL
Ну и чего, та же самая таблица , только с двумя значениями 0x30 и 0х35 т.к дробь будет только 1 или 0 -другого не дано
Знак проверяется по старшему биту - 1 - значит минус . для подготовки для BCD лучше инвертировать в + , там выше в коде это есть

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 09:29:58
Gudd-Head
Чего? Какая таблица? :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 09:34:14
ILYAUL
Последний пост на предыдущей странице

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 09:39:13
Gudd-Head
Ммм... сложновато.
Я вижу примерно так:
Если > 0, загружаем в первый байт "+", сдвигаем целую часть во 2-й байт и смотрим дробную часть: 0 или 5;
Если < 0, загружаем в первый байт "-", сдвигаем целую часть во 2-й байт, берём дополнене и смотрим дробную часть: 0 или 5.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 10:07:15
ILYAUL
У DS-ки одна замечательная вещь , она устанавливает старший бит в 1 , если температура отрицательная. Проверяем и выводим +/-
Если темпю. отрицательная , переводим в положит и

Код: Выделить всё

		lsr		SHIFT_REG					// и значение текущей температуры т.е делим на 10
X1:		ror		TERMO_REG					// В TERMO_REG собираются значения температуры, в SHIFT_REG - значения после запятой
		ror		SHIFT_REG
		dec		count
		brne	X1
		swap	SHIFT_REG
Так вот у Вас SHIFT_REG будет или = 1 или 0 Проверяете и выводите сразу после запятой 0 или 5

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 10:12:20
a_skr
r17:r16 - вход
выход:
r20: '+'/'-'
r21: градусы
r22: 0/5

Код: Выделить всё

	ldi r20,'+'
	and  r17,r17 ; проверка на отрицательность
	brpl plus

	com  r17  ; отрицательное
	neg  r16
	sbci r17,0xFF
	ldi r20,'-'

plus: ; (уже) положительное
	ldi  r22,5   
	sbrs r16,3 ; проверка на 0.5
	clr  r22

	lsr r17   ; сдвигаем вправо на 4 бита
	ror r16
	lsr r17
	ror r16
	lsr r17
	ror r16
	lsr r17
	ror r16
	
	mov r21,r16 ; и получаем целые градусы

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 10:16:39
Gudd-Head
a_skr писал(а): and r17,r17 ; проверка на отрицательность
Почему не Хотя в машинных кодах это одно и то же :)
Спасибо за код, лови плюсы.

Кто-нибудь сможет компактней? :))

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 10:28:27
a_skr
Почему не tst r17
да, нагляднее так. просто ассемблер лет 15 назад изучал ;)
Спасибо за код, лови плюсы.
Спасибо! :)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 10:44:11
ILYAUL

Код: Выделить всё

ldi r20,'+'
   and  r17,r17 ; проверка на отрицательность
   brpl plus

   com  r17  ; отрицательное
   neg  r16
   sbci r17,0xFF
   ldi r20,'-'
=

Код: Выделить всё

sbrs R17,MSB
ldi R20,'+'
Sbrc R17,MSB
ldi R20,'-'

Код: Выделить всё

lsr r17   ; сдвигаем вправо на 4 бита
   ror r16
   ror r17
   ror r16
   ror17
   ror r16
   ror r17
   ror r16
=

Код: Выделить всё

      lsr      SHIFT_REG               // и значение текущей температуры т.е делим на 10
X1:      ror      TERMO_REG               // В TERMO_REG собираются значения температуры, в SHIFT_REG - значения после запятой
      ror      SHIFT_REG
      dec      count
      brne   X1
      swap   SHIFT_REG

Код: Выделить всё

Sbrs    SHIFT_REG,LSB
ldi   R20,'0'
sbrc SHIFT_REG,LSB
Ldi R20,'5'

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 11:56:30
akl
Gudd-Head писал(а):Кто-нибудь сможет компактней?
Немного, но всё же... :)

Код: Выделить всё

	LDI	ZL,4

	LDI	R20,'+'
	TST	XH
	BRPL	PLUS
	COM	XH
	NEG	XL
	SBCI	XH,-1
	LDI	R20,'-'
PLUS:
	LSR	XH
	ROR	XL
	DEC	ZL
	BRNE	PLUS	

	LDI	R21,5
	BRCS	PC+2
	CLR	R21
	
	MOV	R22,XL
	

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 14:50:47
Demiurg
Только ассемблерщики меряются, у кого короче....

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июн 19, 2015 14:52:03
ILYAUL
Нет, отвечаем на просьбу

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс июн 28, 2015 19:16:39
Серый_
Составляю памятку с описанием и переводом команд ассемблера, кто-нибудь может перевести оные - научным языком. "Подпись"/ "не подпись"/ и "подпись" ли в русском варианте/ и что за подпись? :) Команды аппаратному умножителю:

Multiply Unsigned
Multiply Signed
Multiply Signed with Unsigned
Fractional Multiply Unsigned
Fractional Multiply Signed
Fractional Multiply Signed with Unsigned

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс июн 28, 2015 19:35:27
Z_h_e

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июл 03, 2015 15:16:12
Серый_
Ребят, как преобразовать двоичное в BCD? 11111111 >>> 255, осадив оное в трёх регистрах?
00000010 = 2
00000101 = 5
00000101 = 5
Предлагают 16-ти битные, но скостить их до 8-ми тоже надо уметь, чтоб "процедуру не повело". :) Может у кого в наличии готовые примеры?
УГ-изм проблемы:
СпойлерИзображение

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пт июл 03, 2015 16:06:58
Seriyvolk

Код: Выделить всё

;вход: R16  число от 0 ... 255 
;выход: R18 число 2, R17 число 1, R16 число 0  = digits 
;байтов: 20 

;пример на вход ldi r16,255
;выход r18 = 00000010 это 2, r17 = 00000101 это 5, r16 = 00000101 это 5.                
Hex2BCD:		LDI r18,-1 
bcd1:           INC r18
                SUBI r16,100 
                BRCC bcd1 
                LDI r17,10 
bcd2:           DEC r17 
                SUBI r16,-10 
                BRCS bcd2
ret