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

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

В них часто складываются результаты арифметических операций, например умножения (MUL)
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ploop писал(а):В них часто складываются результаты арифметических операций, например умножения (MUL)
А ну вот это, точно уже, только в мегах. Их мне только предстоит пошшупать.....
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Про LPM в мегах тоже прикольное вот тут http://www.nikolaew.org/avr_old/u5.htm вычитал:

Аналогична LPM у classic, но усовершенствована - можно указать регистр результата (у classic был жестко определенный R0), кроме того, можно автоинкрементировать Z. По сути получаем три разные команды - LPM, LPM Rd,Z и LPM Rd,Z+
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да кроме MULа и нескольких других команд (типа CALL для мег с большим флешем) они ни чем особенно не отличаются.

про LPM
В ATtiny2313, например, LPM имеет такой же функционал. А вот AT90S2313 - сомневаюсь. По этому и говорят, что это разные МК, хотя код можно написать совместимым при желании.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ploop писал(а):В ATtiny2313, например, LPM имеет такой же функционал. А вот AT90S2313 - сомневаюсь. По этому и говорят, что это разные МК, хотя код можно написать совместимым при желании.
Насчет ATtiny2313 не знаю а вот у tiny26 счас проверил - нет такого функционала..... ошибочку компилятор выдает когда пишешь LPM R0,Z+
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

У 2313 точно есть, мало того, что помню, даже даташит под рукой

Изображение
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ploop писал(а):У 2313 точно есть, мало того, что помню, даже даташит под рукой
2313 - крутой однако (хотя tiny), а я вот на tiny26 хотел команду сэкономить, а он мне - фиг вам.....
Памяти 2048, уже занято 1900..... а еще надо кое чего впихнуть, вот и ловлю моменты, где чего поджать.....
http://asis-kbr.ru/forum/viewtopic.php?f=9&t=117
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

shads писал(а): вот и ловлю моменты, где чего поджать.....
У Вас есть

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

.def	Const00=r1
уберите все типа этого Запустить таймер в режиме Free и с его помощью формировать все задержки или используйте второй.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ILYAUL писал(а):У Вас есть

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

.def	Const00=r1
уберите все типа этого
Дык, если использовать Const00 для вычислений, то там соответственно будет менятся значение, что низя, т.к. эта константа используется во многих других местах, например для сравнения с 0 регистров нижней половины.

Если ее использовать для инициализации других регистров, типа LD A,Const00 то это то же самое что LDI A,0 т.е. смысла нет.

Или я не уловил суть вашего предложения.....
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ILYAUL писал(а):Запустить таймер в режиме Free и с его помощью формировать все задержки или используйте второй.
Ну отдельные процедуры коротких задержек там есть, например для формирования битов UART и битов 1Wire.

Остальные задержки как раз формируются благодаря прерыванию построенному на работе таймера с частотой 10000Hz (обработка сброса линии 1Wire, чтение байтов 1Wire).

В этом же прерывании организованы счетчики понижающие частоту до 200Hz (динамическая индикация), и 100Hz (клавиатура), причем в последних 2-х, прерывания разрешены, для возможности обработки ф-ций 1Wire.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Имеется ввиду последовательность ldi регистр,0 - out рег.в/в,регистр. Команда ldi не нужна, у вас уже есть регистр с нулем, вот его и выводите сразу в регистр в/в. Уже как минимум -3 кода в районе инициализации. Немного, но это могут быть те самые 3 слова, которых не хватит в конце проекта. И в начальной очистке RAM тоже можно использовать эту константу вместо регистра а.
Еще кусок:

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

...
		ldi		a,0x40				
		out 		timsk,a				;режим работы - прерывание по совпадению Т1 с A
		ldi		a,200				;200 f=10000 hz
...
		out		mcucr,a				;сработка внешнего прерывания по падающему фронту
;		ldi		a,0x40				
;		out		gimsk,a				;внешнее прерывание от INT0 (PB1)	
...
Тоже можно оптимизировать, перетащить или ldi-out timsk вниз, или out gimsk вверх, чтобы 2 раза не загружать в а 0x40.
Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Уже ответили
shads писал(а):В этом же прерывании организованы счетчики понижающие частоту до 200Hz (динамическая индикация), и 100Hz (клавиатура), причем в последних 2-х, прерывания разрешены, для возможности обработки ф-ций 1Wire.
Ну и запустите второй на 100Гц - и считайте прерывания.

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

	                 ldd	a,y+sDispDevNum
		add		a,a
		add		a,a
		add		a,a
		add		zl,a
Два последних сложения а с а может всё таки с учётом переноса должны быть?
Последний раз редактировалось ILYAUL Пт май 25, 2012 11:10:32, всего редактировалось 1 раз.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Тэкссс..... Учтем.....
Engineer_Keen писал(а):Имеется ввиду последовательность ldi регистр,0 - out рег.в/в,регистр. Команда ldi не нужна, у вас уже есть регистр с нулем, вот его и выводите сразу в регистр в/в.
Тут конечно можно использовать Const00, но правда это настройка портов, и это был промежуточный вариант программы, поэтому на том этапе не нужны были еденички..... Ну если в итоге так и останется, тоди съэкономлю.
Engineer_Keen писал(а):И в начальной очистке RAM тоже можно использовать эту константу вместо регистра а.
Дык до очистки я просто не был уверен, что там 0, вдруг там чтото еще, поэтому не стал использ Const00, а уже после очистки, использую..... Или после сброса контроллера в регистрах 0? и нет смысла еще раз очищать?
Engineer_Keen писал(а):Тоже можно оптимизировать, перетащить или ldi-out timsk вниз, или out gimsk вверх, чтобы 2 раза не загружать в а 0x40.
Учту, тоже постепенно значения записывал по ходу вникая в даташиты, даже не заметил что там одинаковые значения.
Engineer_Keen писал(а):Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Класс..... Сразу чуйствуется кто собаку съел, на поиске дополнительного байта.....
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Engineer_Keen писал(а):Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Тоже утащил сееб в копилку знаний :))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

shads писал(а):Насчет ATtiny2313 не знаю а вот у tiny26 счас проверил - нет такого функционала..... ошибочку компилятор выдает когда пишешь LPM R0,Z+
tiny26 не поддерживает постинкремент совместно с инструкцией LPM.
Приходилось решать это дело таким макаром:

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

lpm r16, Z
adiw Z, 0x01
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ILYAUL писал(а):Два последних сложения а с а может всё таки с учётом переноса должны быть?
Да не, там нормально. В tiny26, SRAM размером 128 байт, поэтому вычисляемый адрес тоже не может быть больше 127, соотв-но и переноса не может возникнуть.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

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

inc		zl
inc		zl
= subi Zl,-2
Из 2 подпрограмм на запись и чтение EEPROM - сделайте только 2 для обоих случаев - b можно назначать не в теле подпрограммы а перед входом в нее т.е 1 - запишите байт , b=40 - 40 байтов
Последний раз редактировалось ILYAUL Пт май 25, 2012 11:40:22, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Тоже давно пользуюсь таким приёмом. Вот точная задержка на 1 мкс для 1-wire (выполняется, разумеется, с отключенными прерываниями)

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

delay1us:                                                                   
;          +3                     
  nop      ;1                  
  push r0  ;2                                                                  
  pop r0   ;2              
  push r0  ;2               рассчитано ДЛЯ 20МГц!!!!!!
  pop r0   ;2               
  push r0  ;2              
  pop r0   ;2              
  ret      ;4               = 20 тактов (1 микросекунда)
Друг Кота
Аватара пользователя
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

ploop писал(а):Вот точная задержка на 1 мкс для 1-wire
Не компактней ли сделать счётчик?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Да код был под другие кварцы, например для 8МГц - там это эффективней. Не стал переделывать, со счётчиком мозг напрягать надо на переходах :)
Точнее не эффективней, там просто один nop останется. Вот на 16 - еще пару push-pop можно.
Ответить

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