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

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

Добавлено: Чт июл 22, 2010 12:36:10
Gudd-Head
GP1 писал(а):Дано:
Студия 4.18 SP2 b.700
Камень?

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

Добавлено: Чт июл 22, 2010 13:05:40
DX168B
Какова модель МК?
Код для ATtiny26L:

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

ldi           temp4,          15          ;При частоте кварца 8Мгц, прерывание по переполнению
out           TCCR1B,         temp4       ;таймера Т1 происходит раз в ~0,5 секунд. (8/16384)
ldi           temp4,          (1<<PLOCK)
out           PLLCSR,         temp4
ldi           temp4,          (1<<TOIE1)  ;Включаем прерывание по переполнению.
out           TIMSK,          temp4

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

Добавлено: Чт июл 22, 2010 15:21:47
GP1
Сорри, склероз.
мк - tiny24

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

Добавлено: Чт июл 22, 2010 16:00:13
Gudd-Head
GP1 писал(а):мк - tiny24
Не знаю, у меня всё работает (Студия 4.18 b.700). Ищите косяк в тексте проги.
Изображение

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

Добавлено: Чт июл 22, 2010 17:25:45
GP1
Дело не в проге, переустановил студию и все заработало, что за глюк так и не понял :dont_know:

по поводу "и все заработало" - погорячился, :))) перестало генерироваться прерывание PCI, хотя точно знаю до этого работало и в симе и в железе :))) :))) :)))

это просто полный ппц, :shock: :shock: :shock: , "кто виноват? и что делать?" :shock: :shock: :shock: :dont_know:

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

Добавлено: Пн июл 26, 2010 13:55:25
Gudd-Head
Кто-нибудь может мне на пальцах разъяснить, как они втиснули в 25 слов преобразование 16-битного двоичного слова в пять двоично-десятичных (три байта)? Код смотрел, прогонял в симуляторе. Работает, но вот КАК :shock: понять до сих пор не могу.

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

;***************************************************************************
;* "bin2BCD16" - 16-bit Binary to BCD conversion
;*
;* This subroutine converts a 16-bit number (fbinH:fbinL) to a 5-digit
;* packed BCD number represented by 3 bytes (tBCD2:tBCD1:tBCD0).
;* MSD of the 5-digit number is placed in the lowermost nibble of tBCD2.
;*
;* Number of words	:25
;* Number of cycles	:751/768 (Min/Max)
;* Low registers used	:3 (tBCD0,tBCD1,tBCD2)
;* High registers used  :4(fbinL,fbinH,cnt16a,tmp16a)	
;* Pointers used	:Z
;***************************************************************************
;***** Subroutine Register Variables
.equ	AtBCD0	=13		;address of tBCD0
.equ	AtBCD2	=15		;address of tBCD1
.def	tBCD0	=r13		;BCD value digits 1 and 0
.def	tBCD1	=r14		;BCD value digits 3 and 2
.def	tBCD2	=r15		;BCD value digit 4
.def	fbinL	=r16		;binary value Low byte
.def	fbinH	=r17		;binary value High byte
.def	cnt16a	=r18		;loop counter
.def	tmp16a	=r19		;temporary value
;***** Code
bin2BCD16:
	ldi	cnt16a,16	;Init loop counter	
	clr	tBCD2		;clear result (3 bytes)
	clr	tBCD1		
	clr	tBCD0		
	clr	ZH		;clear ZH 
bBCDx_1:lsl	fbinL		;shift input value
	rol	fbinH		;through all bytes
	rol	tBCD0		;
	rol	tBCD1
	rol	tBCD2
	dec	cnt16a		;decrement loop counter
	brne	bBCDx_2	;if counter not zero
	ret			;   return
bBCDx_2:ldi	r30,AtBCD2+1	;Z points to result MSB + 1
bBCDx_3:
	ld	tmp16a,-Z	;get (Z) with pre-decrement
	subi	tmp16a,-$03	;add 0x03
	sbrc	tmp16a,3	;if bit 3 not clear
	st	Z,tmp16a	;	store back
	ld	tmp16a,Z	;get (Z)
	subi	tmp16a,-$30	;add 0x30
	sbrc	tmp16a,7	;if bit 7 not clear
	st	Z,tmp16a	;	store back
	cpi	ZL,AtBCD0	;done all three?
	brne	bBCDx_3	;loop again if not
	rjmp	bBCDx_1		

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

Добавлено: Пн июл 26, 2010 14:38:15
GP1
к нему идет pdf-ка, там есть описание алгоритма.

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

Добавлено: Пн июл 26, 2010 14:50:34
Pooher
Не моё, с какого-то форума:
;1.Сдвигать в лево
;2.Прибавлять 3 к каждой BCD тетраде которая >=5
;Повторять столько раз сколько бит в числе
;в последнем цикле прибавлять 3 не нужно !!!

;Пример 8 бит число: $F9 в BCD
результат исходное
;0000 0000 0000 : 1111 1001
;0000 0000 0001 : 1111 0010 (сдвиг в лево)
;0000 0000 0011 : 1110 0100 (сдвиг в лево)
;0000 0000 0111 : 1100 1000 (сдвиг в лево)
;0000 0000 1010 : 1100 1000 (add 3)
;0000 0001 0101 : 1001 0000 (сдвиг в лево)
;0000 0001 1000 : 1001 0000 (add 3)
;0000 0011 0001 : 0010 0000 (сдвиг в лево
;0000 0110 0010 : 0100 0000 (сдвиг в лево)
;0000 1001 0010 : 0100 0000 (add 3)
;0001 0010 0100 : 1000 0000 (сдвиг в лево)
;0010 0100 1001 : 0000 0000 (сдвиг в лево)

;В результате получим BCD 249.

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

Добавлено: Пн июл 26, 2010 15:00:38
Gudd-Head
Хитро... А почему именно 3 прибавляется и именно где >=5?
Сдвиг влево равносилен умножению на 2... Это, типа, перенос старшего разряда? :)

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

Добавлено: Пн июл 26, 2010 21:36:43
SII
Gudd-Head писал(а):Сдвиг влево равносилен умножению на 2... Это, типа, перенос старшего разряда? :)
Как в привычной нам десятичной системе быстро умножить на 10 число, например, 123? Просто дописать справа нуль: 1230. То же самое и в двоичной, только там умножение будет не на 10, а на 2 (на то она и двоичная): 111 (7) => 1110 (14).

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

Добавлено: Вт июл 27, 2010 12:41:00
Gudd-Head
SII писал(а):там умножение будет не на 10, а на 2 (на то она и двоичная): 111 (7) => 1110 (14).
Нолик приписать равнозначно умножению на два это понятно, а почему прибавлять именно 3?..

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

Добавлено: Вт июл 27, 2010 14:17:19
SII
Тонкости оптимизации :) Вообще при десятичной коррекции двоичных операций используется константа 6 (в BCD каждая десятичная цифра занимает одну тетраду, однако используется лишь 10 из возможных 16 значений, разница и прибавляется), ну а здесь, возможно, комбинируется прибавление 3 и сдвиг влево, т.е. умножение на 2. Ну а детально разбираться в такую жару... нет уж, увольте :)

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

Добавлено: Вт июл 27, 2010 15:00:18
Gudd-Head
SII писал(а):здесь, возможно, комбинируется прибавление 3 и сдвиг влево, т.е. умножение на 2. Ну а детально разбираться в такую жару... нет уж, увольте :)
Конечно, большого смысла разбираться "почему именно так" нет. Но всё равно, спасибо за предположения :)

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

Добавлено: Ср июл 28, 2010 01:25:50
day0l
у меня в .dseg хранятся два байта которые мне необходимо выводить на индикатор и причём смещение хочеться задавать с помощью регистра, и вот при использовании регистра у меня вылазит в аврстудии ошибка: "error: syntax error, unexpected REGDEF" вот код

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

.def minL  = R18

.dseg
	num: .byte 2 ; эти байты потом загруженны
.cseg
   lds temp, num+minL; и вот из-за этой строчки ошибка

как можно выйти из данной ситуации?

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

Добавлено: Ср июл 28, 2010 07:21:27
ARV
ваша ошибка в том, что вы не изучили систему команд достаточно скрупулезно: невозможно обращаться к памяти так, как вы пытаетесь! для обращения "со смещением" - косвенная относительная адресация - надо использовать команды LD R, X; LD R, X+; LD R,+X или аналоги для регистров Y и Z, причем для последних как раз имеется случай, возможно, удобный для вас: LD R, Y + offs (правда, константа offs не может превышать 63).

надеюсь, вы разберетесь, как решать вашу проблему

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

Добавлено: Ср июл 28, 2010 09:38:17
Gudd-Head
ARV писал(а):LD R,+X
По всей видимости, имелось в виду LD R,-X

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

Добавлено: Ср июл 28, 2010 10:13:25
ARV
Gudd-Head писал(а):По всей видимости, имелось в виду LD R,-X
имелось :) когда за окном сплошной плюс, о минусах как-то только мечты...

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

Добавлено: Ср июл 28, 2010 10:45:18
Gudd-Head
ARV писал(а):когда за окном сплошной плюс, о минусах как-то только мечты...
Это так что ли? http://www.prevedmedved.ru/uploads/post ... 80_000.jpg
Ну и чтобы не сочли за оффтоп, спрошу: когда внешнее прерывание сконфигурировано от НИЗКОГО уровня (насколько я понял, только так (помимо TWI) можно пробудить МК из Power Down), флаг прерывания не выставляется при появлении "0", а сразу осуществляется переход по вектору прерывания?

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

Добавлено: Ср июл 28, 2010 12:53:06
DX168B
Вот код, который у меня успэшно используется. Читает массив из EEPROM и переносит его в
SRAM (ОЗУ) Такой изврат не работает в Attiny2313, но работает в ATtiny26L

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

;---------------------------------------------- Чтение из EEPROM (Инициализация)
INIT:
ldi           ZH,               High(memory)
ldi           ZL,               Low(memory)
ldi           count,            0
INIT1:
out           EEAR,             count
sbi           EECR,             EERE
in            temp0,            EEDR
st            Z+,               temp0
inc           count
cpi           count,            45
brmi          INIT1
sei
ret
Вот чтение из ПЗУ. Это модуль опроса клавиатуры собранной на микросхеме К155ИД3
либо на К155КП1

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

;---------------------------------------------- Модуль извлечения нажатой кнопки клавиатуры
KEYREQ:
ldi           ZL,               Low(ARRKEY*2)  ;Определение массива
ldi           ZH,               High(ARRKEY*2)
ldi           count1,           0
KEYLOOP:
cpi           count1,           17             ;Счётчик циклов чтения из массива.
brpl          KEYEND
lpm           temp0,            Z
andi          temp0,            0x0F
cpi           status,           0xFF
brne          KEYRQ
ldi           temp1,            (1<<PA4)       ;В случае открытого замка
add           temp0,            temp1
KEYRQ:
out           PortA,            temp0
andi          temp0,            0x0F
inc           count1
inc           ZL
sbic          PinB,             6
rjmp          KEYLP
rcall         DELAY0
rjmp          KEYLOOP
KEYLP:
rcall         DELAY1
sbis          PinB,             6
rjmp          KEYLOOP
rcall         BEEP
KEYLP1:
sbic          PinB,             6              ;Ожидание отпускания кнопки и возврат значения нажатой кнопки
rjmp          KEYLP1
ret
KEYEND:
ldi           temp0,            0xFF           ;Возврат значения 0xFF если не нажата ни одна из кнопок
ret
;---------------------------------------------- Массив таблицы истинности К155ИД3 \ К155КП1
ARRKEY:
.db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0
.db 0,0

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

Добавлено: Ср июл 28, 2010 18:04:59
day0l
спасибо за ответ! буду разбираться...