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

Обсуждаем контроллеры компании Atmel.
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Регистры X,Y,Z 16-битные. Большинство операций с использованием этих регистровых пар имеют возможность автоинкремента. Проблем быть не должно при последовательной обработке данных.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Для обработки массивов в ОЗУ используются регистры базового адреса Zh:Zl, Yh:Yl, Xh:Xl.
Как и каким образом их модифицировать - на вкус программиста.
Можно также использовать индекс -указателем и указатель стека ... но ... ежли на данный момент запрещены прерывания и ограничено использование подпрограмм.
casus
Родился
Сообщения: 13
Зарегистрирован: Вс дек 16, 2012 01:53:53
Откуда: Новый Уренгой

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

Сообщение casus »

Я хочу скопировать массив в ОЗУ
первая цифра массива - колво байт для копирования
в lbuf должно быть количество скопированных байт в озу, в X адрес 0-го байта
правильно ли я делаю?

у меня симулятор выдает странное предупреждение:
[PC = $0086, Time = 16.86 ms, {PER}]: USART: Parity selection bits combination UPM1=0, UPM0=1, reserved
на строчке st y+, r17

в X адрес выставляется 0x00C0
хотя озу 0x0200-
что не так?

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

.def lbuf = r24
.dseg
RAM:   .byte 256

..........

   clr lbuf
   ldi yh,high(ram*2)               
   ldi yl,low(ram*2)
   mov xl,yl                     
   mov xh,yh

   ldi zh,High(Array*2)   
   ldi zl,Low(Array*2)
   lpm r16, Z+
initcps:
   cp r16,lbuf
   breq initcpe
   lpm r17,Z+
   st Y+, r17
   inc lbuf
   rjmp initcps
initcpe:
ret

Array:
.db 9,0x10,0x24,0x15,0x11,0x2F,0x98,0xC7,0x03,0xA5
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

симулятор выдает странное предупреждение

Ничего странного - вы залезли в область РВВ.
casus писал(а):в X адрес выставляется 0x00C0
хотя озу 0x0200

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

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

   ldi yh,high(ram*2)               
   ldi yl,low(ram*2)

Зачем на 2 умножать? В ОЗУ побайтная адресация.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
casus
Родился
Сообщения: 13
Зарегистрирован: Вс дек 16, 2012 01:53:53
Откуда: Новый Уренгой

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

Сообщение casus »

В ручную все работает, но как мне компилятор заставить это делать?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Если
"Array:
.db 9,0x10,0x24,0x15,0x11,0x2F,0x98,0xC7,0x03,0xA5"
то первым байтом массива будет не 0х09 а 0х10 ! (см. описание директивы .DB )

тестовый фрагмент лучше проработать автономно (без совместного с использованием USART участка)

у ram (если не используется внешний кристалл ) адресация без сдвига влево (прямой адрес в указателе) в отличии от ПЗУ программ - там требуется такое смещение... да и размещение того " ram " неведомо - ведь существуют также предопределенные имена и в подключаемом *def.ini файле...
самый удобный вариант:
.dseg
.org SRAM_START
и далее чего надобно (только если под конкретный МК с применением *def.ini)

" mov xl,yl
mov xh,yh " = movw xl,yl
:tea:
Последний раз редактировалось BOB51 Вт дек 18, 2012 18:38:42, всего редактировалось 1 раз.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

хотя озу 0x0200

Не могли бы вы пояснить что вы имели в виду (откуда эти числа)?
BOB51 писал(а):то первым байтом массива будет не 0х09 а 0х10 ! (см. описание директивы .DB )

Тогда уж не 0х10, а 0х0А это во-первых, а во-вторых, уважаемый, вы, кажется, путаете .DB c .BYTE :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

У топикстартера стояло 0x10 :)
чего касательно .DB - так сие есть истина... :cry: зато там же существует вторая директива "пословной" упаковки - .DW 8)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

У ТС стояло 9 (число элементов массива), а затем и сам массив, первый член которого - 0х10 :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Вот и получится в ПЗУ в ячейке с именем Array
0x0910, а не ожидаемое 0x1009 8)
Да и вобщем .DB "ещё та" директивка :wink:
Последний раз редактировалось BOB51 Вт дек 18, 2012 19:06:19, всего редактировалось 1 раз.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

BOB51 писал(а):0x0910, а не ожидаемое 0x1009 8)

Не могу ничего сказать - надо гонять, а сейчас лень. В любом случае, у ТС проблемы с другим указателем :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Для работы с рисунками анимации частенько с массивами сталкиваться приходится, чего только не нацарапаеш :beer:
Аватара пользователя
teist
Открыл глаза
Сообщения: 61
Зарегистрирован: Пт янв 01, 2010 20:43:32
Откуда: cccp

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

Сообщение teist »

пытаюсь оформить таблицу прерываний tiny2313a через .org ,а avr studio
ругается, говорит error: Overlap in .cseg: addr=0xd conflicts with 0xc:0xe
пока не добавил прерывание по Timer1_compB все было нормально.
Подскажите пжлст где ошибка. Вот этот кусок
;---------- Òàáëèöà ïðåðûâàíèé ----------
.org 0x000
rjmp reset
.org 0x4
rjmp Timer1_compA
reti
.org 0xC
rjmp Timer1_compB
reti
.org 0xD
rjmp Timer0_compA
reti
.org 0x15
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

teist писал(а):Подскажите пжлст где ошибка.

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

.org 0xC
 rjmp Timer1_compB
reti
.org 0xD

Вы в 1 ячейку 2 команды пытаетесь запихнуть.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

Не в одну а в соседние, вектор прерывания(у вас) занимает две ячейки, а вы пытаетесь во вторую ячейку предыдущего прерывания запихнуть следующее.

Вообще, лучше всего кусок с прерываниями скопировать из даташита и неиспользуемые заменить на RETI или NOP чтобы не поломать адресацию.
Кстати в таблице векторов после RJMP не надо ставить RETI - это надо делать в теле обработчика прерывания. После команды RJMP ничто и никогда не будет и не может быть выполнено! (не считая других переходов).
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Ничего выдумывать не надо -
открой диск, на котором размещена студио (в примере С и используется AvrAssembler2) :
C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes
там найди *def.inc файл соответствующкго мк, а в нем описание всех векторов прерываний.
:beer:
Аватара пользователя
teist
Открыл глаза
Сообщения: 61
Зарегистрирован: Пт янв 01, 2010 20:43:32
Откуда: cccp

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

Сообщение teist »

BOB51 писал(а):там найди *def.inc файл соответствующкго мк, а в нем описание всех векторов прерываний.
:beer:

Я так и сделал но как раз против этого прерывания там пробел в комментах, может
это студия такая? :roll:
Собсно если сделать таблицу без .org то все проходит, и если не брать прерывание
T1_compB тоже все нормально с .org Cтудию я старую с инета взял 4.19 730
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

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

Сообщение Alexeyslav »

.ORG 0 Только один в начале таблицы прерываний. На каждый вектор - одна команда перехода или RETI если не используется. Что еще нужно?
Аватара пользователя
teist
Открыл глаза
Сообщения: 61
Зарегистрирован: Пт янв 01, 2010 20:43:32
Откуда: cccp

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

Сообщение teist »

мк у меня tn2313а , а прерывание T1 compA дает секундные импульсы для часов.
Прерыванием T1_compB хочу сделать мигающую точку на часах, и разобраться с
.org тоже хочется. Сначала было так
;---------- Òàáëèöà ïðåðûâàíèé ----------
.org 0x000
rjmp reset ;ñáðîñ
.org 0x4
rjmp Timer1_compA ;ñîâïàäåíèå Ò1 êàíàë À èñòî÷íèê ñåêóíä
.org 0xD
rjmp Timer0_compA ;ñîâïàäåíèå êàíàë À Ò0 äèíàìè÷åñêàÿ èíäèêàöèÿ


все работает, добавляю еще прерывание , точку сделать задумал
;---------- Òàáëèöà ïðåðûâàíèé ----------
.org 0x000
rjmp reset ;ñáðîñ
.org 0x4
rjmp Timer1_compA ;ñîâïàäåíèå Ò1 êàíàë À èñòî÷íèê ñåêóíä

.org 0xC
rjmp Timer1_compB ;ìèãàþùàÿ (.) íà òàáëî ÷àñîâ
.org 0xD
rjmp Timer0_compA ;ñîâïàäåíèå êàíàë À Ò0 äèíàìè÷åñêàÿ èíäèêàöèÿ

и не работает. А то что я там reti добавлял ... это потом пытался запустить
и еще вопрос : в студии у меня нормальные комменты а тут крякозябры какие то?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Путал-путал... Мняа...
С моего глаза как-то так:
teist_miau.txt
(4.31 КБ) 229 скачиваний

Да и не забывать про соответствующие настройки таймера и режимов сравнения...
8)
P.S. Советую для написания исходников обзавестись бесплатным редактором DPAD дабы избавиться от "кракозябр" и необходимости всегда открывать студио!
... :shock: ... а авторский сайт с редактором пропал ... :dont_know: ...
Ладушки, ежли будет интересно, скину свою копию инсталятора DPAD и русифицированную справку по работе с ассемблером на e-mail ... :beer:
Ответить

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