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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Здравствуйте. Читал вот эту статью про МК,
и там есть такой фрагмент кода:

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

ReadArray:
          ldi ZH,High(MyArray*2) ;загрузка адреса 0-го   
          ldi ZL,Low(MyArray*2)  ;элемента в рег. пару Z

          ldi Temp1,0
          add ZL,Temp          ;прибавление
          adc ZH,Temp1         ;внутр. адреса

          lpm                  ;загрузка из ПЗУ

          mov Temp1,R0         ;копирование
          out PortB,Temp1      ;вывод в порт
          inc Temp             ;увелич. внутр. адреса
          rjmp ReadArray       ;в начало цикла

И возникли следующие вопросы:
1)Так и не понял, почему адрес массива нужно умножать на два. Не мог бы кто-нибудь объяснить понятнее?
2)Команда lpm. Насколько я понял, загруженные данные из ПЗУ попадают в регистр R0. Но как узнать, какие именно данные загрузятся?
3)

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

add ZL,Temp          ;прибавление
          adc ZH,Temp1         ;внутр. адреса

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

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

Сообщение Alexeyslav »

Вам надо внимательней читать даташит. Программная память контроллера представляет собой слова по 16 бит, LPM читает именно из нее. Компилятор дает адрес метки именно в СЛОВАХ, чтобы прочитать байт по указанному адресу, нужно адрес метки умножить на два. Ну и прибавить 1 при необходимости.
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

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

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

Сообщение Alexeyslav »

Каждая команда контроллера имеет разрядность 16 бит, когда выполняется программа ФЛЕШ-память адресуется словами - одна команда - одно слово в памяти. Счетчик команд считает слова, метки адресуются словами, но команда LPM получает доступ к флеш-памяти в ПОБАЙТНОМ режиме. Получается что метка с адресом 10 будет располагаться начиная с 20-го байта ФЛЕШ-памяти.

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

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

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

Alexeyslav писал(а):Каждая команда контроллера имеет разрядность 16 бит

Таки кратна 16-ти битам. Есть команды по 2 машинных слова.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

gauss писал(а):2)Команда lpm. Насколько я понял, загруженные данные из ПЗУ попадают в регистр R0.

Можно кстати явно указать другой регистр, тогда загрузится в него, а не в R0.
gauss писал(а):Но как узнать, какие именно данные загрузятся?

Что значит какие? Какие будут по адресу (ZH:ZL), те и загрузятся...
gauss писал(а):Для чего нужна команда adc, если r младшей части можно просто прибавить temp и получить нужный адрес?

А у если у вас во флеше допустим таблица размером более 256 байт, вы как к ней обращаться будете?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

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

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

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

Кто делал DDS (прямой цифровой синтез) 8 бит?
Интересуют скорости алгоритма / частота генерируемого сигнала.
У меня получается 12(13) тактов МК на один отсчёт при 1024-х байтной таблице сигнала.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Gudd-Head писал(а):Кто делал DDS (прямой цифровой синтез) 8 бит?

Леонид Иванович
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Engineer_Keen писал(а):Что значит какие? Какие будут по адресу (ZH:ZL), те и загрузятся...

А если задействованы ещё и другие регистровые пары?
:idea:
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Посмотрите описание команды LPM. В даташите. Она загружает содержимое ячейки, расположенной по адресу, который надо положить в ZH:ZL
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Gudd-Head писал(а):Кто делал DDS (прямой цифровой синтез) 8 бит?
Интересуют скорости алгоритма / частота генерируемого сигнала.
У меня получается 12(13) тактов МК на один отсчёт при 1024-х байтной таблице сигнала.

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

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

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

ILYAUL писал(а):Леонид Иванович

Знаем :)
zero648 писал(а):ШИМ, но тогда для одной дискреты тратится минимум 256 тактов.

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

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

Сообщение Alexeyslav »

При реализации DDS размер таблицы ни на скорость ни на максимальную частоту не влияют. Влияет только на качество сигнала до определенной частоты, начиная с нее будут начинаться пропуски значений таблицы - это допустимо для синусоиды, но в общем случае не допустимо при произвольном сигнале, иначе какие-то элементы начнут с ростом частоты исчезать.

Максимальная частота которую может сгенерировать программный DDS зависит исключительно от длительности выполнения одной итерации и само собой все итерации должны иметь одинаковую длительность. Можно даже сказать что максимальная частота будет равна 2/T, где T - длительность одной итерации. А для максимально качественного сигнала в твоем случае будет равна 1024/T - до этой частоты сохранятся все элементы сигнала сохраненные в таблице.

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

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

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

Alexeyslav писал(а):При реализации DDS размер таблицы ни на скорость ни на максимальную частоту не влияют.

Ну как же не влияют, вычислять 10-битный или 8-ми битный табличный адрес в 8-ми битном МК разница будет минимум в 1 такт, а то и больше.
Максимальная ... таблице.

Спасибо, не вчера родился. :)
Alexeyslav писал(а):Чисто для синусоиды, если выход 8-битный то достаточно таблицы на 256 значений.

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

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

Сообщение Alexeyslav »

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

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

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

Alexeyslav писал(а):Не будет разницы

Собственно, на этом мы с вами заканчиваем диалог.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Demon
Нашел транзистор. Понюхал.
Сообщения: 164
Зарегистрирован: Сб янв 20, 2007 20:44:33
Откуда: Из закаулков вашей души

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

Сообщение Demon »

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

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

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

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

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

Сообщение BOB51 »

в произвольном порядке через флаг Т
Ответить

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