Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт май 25, 2012 08:27:01
В них часто складываются результаты арифметических операций, например умножения (MUL)
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
А ну вот это, точно уже, только в мегах. Их мне только предстоит пошшупать.....ploop писал(а):В них часто складываются результаты арифметических операций, например умножения (MUL)
Насчет ATtiny2313 не знаю а вот у tiny26 счас проверил - нет такого функционала..... ошибочку компилятор выдает когда пишешь LPM R0,Z+ploop писал(а):В ATtiny2313, например, LPM имеет такой же функционал. А вот AT90S2313 - сомневаюсь. По этому и говорят, что это разные МК, хотя код можно написать совместимым при желании.

2313 - крутой однако (хотя tiny), а я вот на tiny26 хотел команду сэкономить, а он мне - фиг вам.....ploop писал(а):У 2313 точно есть, мало того, что помню, даже даташит под рукой
У Вас естьshads писал(а): вот и ловлю моменты, где чего поджать.....
Код: Выделить всё
.def Const00=r1Код: Выделить всё
ldi a,0Дык, если использовать Const00 для вычислений, то там соответственно будет менятся значение, что низя, т.к. эта константа используется во многих других местах, например для сравнения с 0 регистров нижней половины.ILYAUL писал(а):У Вас естьуберите все типа этогоКод: Выделить всё
.def Const00=r1Код: Выделить всё
ldi a,0
Ну отдельные процедуры коротких задержек там есть, например для формирования битов UART и битов 1Wire.ILYAUL писал(а):Запустить таймер в режиме Free и с его помощью формировать все задержки или используйте второй.
Код: Выделить всё
...
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)
...
Ну и запустите второй на 100Гц - и считайте прерывания.shads писал(а):В этом же прерывании организованы счетчики понижающие частоту до 200Hz (динамическая индикация), и 100Hz (клавиатура), причем в последних 2-х, прерывания разрешены, для возможности обработки ф-ций 1Wire.
Код: Выделить всё
ldd a,y+sDispDevNum
add a,a
add a,a
add a,a
add zl,aТут конечно можно использовать 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
Да не, там нормально. В tiny26, SRAM размером 128 байт, поэтому вычисляемый адрес тоже не может быть больше 127, соотв-но и переноса не может возникнуть.ILYAUL писал(а):Два последних сложения а с а может всё таки с учётом переноса должны быть?
Код: Выделить всё
inc zl
inc zlТоже давно пользуюсь таким приёмом. Вот точная задержка на 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