Ассемблер (ASM) для AVR в вопросах и ответах
В них часто складываются результаты арифметических операций, например умножения (MUL)
- Реклама
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
А ну вот это, точно уже, только в мегах. Их мне только предстоит пошшупать.....ploop писал(а):В них часто складываются результаты арифметических операций, например умножения (MUL)
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Про LPM в мегах тоже прикольное вот тут http://www.nikolaew.org/avr_old/u5.htm вычитал:
Аналогична LPM у classic, но усовершенствована - можно указать регистр результата (у classic был жестко определенный R0), кроме того, можно автоинкрементировать Z. По сути получаем три разные команды - LPM, LPM Rd,Z и LPM Rd,Z+
Аналогична LPM у classic, но усовершенствована - можно указать регистр результата (у classic был жестко определенный R0), кроме того, можно автоинкрементировать Z. По сути получаем три разные команды - LPM, LPM Rd,Z и LPM Rd,Z+
Да кроме MULа и нескольких других команд (типа CALL для мег с большим флешем) они ни чем особенно не отличаются.
про LPM
В ATtiny2313, например, LPM имеет такой же функционал. А вот AT90S2313 - сомневаюсь. По этому и говорят, что это разные МК, хотя код можно написать совместимым при желании.
про LPM
В ATtiny2313, например, LPM имеет такой же функционал. А вот AT90S2313 - сомневаюсь. По этому и говорят, что это разные МК, хотя код можно написать совместимым при желании.
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Насчет ATtiny2313 не знаю а вот у tiny26 счас проверил - нет такого функционала..... ошибочку компилятор выдает когда пишешь LPM R0,Z+ploop писал(а):В ATtiny2313, например, LPM имеет такой же функционал. А вот AT90S2313 - сомневаюсь. По этому и говорят, что это разные МК, хотя код можно написать совместимым при желании.
- Реклама
У 2313 точно есть, мало того, что помню, даже даташит под рукой


- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
2313 - крутой однако (хотя tiny), а я вот на tiny26 хотел команду сэкономить, а он мне - фиг вам.....ploop писал(а):У 2313 точно есть, мало того, что помню, даже даташит под рукой
Памяти 2048, уже занято 1900..... а еще надо кое чего впихнуть, вот и ловлю моменты, где чего поджать.....
http://asis-kbr.ru/forum/viewtopic.php?f=9&t=117
У Вас естьshads писал(а): вот и ловлю моменты, где чего поджать.....
Код: Выделить всё
.def Const00=r1Код: Выделить всё
ldi a,0- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Дык, если использовать Const00 для вычислений, то там соответственно будет менятся значение, что низя, т.к. эта константа используется во многих других местах, например для сравнения с 0 регистров нижней половины.ILYAUL писал(а):У Вас естьуберите все типа этогоКод: Выделить всё
.def Const00=r1Код: Выделить всё
ldi a,0
Если ее использовать для инициализации других регистров, типа LD A,Const00 то это то же самое что LDI A,0 т.е. смысла нет.
Или я не уловил суть вашего предложения.....
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Ну отдельные процедуры коротких задержек там есть, например для формирования битов UART и битов 1Wire.ILYAUL писал(а):Запустить таймер в режиме Free и с его помощью формировать все задержки или используйте второй.
Остальные задержки как раз формируются благодаря прерыванию построенному на работе таймера с частотой 10000Hz (обработка сброса линии 1Wire, чтение байтов 1Wire).
В этом же прерывании организованы счетчики понижающие частоту до 200Hz (динамическая индикация), и 100Hz (клавиатура), причем в последних 2-х, прерывания разрешены, для возможности обработки ф-ций 1Wire.
Имеется ввиду последовательность ldi регистр,0 - out рег.в/в,регистр. Команда ldi не нужна, у вас уже есть регистр с нулем, вот его и выводите сразу в регистр в/в. Уже как минимум -3 кода в районе инициализации. Немного, но это могут быть те самые 3 слова, которых не хватит в конце проекта. И в начальной очистке RAM тоже можно использовать эту константу вместо регистра а.
Еще кусок:
Тоже можно оптимизировать, перетащить или ldi-out timsk вниз, или out gimsk вверх, чтобы 2 раза не загружать в а 0x40.
Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Еще кусок:
Код: Выделить всё
...
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)
...
Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Уже ответили
Два последних сложения а с а может всё таки с учётом переноса должны быть?
Ну и запустите второй на 100Гц - и считайте прерывания.shads писал(а):В этом же прерывании организованы счетчики понижающие частоту до 200Hz (динамическая индикация), и 100Hz (клавиатура), причем в последних 2-х, прерывания разрешены, для возможности обработки ф-ций 1Wire.
Код: Выделить всё
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
Тэкссс..... Учтем.....
Тут конечно можно использовать Const00, но правда это настройка портов, и это был промежуточный вариант программы, поэтому на том этапе не нужны были еденички..... Ну если в итоге так и останется, тоди съэкономлю.Engineer_Keen писал(а):Имеется ввиду последовательность ldi регистр,0 - out рег.в/в,регистр. Команда ldi не нужна, у вас уже есть регистр с нулем, вот его и выводите сразу в регистр в/в.
Дык до очистки я просто не был уверен, что там 0, вдруг там чтото еще, поэтому не стал использ Const00, а уже после очистки, использую..... Или после сброса контроллера в регистрах 0? и нет смысла еще раз очищать?Engineer_Keen писал(а):И в начальной очистке RAM тоже можно использовать эту константу вместо регистра а.
Учту, тоже постепенно значения записывал по ходу вникая в даташиты, даже не заметил что там одинаковые значения.Engineer_Keen писал(а):Тоже можно оптимизировать, перетащить или ldi-out timsk вниз, или out gimsk вверх, чтобы 2 раза не загружать в а 0x40.
Класс..... Сразу чуйствуется кто собаку съел, на поиске дополнительного байта.....Engineer_Keen писал(а):Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Тоже утащил сееб в копилку знанийEngineer_Keen писал(а):Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
tiny26 не поддерживает постинкремент совместно с инструкцией LPM.shads писал(а):Насчет ATtiny2313 не знаю а вот у tiny26 счас проверил - нет такого функционала..... ошибочку компилятор выдает когда пишешь LPM R0,Z+
Приходилось решать это дело таким макаром:
Код: Выделить всё
lpm r16, Z
adiw Z, 0x01
I am DX168B and this is my favourite forum on internet!
- Сообщения: 882
- Зарегистрирован: Ср фев 22, 2012 01:25:21
Да не, там нормально. В tiny26, SRAM размером 128 байт, поэтому вычисляемый адрес тоже не может быть больше 127, соотв-но и переноса не может возникнуть.ILYAUL писал(а):Два последних сложения а с а может всё таки с учётом переноса должны быть?
Код: Выделить всё
inc zl
inc zlИз 2 подпрограмм на запись и чтение EEPROM - сделайте только 2 для обоих случаев - b можно назначать не в теле подпрограммы а перед входом в нее т.е 1 - запишите байт , b=40 - 40 байтов
Последний раз редактировалось ILYAUL Пт май 25, 2012 11:40:22, всего редактировалось 1 раз.
Тоже давно пользуюсь таким приёмом. Вот точная задержка на 1 мкс для 1-wire (выполняется, разумеется, с отключенными прерываниями)Кусок из 4х нопов заменяется на push-pop любого регистра. Экономия 2х слов за счет стека.
Код: Выделить всё
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 микросекунда)
Не компактней ли сделать счётчик?ploop писал(а):Вот точная задержка на 1 мкс для 1-wire
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Да код был под другие кварцы, например для 8МГц - там это эффективней. Не стал переделывать, со счётчиком мозг напрягать надо на переходах 
Точнее не эффективней, там просто один nop останется. Вот на 16 - еще пару push-pop можно.
Точнее не эффективней, там просто один nop останется. Вот на 16 - еще пару push-pop можно.


