Ассемблер (ASM) для AVR в вопросах и ответах
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Регистры X,Y,Z 16-битные. Большинство операций с использованием этих регистровых пар имеют возможность автоинкремента. Проблем быть не должно при последовательной обработке данных.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Для обработки массивов в ОЗУ используются регистры базового адреса Zh:Zl, Yh:Yl, Xh:Xl.
Как и каким образом их модифицировать - на вкус программиста.
Можно также использовать индекс -указателем и указатель стека ... но ... ежли на данный момент запрещены прерывания и ограничено использование подпрограмм.
Как и каким образом их модифицировать - на вкус программиста.
Можно также использовать индекс -указателем и указатель стека ... но ... ежли на данный момент запрещены прерывания и ограничено использование подпрограмм.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я хочу скопировать массив в ОЗУ
первая цифра массива - колво байт для копирования
в 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-
что не так?
первая цифра массива - колво байт для копирования
в 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 в вопросах и ответах
симулятор выдает странное предупреждение
Ничего странного - вы залезли в область РВВ.
casus писал(а):в X адрес выставляется 0x00C0
хотя озу 0x0200
Так выставите вручную, если не можете нормально через определения.
Код: Выделить всё
ldi yh,high(ram*2)
ldi yl,low(ram*2)Зачем на 2 умножать? В ОЗУ побайтная адресация.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
В ручную все работает, но как мне компилятор заставить это делать?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если
"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

"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

Последний раз редактировалось BOB51 Вт дек 18, 2012 18:38:42, всего редактировалось 1 раз.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
хотя озу 0x0200
Не могли бы вы пояснить что вы имели в виду (откуда эти числа)?
BOB51 писал(а):то первым байтом массива будет не 0х09 а 0х10 ! (см. описание директивы .DB )
Тогда уж не 0х10, а 0х0А это во-первых, а во-вторых, уважаемый, вы, кажется, путаете .DB c .BYTE
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
У топикстартера стояло 0x10
чего касательно .DB - так сие есть истина...
зато там же существует вторая директива "пословной" упаковки - .DW 
чего касательно .DB - так сие есть истина...
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
У ТС стояло 9 (число элементов массива), а затем и сам массив, первый член которого - 0х10 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот и получится в ПЗУ в ячейке с именем Array
0x0910, а не ожидаемое 0x1009
Да и вобщем .DB "ещё та" директивка
0x0910, а не ожидаемое 0x1009
Да и вобщем .DB "ещё та" директивка
Последний раз редактировалось BOB51 Вт дек 18, 2012 19:06:19, всего редактировалось 1 раз.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
BOB51 писал(а):0x0910, а не ожидаемое 0x1009
Не могу ничего сказать - надо гонять, а сейчас лень. В любом случае, у ТС проблемы с другим указателем
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Для работы с рисунками анимации частенько с массивами сталкиваться приходится, чего только не нацарапаеш 

Re: Ассемблер (ASM) для AVR в вопросах и ответах
пытаюсь оформить таблицу прерываний tiny2313a через .org ,а avr studio
ругается, говорит error: Overlap in .cseg: addr=0xd conflicts with 0xc:0xe
пока не добавил прерывание по Timer1_compB все было нормально.
Подскажите пжлст где ошибка. Вот этот кусок
ругается, говорит 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 в вопросах и ответах
teist писал(а):Подскажите пжлст где ошибка.
Код: Выделить всё
.org 0xC
rjmp Timer1_compB
reti
.org 0xDВы в 1 ячейку 2 команды пытаетесь запихнуть.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Не в одну а в соседние, вектор прерывания(у вас) занимает две ячейки, а вы пытаетесь во вторую ячейку предыдущего прерывания запихнуть следующее.
Вообще, лучше всего кусок с прерываниями скопировать из даташита и неиспользуемые заменить на RETI или NOP чтобы не поломать адресацию.
Кстати в таблице векторов после RJMP не надо ставить RETI - это надо делать в теле обработчика прерывания. После команды RJMP ничто и никогда не будет и не может быть выполнено! (не считая других переходов).
Вообще, лучше всего кусок с прерываниями скопировать из даташита и неиспользуемые заменить на RETI или NOP чтобы не поломать адресацию.
Кстати в таблице векторов после RJMP не надо ставить RETI - это надо делать в теле обработчика прерывания. После команды RJMP ничто и никогда не будет и не может быть выполнено! (не считая других переходов).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ничего выдумывать не надо -
открой диск, на котором размещена студио (в примере С и используется AvrAssembler2) :
C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes
там найди *def.inc файл соответствующкго мк, а в нем описание всех векторов прерываний.

открой диск, на котором размещена студио (в примере С и используется AvrAssembler2) :
C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes
там найди *def.inc файл соответствующкго мк, а в нем описание всех векторов прерываний.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
BOB51 писал(а):там найди *def.inc файл соответствующкго мк, а в нем описание всех векторов прерываний.
Я так и сделал но как раз против этого прерывания там пробел в комментах, может
это студия такая?
Собсно если сделать таблицу без .org то все проходит, и если не брать прерывание
T1_compB тоже все нормально с .org Cтудию я старую с инета взял 4.19 730
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
.ORG 0 Только один в начале таблицы прерываний. На каждый вектор - одна команда перехода или RETI если не используется. Что еще нужно?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
мк у меня tn2313а , а прерывание T1 compA дает секундные импульсы для часов.
Прерыванием T1_compB хочу сделать мигающую точку на часах, и разобраться с
.org тоже хочется. Сначала было так
все работает, добавляю еще прерывание , точку сделать задумал
и не работает. А то что я там reti добавлял ... это потом пытался запустить
и еще вопрос : в студии у меня нормальные комменты а тут крякозябры какие то?
Прерыванием 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 добавлял ... это потом пытался запустить
и еще вопрос : в студии у меня нормальные комменты а тут крякозябры какие то?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Путал-путал... Мняа...
С моего глаза как-то так:
Да и не забывать про соответствующие настройки таймера и режимов сравнения...
P.S. Советую для написания исходников обзавестись бесплатным редактором DPAD дабы избавиться от "кракозябр" и необходимости всегда открывать студио!
...
... а авторский сайт с редактором пропал ...
...
Ладушки, ежли будет интересно, скину свою копию инсталятора DPAD и русифицированную справку по работе с ассемблером на e-mail ...
С моего глаза как-то так:
Да и не забывать про соответствующие настройки таймера и режимов сравнения...
P.S. Советую для написания исходников обзавестись бесплатным редактором DPAD дабы избавиться от "кракозябр" и необходимости всегда открывать студио!
...
...Ладушки, ежли будет интересно, скину свою копию инсталятора DPAD и русифицированную справку по работе с ассемблером на e-mail ...
