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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

ARV писал(а):ваш опыт не может сдвинуть линию общего тренда...
Больная мозоль. В среднем, из всех проектов, которыми я руководил или архитектурой которых занимался, только в половине удается добиться написания оптимизированного кода до окончания ОПЭ, а не только после того как, у клиента объем обрабатываемых данных вырастет на несколько порядков и он начнет писать возмущенные письма.
И это при том, что проекты большие, некоторые длились годами и все были вокруг баз даных объемом до нескольких терабайт.
Но "линию общего тренда" при этом, как Вы правильно заметили, сдвинуть не удается. Копроэкономика... (
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
CB1
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт янв 01, 2015 13:44:12

Сообщение CB1 »

Доброго времени суток! По не многу начинаю изучать ассемблер для AVR. Написал небольшую программу счетчика. Сама программа компилируется, а когда пытаюсь запустить программу в Proteus, то он начинает ругаться. Подскажите в чем тут может быть дело? Проект в архиве.
Вложения
2. Семисегментный индикатор и кнопки(счетчик).rar
(79.22 КБ) 176 скачиваний
Все гениальное - просто
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Тут кто хош заругается. Используете ret, а стек не инициализирован. А каким образом она считать должна? Кнопки не работают. Тут всё не так. :shock:
И ещё. Вам комментарии не нужны? Ведь через день забудете что наваяли
Я всё-всё узнAю и стану профессором.
CB1
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт янв 01, 2015 13:44:12

Сообщение CB1 »

Считать она должна нажатия на кнопки (при нажатии на кнопку PD4 - должен счетчик увеличиваться, а при нажатии на кнопку PD7 - уменьшаться). Если кнопки отбросить и сделать счетчик без кнопок, то все работает, происходит возвращение по команде ret.
Проблема в данной части кода

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

        cpi R17,0
	breq Nol
        ..............
        cpi R17, 9
	breq Devyat
если я ее закомментирую, то все работает.
Все гениальное - просто
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Да вы хотя бы поменяли rjmp pause на rcall, и стек инициализируйте!!!
Может и заработает тогда что-то, и то, только в протеусе. В железе это не заработает
никогда(вы о дребезге слыхали?). Менять ВСЁ начиная с алгоритма.
Я всё-всё узнAю и стану профессором.
Реклама
CB1
Прорезались зубы
Сообщения: 232
Зарегистрирован: Чт янв 01, 2015 13:44:12

Сообщение CB1 »

Дребезг контактов я учел и добавил паузу в метках (понятное дело что это самый простой метод, но я только начинаю изучать ассемблер).
Все гениальное - просто
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Ну бляяяу!!! Да почитайте, наконец, Ревича:
" Практическое программирование МК Atmel AVR на языке ассемблера "
Или ссылку еще дать?
Я всё-всё узнAю и стану профессором.
Грызет канифоль
Сообщения: 264
Зарегистрирован: Сб июл 30, 2011 21:00:24

Сообщение AQ29 »

ptr128 писал(а): Не эффективно, это когда "овчинка выделки не стоит".
То есть, когда трудозатраты на ассемблерное кодирование оказались больше, чем экономический эффект от них.
То есть эффективно - это верно выбранный баланс между тем, какой код проекта следовало писать на ЯВУ, а какой на ассемблере.
Что вы понимаете под ассемблерным кодированием?
Писать на классическом ассемблере сложно, трудно, давно на нём не пишу, на мой взгляд, это сейчас анахронизм.
На макроассемблере писать просто и в тоже время можно быстро «опуститься» на ассемблерный уровень.
Практически,весь текст на макроассемблере представляет собой макрокоманды, вызов подпрограмм (функций, процедур) и т.д. В этом плане говорил, что он приближён к ЯВУ.
Пример функции уже приводил — логарифм, вызвав которую сразу получаете более 1 КБ. Это, кстати, не самый большой библиотечный элемент.
ARV писал(а): на сегодняшний день вопрос прироста производительности не стоит вообще, т.к. быстродействие даже микроконтроллеров AVR достигла такого уровня, что задумываться о быстродействии практически не приходится. если же взять мир 32-битных и тем паче 64-битных контроллеров, то там и подавно. про PC вообще молчу.
«задумываться о быстродействии практически не приходится»
Сомнительное утверждение. Электронщику часто приходится сталкиваться с быстродействием.
То импульсы нужны микросекундные, то в быстрой следящей системе нужно успеть рассчитать управляющий сигнал, то нужно провести скоростные измерения в быстротекущем процессе.
Большей частью с помощью ассемблера и АВР эти задачи легко решаются, зачем применять более сложные и дорогие решения.
Благодаря РОН АВР довольно быстро работает. Только, на мой взгляд, в простых микроконтроллерах явно не хватает аппаратного умножения 2 на 2 байта. По цене, наверно, это стоить копейки, а существенно ускорит расчёты.
dimmer писал(а):Во-первых не нужно извращать мои слова. Я нигде не писал, что 8 - 16 Кб это порог для ассемблера. Дословно было:"Я думаю, что если в будущем понадобится писать что-то больше 8 - 16Кбайт, то одним ассемблером наверно не обойдусь."
Имел в виду, что как будет подходящая возможность, то хочется попробовать что-то другое (скорее всего С++).
Во-вторых, если коротко по поводу остального, что Вы написали - это по ту сторону Добра и Зла.
Не собирался извращать ваши слова.

«по ту сторону Добра и Зла» - это, вроде как, что-то из большой философии. А программирование на макроассемблере — при некотором навыке это обыденно и просто.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

AQ29 писал(а):
ptr128 писал(а): То есть, когда трудозатраты на ассемблерное кодирование оказались больше, чем экономический эффект от них.
Что вы понимаете под ассемблерным кодированием?
Писать на классическом ассемблере сложно, трудно, давно на нём не пишу, на мой взгляд, это сейчас анахронизм.
На макроассемблере писать просто
Я не знаю, что Вы называете "классическим ассемблером", так как когда я впервые начал писать на ассемблере 8080 в 1984 году, то использовал для этого макроассемблер IBM/370 в режиме кросс-компиляции. То есть каждой машинной команде 8080 соответсвовал свой макрос.
С тех пор ни разу, ни для какой платформы мне не макроассемблеры не попадались.
Даже тупой ассемблер на Синклере для Z80 был макроассемблером.
Исходя из того, что макроассемблер IBM/370 был аннонсирован, и широко использовался для кросс-компиляции, за год до выпуска первого микропроцессора 4004 (1970 vs 1971), я даже не представляю, где и на каких платформах Вы откопали "классический ассемблер", не являющимся макроассемблером.

Другое дело, что на макроассемблере я давно не пишу. За ненадобностью. Механизма ассемблерных вставок в C мне хватает с головой. Не так уж часто необходимо высчитывать такты каждой команды и экономить наносекунды.
Так что под ассемлерным кодированием я подразумеваю, в первую очередь, оператор asm языка C.
AQ29 писал(а): он приближён к ЯВУ.
Категорически не согласен. Код на языке высокого уровня всегда можно написать кроссплатформенным. Код на ассемблере - никогда.
Код на ЯВУ может быть автоматизировано проанализирован на предмет надежности и безопасности. Для ассемблера я таких анализаторов не встречал.

Именно потребность в надежном и кросcплатформенном коде и привела к тому, что в рамках промышленного производства ПО для МК все большее количество производителей приходят к стандартам MISRA.
IMHO, если планируете профессионально программировать МК, то учите С, а макроассемблеры оставьте в покое. Даже несмотря на то, что использование asm в С требует несколько большей писанины, чем написание модуля на макроассемблере. В итоге, оно окупается сторицей на всех этапах жизненного цикла ПО. Привыкните. Как я, например, уже физически не могу написать даже простейший код без включения его в систему контроля версий. Рефлекс однако )
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

А как конвертится число, лежащее в двух регистрах в 4-х значное десятичное (0000, с разложением в 4 регистра)? Тут катит только способ последовательного приближения через "10" или бывают "умные конверты" "в два счёта"?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Что-то я не могу создать локальную метку в макросе. И что-то не гуглится правильный синтаксис метки. (gnu preprocessing assembler )
Приму любую помощь по созданию локальных меток в макросе, лучше деньгами :).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Серый_ писал(а):А как конвертится число, лежащее в двух регистрах в 4-х значное десятичное (0000, с разложением в 4 регистра)? Тут катит только способ последовательного приближения через "10" или бывают "умные конверты" "в два счёта"?
Пока самое лучшее, что применяю. Легко адаптируется.
hex40_bcd13.asm
(2.55 КБ) 379 скачиваний
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Z_h_e писал(а):Что-то я не могу создать локальную метку в макросе.
Вот что нагуглил, вроде оно. Сейчас попробую разобраться.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Серый_ писал(а):бывают "умные конверты" "в два счёта"?
http://www.avr-asm-tutorial.net/avr_en/ ... ml#bin2asc

Еще есть красивый вариант, но на С. Впрочем, перевести его на ассемблер, при желании, не сложно.
https://bugs.debian.org/cgi-bin/bugrepo ... bug=627899

P.S. А что, религия запрещает пользоваться C? Или родной GCC ассемблер чем-то не устраивает при кодировании ассемблерных вставок в С?
Последний раз редактировалось ptr128 Ср ноя 23, 2016 11:14:15, всего редактировалось 2 раза.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Z_h_e писал(а):Вот что нагуглил, вроде оно. Сейчас попробую разобраться.
Да, получилось с циферными метками.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

ptr128 писал(а):P.S. А что, религия запрещает пользоваться C?...
Офф: Никогда не юзал и не понимаю. В своё время посмотрел на засилие скобок, и уже на этом косвенном основании - оценил язык как неадекватный для восприятия. :) Фундаменталистика чем-то интересней и для малых проектов катит.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

В этой теме не OFF, а самое то. :)
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Серый_ писал(а):
ptr128 писал(а):P.S. А что, религия запрещает пользоваться C?...
Офф: Никогда не юзал и не понимаю.
А как же MISRA, категорически запрещающая использовать ассемблер для МК, кроме как в виде ассемблерных вставок на С?
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Опытный кот
Аватара пользователя
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Сообщение Серый_ »

Да не, это уже офф, ребят... :)
ptr128 писал(а):А как же MISRA, категорически запрещающая...
1) запрещает только тот, кто в состоянии запрещать
2) MISRA возможно недопонимает, что благодаря "американскому праву", её могут обязать
отписать все свои особняки - мне (и вам часть :)))), если во вставках на C обнаружится хоть немного "сифы"
3) были даже целые запрещающие эпохи, которые... дозапрещались! :)))
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

Серый_ писал(а):Да не, это уже офф, ребят... :)
С чего бы это? Ассемблерные вставки обрабатываются GNU AVR Assembler. С каких пор он стал оффтопиком здесь?
Серый_ писал(а): 1) запрещает только тот, кто в состоянии запрещать
В состоянии. Ни один из производителей не получит сертификат MISRA, если его исходные тексты не пройдут автоматизированный контроль надежности кода MISRA. Изначально, членами MISRA были только крупнейшие автопроизводители, сейчас это уже совсем не так.
"В настоящее время стандарты MISRA используются не только в автомобильной индустрии, но также и в аэрокосмической, телекоммуникационной, разработке медицинских устройств, военных проектах, и других". Будет у Вас заказчик серьезный - потребует сертификации MISRA. И никуда Вы не денетесь.

Значит все же есть какие-то причины, почему ассемблер запрещают использовать вне ассемблерных вставок C?
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Ответить

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