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

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск

Сообщение Леонид Иванович »

Мikа писал(а):я хочу для себя понять, чем таким отличается STS от out?
Чтобы не путаться, можно сделать макросы, которые будут сами подставлять in/lds или out/sts там, где нужно:

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

.macro input
  .if @1 < 0x40
	in	@0, @1
  .else
  	lds	@0, @1
  .endif
.endm

.macro output
  .if @0 < 0x40
	out	@0, @1
  .else
  	sts	@0, @1
  .endif
.endm
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

КотЭ Мужчина писал(а):у меня китаянский USBASP, то с нима работает тока ProgISP
У меня с нима работает AVRDUDEPROG.
Docendo discimus
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Ср июн 20, 2012 10:49:46
Откуда: Україна, Черкаська область

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

ТАк как у меня мк пашет без внешнего кварца, то частота стандартная - 1 МГц. Ждал пол часа, думал может мигнет - нифига. Посмотрите, я ж выложил исходник задержки, именно эту хрень я и заливал в мк. Пробовал совместить из AVRDUDEPROG - нет, китаец за 6$ понимает тока ProgISP. Но надеюсь программатор тут ни при чем. Например в Си я постоянно задаю #define F_CPU 1000000UL, то работает. А блин асмовые чмошники...Кстати, не работают те проги, у которых нету задержек - если прото на биты регистра кинуть единички, штоб светы загорелись - все работает. Дальше мигалок я еще не лазил :-(
Betelgeuse
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Ср июн 20, 2012 10:49:46
Откуда: Україна, Черкаська область

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

исходник моей последней прошивки
.include "m8adef.inc"
.cseg
.org 0x00;
;===
Init:
ldi r16,0xFF;
out DDRB,r16;
out DDRC,r16;
;---------------------
Start:
sbi PortB,1;
sbi PortB,5;
rcall Delay;
cbi PortB,1;
cbi PortB,5;
rcall Delay;
rjmp Start;
;===
Delay:
ldi r17,0;
ldi r18,2;
ldi r19,2;
Loop:
dec r17
brne Loop
dec r18
brne Loop;
dec r19
brne Loop;
ret;
Betelgeuse
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

хм. А что ты хотел получить? твоя задержка даёт 4 милисекунды... как ты собирался увидеть мигание?
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

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

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

ibiza11 писал(а):У него стек не инициализирован.
ВО, уважаю, братишка!
Помогло, Спасиба!
Betelgeuse
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

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

+ это:

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

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

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

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

Сообщение Kavka »

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

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

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

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

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

Изображение

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

Сообщение Kavka »

СпойлерИзображение
Вложения
shifts.png
(1.7 КБ) 657 скачиваний
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист 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 порта можно просто расширить таблицу.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 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бит на асме поделитесь, что-то никаких мыслей умных в голову не приходит, а простым вычитанием не айс.
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

А в апнотах нету?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

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