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

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Привет, Коты, такое дело :) Понадобилось мне в байте добавлять и убавлять единицы. Это типа бйт статуса светодиодной шкалы, которая подсвечивается динамически.
Смысл такой:
Исходный байт 0b00000000
Жмём +, получаем 0b00000001
Жмём +, получаем 0b00000011
Жмём +, получаем 0b00000111
Жмём +, получаем 0b00001111
Жмём +, получаем 0b00011111
Жмём -, получаем 0b00001111
и т.п. Я сделал так:

+ это:

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

lsl RL ; Двигаем всё влево
inc RL; Заполняем появившийся младший ноль единицей
- это:

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

lsr RL ; Просто сдвиг вправо
Всё работает, вопрос в том, делают ли это как-то более изящно? :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Изящно можно на кнопки нажимать когда программу пишешь. :))
А вообще, нормально.

Если не забыл (неохота лезть в спецификацию), то можно ещё

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

sec
rol RL
А если перевернуть (единички с другой стороны пускать), то можно asr/lsl использовать.
Ну чуть короче. Изящнее ли? Не знаю. :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Изображение

Как при моём прошлом вопросе, в целом я понял, что будет, но в деталях - не уверен :D Я такие вопросы щас задаю, потому что я уже что-то научился делать сам, придумываю различные решения в зависимости от поставленных задач, но при этом боюсь начать "быдлокодить" :) Спасибо!
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

СпойлерИзображение
Вложения
shifts.png
(1.7 КБ) 641 скачивание
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Сообщение nirq »

Сферические кони благородны на бумаге.
А в реальной жизни плата будет разводиться "как удобнее программисту" или?

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

ldi ZH, high(Level_Table * 2)
ldi ZL, low(Levet_Table * 2)

lds Temp1, Level
add ZL, Temp1
brcc pc + 2
inc ZH

lpm Temp1, Z
out PORT, Temp1
, и это только если удалось развести все выходы в пределах одного и того же порта.
А при попытке переразвести новую версию платы придётся переписывать ещё и программу.

Площадь платы стоит денег.
Дополнительная площадь усугубляет массогабаритные проблемы.
Уменьшение ширины дорожек и/или зазоров между ними усугубляет технологические проблемы, то есть опять стоит денег (как минимум).
Лишний код - просто "другое" состояние тех же самых ячеек памяти.
Лишние микросекунды - а мы куда-то настолько сильно спешим?
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

А в реальной жизни плата будет разводиться "как удобнее программисту" или?
Это если программист и разводчик - одно лицо. ;)
Реклама
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Сообщение nirq »

Вот и посоветуйся с своим разводчиком. Только момент для беседы выбирай аккуратнее, чтоб у разводчика хорошее настроение было.
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

Со своими мозгами посоветуйся! А то ты с ними не дружишь! :evil:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Команды сдвига для этого алгоритма - довольно очевидны, но... в таком варианте есть проблемы. если что пойдет не так, то двигаться будет не столбик, а "жидкость с пузырьками", применение чувствительно к содержимому сдвигаемого столбика. Гораздо технологичней, воссоздавать столбик каждый раз когда это нужно при помощи подпрограммы - на входе число = высоте столбика, на выходе в регистре отрисованный столбик. Но и этот вариант обладает недостатком - применить можно только к жестко заданному порядку бит, а на реальных контроллерах один порт может быть разбросан по всем сторонам корпуса, и лови-разводи эти выводы в строгом порядке! Посему... проще, когда алгоритм подпрограммы строит столбик "побитно" - тупо, быстро но много памяти отъедает на тупой алгоритм. Поэтому, применяют более простое решение - столбик задается в виде таблицы, и извлекается из нее заранее прорисованное состояние столбика по индексу - и быстро, и гарантировано и памяти немного потребляет. При необходимости вывода столбика побитно раскинутого на 2-3 порта можно просто расширить таблицу.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

А не проще ли тогда сделать по-битный вывод "правильного" байта по разбросанным по портам битам? А то ещё и маску в таблицу надо запихивать и обрабатывать её как при формировании сдвига, так и при выводе в порты. Что будет не очень компактно, IMHO, в сравнении с простым распихиванием битов. Так как записью целого байта в порт у AVR нет возможности какие-то биты установить/сбросить, а остальные не затрагивать (инвертировать можно, но не на всех МК). Да, к тому же, и обработка маски сведётся к распихиванию битов в цикле (по одному циклу на порт). Тут уж надо выбирать исходя из потребностей - некая универсальность или компактность.
Остаётся, конечно, вариант read-modify-write, но применимость этого метода сильно зависит от задачи и прочих условий реализации.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

Сообщение zero648 »

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

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

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

Сообщение Engineer_Keen »

Есть - AVR200 Multiply and Divide Routines, кажется даже на gaw перевод был...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Engineer_Keen писал(а):Есть - AVR200 Multiply and Divide Routines
Оно максимум на 16 бит :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Вымогатель припоя
Аватара пользователя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Сообщение ИС-пытатель »

столбик реализуйте
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Ср июн 20, 2012 10:49:46
Откуда: Україна, Черкаська область

Сообщение КотЭ Мужчина »

Я прицепил к PortB 5 (он же SCK) светодиод, и без резика пустил его на землю. То чота плохо читался и записывался камень. Посадил через резистор - во, стало лучше.
Betelgeuse
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

КотЭ Мужчина писал(а):Я прицепил к PortB 5 (он же SCK) светодиод, и без резика пустил его на землю
Так нельзя, без ограничения тока светодиод быстро сдохнет, ну а другие следствия вы сами наблюдали...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

Сообщение Flash.#13 »

Здравствуйте! Нужна помощь с АЦП на атмега8. Согласно инструкции заполнил состояние регистров ADCSRA и ADMUX, дело пошло:

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

.org 14				;вектор прер. АЦП
rjmp adc_complete	;подпрограмма АЦП
...
ldi R16, 0b01000000	;AD_Converter ADMUX byte
out ADMUX, R16
ldi R16, 0b10001011	;AD_Converter ADCSRA byte, 125kHz
out ADCSRA, R16			
sei 			;вкл. прерывания в ЦП
...
rcall delay2s
sbi ADCSRA,6	;старт одиночного замера АЦП
...
adc_complete:
in R28, ADCL
...перевожу состояние стартового бита в "1", идет замер, и срабатывает прерывание по АЦП"счет окончен"(014), все нормально, вывожу данные на ЖК, но после первой порции от АЦП более данных не поступает. Цикл идет, АЦП делает переход по прерыванию, но "вместимое" регистров АЦП не изменяется сколько не кручу резистор(( АЦП дает новые данные, только если, откл. и вкл. питание, и они корректно меняются с положением резистора, а в цикле не хочет, пользовался этой инструкцией

Прилепил счетчик на adc_complete, он считает а вместимое меньшего регистра ADCL не меняется. Переключил в непрерывный замер АЦП(ADFR=1), счетчик замеров бежит, а ADCL все равно не меняется... Я уже не знаю чего делать... :cry:
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently,
if the result is left adjusted and no more than 8-bit precision is required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.
Прочтите ADCH после ADCL.
Docendo discimus
Контактная информация:
Ответить

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