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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 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
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 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 КБ) 311 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 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
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 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
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 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
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 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
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 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
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

ARV писал(а):LD R,+X

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20091
Зарегистрирован: Чт сен 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»