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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4964
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

Engineer_Keen писал(а):Смотря какие
Ну вот и здорово! Что и желал узнать! :beer:
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт май 27, 2011 10:46:45

Сообщение rnd.gen »

Дорогие "Коты". Поделитесь пожалуйста тем, кто как формирует задержки в асме при подключении lcd (wh0802a). А то без этого не хочет запускаться индикатор. И как правильно их рассчитывать?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

на асме задержки делают тупыми циклами:

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

          DELAY:DEC R16 ;(1 такт * количество проходов)
          BRNE DELAY      ;(2 такта по количеству проходов-1 + еще один такт)
          RET                   ;(4 такта)
вызов:

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

          LDI R16,100 (100 - задержка в условных единицах (количество проходов цикла)
          RCALL DELAY
Если задержка нужна длиннее, вставляют вложенные циклы.
Величина задержки считается по количеству тактов (1 такт = 1/Fclk).
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Или через прерывания по времени, тиками.
Docendo discimus
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пт май 27, 2011 10:46:45

Сообщение rnd.gen »

Вот, надыбал еще инфу если кому интересно:
http://cxem.net/mc/mc89.php
И таймеры как-то жалко использовать, так как они будут для другой цели включены :(.
Наверное придется подключать к ноге вывод RW и читать бит готовности BF что опять таки не удобно :(.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Верно, таймерами через прерывания очень удобно, особенно если нужно много различных программных таймеров и задержек с кратными интервалами. Но это немного сложнее для новичков, нужно настраивать таймер, писать процедуру прерывания и как-то организовывать задание интервалов (если задержка одна, то просто настройкой OCR, а если много, то это кучка счетчиков и флагов состояния в памяти).

По ссылке тоже таймер используется, но тупо как счетчик, без прерываний, так конечно тоже можно, но не интересно...
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Почему с таймерами ,таймер один на все задержки - FREE TIMER
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ну я и имел ввиду один, просто выразился более общей фразой...
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

любой код операции занимает 4 бита ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

спасибо...., но мне не понятно почему код операции имеет разную длину ?
с чем это связано ?
допустим, если мы имеем в системе команд AVR всего 64 разные операции....., то для их кодирования нам понадобится всего 6 бит
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

И десять останется для параметров? А этого хватит?
Для разных операций нужны разные параметры. Сами посудите: для копирования регистров (MOV) нужно 2 адреса по 5 бит, остается 6 бит на сам код, а для загрузки константы (LDI) нужно 4 бита (верхние R16-R31) и 8 бит константы - для кода остается 4 бита, и т.д.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Engineer_Keen, насколько я в курсе то инструкция может заниматьне не только одно но и два слова
и если наши 64 операции ми кодируем 6 битами то в случае нехватки мы можем использовать 2 слова
или я в чем-то заблуждаюсь ?
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

FreshMan писал(а):мы можем использовать 2 слова
Можем конечно, например CALL/JMP, но вот в чем беда 2х словные команды занимают больше памяти и считываются в 2 раза дольше. Не знаю как это кратко объяснить, может чем-то поможет эта статья... Смысл в том, чтобы максимум команд, которые используются чаще всего закодировать минимумом бит (в данном случае 16-ю или 32-я). Так вот, если для решения того, будет ли команды 16 или 32 разрядная, использовать 1 бит, то для всех возможных сочетаний команд и операторов остается 15 бит, 32768, вроде много, но если посмотреть все коды операций AVR станет понятно что это предел, сюда не поместились даже так необходимые на первый взгляд операции с константой для младших регистров. Но зато они все выполняются за 1 такт (не считая умножения и переходов) и занимают одно слово, а для редко используемых CALL/JMP не жалко и 2 слов.
Для одной только LDI R15,XX пришлось бы задействовать 256 кодов, если пихать ее в однословные команды.
Можно было запихнуть в 2-словные команды не 2 а 4 команды, но большого толку от этого не было бы, а увеличение таких команд в 2 раза 1) уменьшает адресное пространство CALL/JMP в 2 раза 1) делает эти команды в 2 раза медленнее и длиннее. Вы готовы ради универсальности команд заплатить быстродействием в 2 раза?
Чтобы определить сколько команд должно быть 2х словными достаточно статистически посчитать количество используемых команд в программах и построить дерево кодирования Хаффмана, предполагаю что пути до команд CALL/JMP были самые длинные, а остальные гораздо короче, поэтому их оставили 2-словными.
Ну и не стоит забывать тот факт, что в младших AVR-ках 2-словных команд вообще нет!

FreshMan, вы лезите в глубокие дебри процессорной архитектуры, я понимаю что это интересно, но чтобы ответить приходится писать посты на пол-страницы. Если так интересно, лучше найдите какой-нибудь ресурс по устройству микропроцессорных систем.
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

Engineer_Keen писал(а):Если так интересно, лучше найдите какой-нибудь ресурс по устройству микропроцессорных систем.
Вот ядро AVR в исходниках http://opencores.org/project,avr_core Глубже копать уже не куда :)
Все будет только лучше, в крайнем случае - хуже.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

FreshMan, если не знакомы, то ознакомьтесь с материалами дающими представление о ключевых идеях CISC и RISC архитектур процессоров. Если знакомы, то перечитайте и подумайте. Надеюсь, что вопросы отпадут сами собой...
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

coredumped писал(а):Вот ядро AVR в исходниках http://opencores.org/project,avr_core Глубже копать уже не куда :)
Данный путь мною указан уже был однажды... :)))
Ну кстати не факт что эти именно то, что находится внутри AVRок, просто идентичная функциональность, ведь способов сделать одно и тоже разными методами множество :)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Engineer_Keen писал(а):FreshMan, вы лезите в глубокие дебри процессорной архитектуры,
прошу прощения что ткнул свой нос куда не следует........, осознаю что моего багажа знаний еще не достаточно дабы поднимать подобные вопросы :oops:
с вашего разрешения задам вопросы по проще
1) где бы посмотреть принципиальную схему ядра AVR ? а то в даташитах только структурная :)
2)разрядность МК определяется разрядностью его шиной данных или АЛУ ?
3)почему нету единого стандарта в языке ассемблер ? к примеру, мне приходилось смотреть прогу написанную на асме для контроллера фирмы сименс ......, так там L - это аналог LDI, а Т - это аналог OUT
почему все это дело не стандартизировано......, чтобы LDI был и в Африке LDI :))
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

FreshMan писал(а):прошу прощения что ткнул свой нос куда не следует........, осознаю что моего багажа знаний еще не достаточно дабы поднимать подобные вопросы :oops:
Уж лучше совать нос в контроллер, чем например, в бутылку с водкой :wink:
FreshMan писал(а):1) где бы посмотреть принципиальную схему ядра AVR ? а то в даташитах только структурная :)
Так вам производитель ее и открыл, ага :))) Можете как уже сказано выше залезть на OPENCores, и скачать оттуда проект для ПЛИС, но вам придется немного освоить Quartus (или другую среду для разработки систем на ПЛИС)
FreshMan писал(а):2)разрядность МК определяется разрядностью его шиной данных или АЛУ ?
Вроде обычно эти размерности одинаковые...
FreshMan писал(а):3)почему нету единого стандарта в языке ассемблер ? к примеру, мне приходилось смотреть прогу написанную на асме для контроллера фирмы сименс ......, так там L - это аналог LDI, а Т - это аналог OUT
почему все это дело не стандартизировано......, чтобы LDI был и в Африке LDI :))
Потому мы говорим по русски, а англичане по английски, так получилось исторически, ну и просто особенности ассемблеров такие, что иногда бывает удобнее команду обозвать по своему.
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Engineer_Keen писал(а):Так вам производитель ее и открыл, ага
а че боятся то ? если технология, схема, запатентована то пускай выложат ее на всеобщее обозрение....., пущай народ полюбуется....., а может они боятся того что разузнаю что и атмел не чиста наруку и скопипастила свою схему ? :))
короче выходит что там все шито, крыто :tea:
1) у нас МК 8 разрядный, а длина машинного слова равна 2 байтам......, получается какая то неувязочка....., вы тут постом выше говорили о быстродейсьтвии....., так вот выходит чтоб достичь максимальной быстродействии надо чтобы длина машинного слова соответствовала разрядности МК, тогда за один такт МК будет полностью все переваривать...., у атмела в этом плане маленькое несоответствие......., странно как то :roll:
Engineer_Keen писал(а):Потому мы говорим по русски, а англичане по английски, так получилось исторически, ну и просто особенности ассемблеров такие, что иногда бывает удобнее команду обозвать по своему.
зачем же тогда человечество придумало всевозможные стандарты когда их не придерживаются ?
выходит если я завтра создам контору под названием рога да копыта которая будет штамповвать МК под названием кошачий хвост......., мы напишем свой компилятор....., перековеркаем название команд из асма, но их функцию оставим, то это все-равно будет асм только в ином виде........, зачем тогда стандарты то и что тогда понимать под ассемблером ? :dont_know:
Tell Me The Truth
Ответить

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