Страница 158 из 400

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

Добавлено: Чт окт 11, 2012 20:55:24
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 и получить нужный адрес?
Заранее спасибо!

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

Добавлено: Чт окт 11, 2012 21:29:38
Alexeyslav
Вам надо внимательней читать даташит. Программная память контроллера представляет собой слова по 16 бит, LPM читает именно из нее. Компилятор дает адрес метки именно в СЛОВАХ, чтобы прочитать байт по указанному адресу, нужно адрес метки умножить на два. Ну и прибавить 1 при необходимости.

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

Добавлено: Чт окт 11, 2012 23:11:05
gauss
Alexeyslav, все что я понял - надо читать даташит. :cry:

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

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

А вообще даташит читать завсегда полезно, перед тем как начинаешь что-то делать.

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

Добавлено: Пт окт 12, 2012 08:55:06
Gudd-Head
Alexeyslav писал(а):Каждая команда контроллера имеет разрядность 16 бит
Таки кратна 16-ти битам. Есть команды по 2 машинных слова.

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

Добавлено: Пт окт 12, 2012 12:16:31
Engineer_Keen
gauss писал(а):2)Команда lpm. Насколько я понял, загруженные данные из ПЗУ попадают в регистр R0.
Можно кстати явно указать другой регистр, тогда загрузится в него, а не в R0.
gauss писал(а):Но как узнать, какие именно данные загрузятся?
Что значит какие? Какие будут по адресу (ZH:ZL), те и загрузятся...
gauss писал(а):Для чего нужна команда adc, если r младшей части можно просто прибавить temp и получить нужный адрес?
А у если у вас во флеше допустим таблица размером более 256 байт, вы как к ней обращаться будете?

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

Добавлено: Пт окт 12, 2012 14:36:19
ChipKiller
А у если у вас во флеше допустим таблица размером более 256 байт, вы как к ней обращаться будете?
... даже не обязательно больше, а просто пересекает 256 байтную отметку.

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

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

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

Добавлено: Пт окт 12, 2012 16:50:10
ILYAUL
Gudd-Head писал(а):Кто делал DDS (прямой цифровой синтез) 8 бит?
Леонид Иванович

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

Добавлено: Пт окт 12, 2012 19:05:05
gauss
Engineer_Keen писал(а): Что значит какие? Какие будут по адресу (ZH:ZL), те и загрузятся...
А если задействованы ещё и другие регистровые пары?

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

Добавлено: Пт окт 12, 2012 20:00:47
ploop
Посмотрите описание команды LPM. В даташите. Она загружает содержимое ячейки, расположенной по адресу, который надо положить в ZH:ZL

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

Добавлено: Сб окт 13, 2012 11:45:56
zero648
Gudd-Head писал(а):Кто делал DDS (прямой цифровой синтез) 8 бит?
Интересуют скорости алгоритма / частота генерируемого сигнала.
У меня получается 12(13) тактов МК на один отсчёт при 1024-х байтной таблице сигнала.
Если я правильно понимаю, один отсчет - это одна дискрета сигнала или типа того, я пробовал использовать ШИМ, но тогда для одной дискреты тратится минимум 256 тактов.

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

Добавлено: Сб окт 13, 2012 16:57:52
Gudd-Head
ILYAUL писал(а):Леонид Иванович
Знаем :)
zero648 писал(а):ШИМ, но тогда для одной дискреты тратится минимум 256 тактов.
Втопку ШИМ, он слишком медленный.

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

Добавлено: Сб окт 13, 2012 17:53:26
Alexeyslav
При реализации DDS размер таблицы ни на скорость ни на максимальную частоту не влияют. Влияет только на качество сигнала до определенной частоты, начиная с нее будут начинаться пропуски значений таблицы - это допустимо для синусоиды, но в общем случае не допустимо при произвольном сигнале, иначе какие-то элементы начнут с ростом частоты исчезать.

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

Чисто для синусоиды, если выход 8-битный то достаточно таблицы на 256 значений. 1024 - больше подойдет для 10-12 битного ЦАП.

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

Добавлено: Сб окт 13, 2012 18:07:06
Gudd-Head
Alexeyslav писал(а):При реализации DDS размер таблицы ни на скорость ни на максимальную частоту не влияют.
Ну как же не влияют, вычислять 10-битный или 8-ми битный табличный адрес в 8-ми битном МК разница будет минимум в 1 такт, а то и больше.
Максимальная ... таблице.
Спасибо, не вчера родился. :)
Alexeyslav писал(а):Чисто для синусоиды, если выход 8-битный то достаточно таблицы на 256 значений.
И да, и нет. Смотря как реализовать.

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

Добавлено: Сб окт 13, 2012 18:41:28
Alexeyslav
Не будет разницы, потому что один фиг с таблицей работать при помощи индексного регистра, даже если она будет размером в 16 ячеек.

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

Добавлено: Сб окт 13, 2012 19:58:04
Gudd-Head
Alexeyslav писал(а):Не будет разницы
Собственно, на этом мы с вами заканчиваем диалог.

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

Добавлено: Пн окт 15, 2012 11:15:39
Demon
Подскажите как можно зеркально поменять биты в байты т.е 1й бит меняется с 8м, 2й с 7м,3й с 6м и 4й с 5м?

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

Добавлено: Пн окт 15, 2012 11:18:04
Gudd-Head
Через перенос со сдвигом влево/вправо.

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

Добавлено: Пн окт 15, 2012 15:55:28
BOB51
в произвольном порядке через флаг Т