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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

GP1 писал(а):Дано:
Студия 4.18 SP2 b.700
Камень?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение 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
I am DX168B and this is my favourite forum on internet!
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Сорри, склероз.
мк - tiny24
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

GP1 писал(а):мк - tiny24
Не знаю, у меня всё работает (Студия 4.18 b.700). Ищите косяк в тексте проги.
Изображение
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Дело не в проге, переустановил студию и все заработало, что за глюк так и не понял :dont_know:

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

это просто полный ппц, :shock: :shock: :shock: , "кто виноват? и что делать?" :shock: :shock: :shock: :dont_know:
Вложения
t24.JPG
а не работает
(156.29 КБ) 313 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение 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		
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

к нему идет pdf-ка, там есть описание алгоритма.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

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

Сообщение 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.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Хитро... А почему именно 3 прибавляется и именно где >=5?
Сдвиг влево равносилен умножению на 2... Это, типа, перенос старшего разряда? :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

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

Сообщение SII »

Gudd-Head писал(а):Сдвиг влево равносилен умножению на 2... Это, типа, перенос старшего разряда? :)
Как в привычной нам десятичной системе быстро умножить на 10 число, например, 123? Просто дописать справа нуль: 1230. То же самое и в двоичной, только там умножение будет не на 10, а на 2 (на то она и двоичная): 111 (7) => 1110 (14).
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

SII писал(а):там умножение будет не на 10, а на 2 (на то она и двоичная): 111 (7) => 1110 (14).
Нолик приписать равнозначно умножению на два это понятно, а почему прибавлять именно 3?..
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

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

Сообщение SII »

Тонкости оптимизации :) Вообще при десятичной коррекции двоичных операций используется константа 6 (в BCD каждая десятичная цифра занимает одну тетраду, однако используется лишь 10 из возможных 16 значений, разница и прибавляется), ну а здесь, возможно, комбинируется прибавление 3 и сдвиг влево, т.е. умножение на 2. Ну а детально разбираться в такую жару... нет уж, увольте :)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

SII писал(а):здесь, возможно, комбинируется прибавление 3 и сдвиг влево, т.е. умножение на 2. Ну а детально разбираться в такую жару... нет уж, увольте :)
Конечно, большого смысла разбираться "почему именно так" нет. Но всё равно, спасибо за предположения :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
day0l
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт май 14, 2010 15:48:35

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

Сообщение day0l »

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

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

.def minL  = R18

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

как можно выйти из данной ситуации?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

надеюсь, вы разберетесь, как решать вашу проблему
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

ARV писал(а):LD R,+X
По всей видимости, имелось в виду LD R,-X
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Gudd-Head писал(а):По всей видимости, имелось в виду LD R,-X
имелось :) когда за окном сплошной плюс, о минусах как-то только мечты...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

ARV писал(а):когда за окном сплошной плюс, о минусах как-то только мечты...
Это так что ли? http://www.prevedmedved.ru/uploads/post ... 80_000.jpg
Ну и чтобы не сочли за оффтоп, спрошу: когда внешнее прерывание сконфигурировано от НИЗКОГО уровня (насколько я понял, только так (помимо TWI) можно пробудить МК из Power Down), флаг прерывания не выставляется при появлении "0", а сразу осуществляется переход по вектору прерывания?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение 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
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
day0l
Открыл глаза
Сообщения: 44
Зарегистрирован: Пт май 14, 2010 15:48:35

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

Сообщение day0l »

спасибо за ответ! буду разбираться...
Ответить

Вернуться в «AVR»