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

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

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

Сообщение ploop »

ChipKiller
Да можно, знаю.
Ладно, хватит спорить, чей кун-фу круче :)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Gudd-Head, не видел вашего поста. Теперь мой пост перед вашим:
К примеру использовать еще один регистр - уберутся условные переходы при инвертировании битов, ну и т.д.

Так что я намеренно использовал один регистр. Знал ведь - заклюёте :)))
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

.. ни каких споров - просто qmix занимается, мягко говоря, ерундой ИМХО.
ChipKiller писал(а):ЗЫ. Вообще следует различать, когда "выгодно" применять "рассыпуху" и ПЛМ, а когда МК и не путать одно с другим.
даже на "рассыпухе" это легко решаемо и будет работать в 100 раз быстрее, чем на МК, зачем заморачиваться ????
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Согласен, сам ему говорил, что в реальном проекте это бессмысленная затея. Но часто бывает, что человеку нужен просто кусок кода, чтоб натолкнуть на мысль. Если наши куски ему помогут - я только рад буду.
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

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

Сообщение qmix »

ploop Спасибо большое за код с пояснениями, буду разбираться.
Gudd-Head Тоже спасибо, не оставлю и ваш код без внимания.
ChipKiller Без пол литры с табличным методом мне пока точно не разобраться, но все равно спасибо.
ChipKiller писал(а):.. ни каких споров - просто qmix занимается, мягко говоря, ерундой ИМХО.
ChipKiller писал(а):ЗЫ. Вообще следует различать, когда "выгодно" применять "рассыпуху" и ПЛМ, а когда МК и не путать одно с другим.
даже на "рассыпухе" это легко решаемо и будет работать в 100 раз быстрее, чем на МК, зачем заморачиваться ????
Согласен, что ерундой, но для меня смысл не в том, чтобы работало быстро или то, что на рассыпухе это проще. Я просто хочу научится....
ploop Куски еще как помогают.

p.s. Ушел курить инфу про ATF16v8 и WinCupl, и как можно решить эту задачу несколькими строками.
Всем спасибо, вернусь с новыми вопросами.
matrix has you/
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

ChipKiller писал(а): ... тогда простая таблица на 256 значений
Насколько я понимаю, топик стартеру было интересно, чтобы данные лог. функции вычислил сам МК, а не дядя на бумажке с тупой (простите, механической) набивкой в таблицу. Или я что-то не так понял?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

IM1 писал(а):Или я что-то не так понял?

Зачем же ограничиваться одним вариантом? Хорошо бы показать все способы.
Ну и поскольку у нас всего 4 входа, то в таблице будет всего 16 значений, которые можно засунуть в два байта (т.к. выход однобитный).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

Gudd-Head писал(а):Ну и поскольку у нас всего 4 входа, то в таблице будет всего 16 значений, которые можно засунуть в два байта (т.к. выход однобитный).
Засунуть то можем, а вот рассунуть! Боюсь, что проще сделать нормальную табличку (без идиотских ijmp и ret) с 16 байтами, чем писать миллион условий и сдвигов для упакованного результата. Да и время выполнения получится одинаковое для всех комбинаций, что есть хорошо :) .
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

IM1 писал(а):проще сделать нормальную табличку (без идиотских ijmp и ret) с 16 байтами

А если входов будет... 8? Тогда таблица будет уже 256 байт. А это 12,5% памяти 2313 :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

Gudd-Head писал(а):А если входов будет... 8? Тогда таблица будет уже 256 байт. А это 12,5% памяти 2313 :)
Ну тогда два варианта:
1. если выход 1 бит, однозначно мудрить, все таки уменьшение занятости памяти в 8 раз 256/8=32 (12,5/8=1,56%)
2. если выход >1 бит, то думать, а если байт, то однозначно 256 к исполнению.
Аватара пользователя
qmix
Родился
Сообщения: 16
Зарегистрирован: Ср фев 16, 2011 09:01:31
Откуда: Туапсе

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

Сообщение qmix »

Кажись начинаю догонять, что такое табличный метод.. Это значит задаем массивом все возможные состояния входа, в процессе, сравнивается имеющееся значение с заданной таблицей, и в соответствии с ней выводится результат. Поправьте если неправильно.
matrix has you/
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

qmix писал(а):в процессе, сравнивается имеющееся значение с заданной таблицей, и в соответствии с ней выводится результат. Поправьте если неправильно.

Не сравнивается, а так или иначе состояние входа указывает на адрес в таблице, где хранится результат.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Roman Venom
Сверлит текстолит когтями
Сообщения: 1135
Зарегистрирован: Сб июл 11, 2009 18:42:21
Откуда: Украина, г.Николаев

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

Сообщение Roman Venom »

qmix
Нагуглите что значит косвенная адресация и всё станет ясно :)
Успех - императив!
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

qmix писал(а):Кажись начинаю догонять, что такое табличный метод..
Вот Вам кусочек кода на примере знакогенератора, все очень просто.

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

;*********конвертация данных************
; вход in_dat, выход out_dat
conv:
ldi    zh,high(tab1*2)
ldi    zl,low(tab1*2)
add    zl, in_dat
brcc   conv1
inc    zh
conv1:
lpm    out_dat, z
ret
;*******end конвертация данных***********

; таблица кодировки символов
tab1:
.db 0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0 ; 0-7
.db 0xfe, 0xf6, 0xee, 0x3e, 0x9c, 0x7a, 0x9e, 0x8e ; 8-f
Во входном байте in_dat содержится номер байта таблицы (от 0 до 15 в данном случае), а уж в саму таблицу пишете то, что Вам необходимо. В данном примере используется регистр косвенной адресации z=r31:r30, который совместно с командой lpm позволяет загружать данные из программной памяти.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Хм... Интересный вариант сложения двухбайтного числа с однобайтным. Я обычно делаю так:

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

ldi temp,0
ldi ZH,High(tab1*2)
ldi ZL,Low(tab1*2) 
add ZL,in_dat
adc ZH,temp               
lpm out_dat,Z
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение avreal »

А я - так:

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

        mov     ZL, in_dat
        clr     ZH
        subi    ZL, Low( -(tab1*2) )
        sbci    ZH, High( -(tab1*2) )
        lpm     out_dat, Z
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

Парсер для конверсии кодировки ASCII в формат для дисплея:

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

PARSER:
ldi            ZH,            High(SYMBOLS_CYR_TABLE*2)
ldi            ZL,            Low(SYMBOLS_CYR_TABLE*2)
;----------
cpi            temp0,         'А'
breq         RET_1
adiw         Z,            5
cpi            temp0,         'Б'
breq         RET_1
adiw         Z,            5
cpi            temp0,         'В'
breq         RET_1
adiw         Z,            5
cpi            temp0,         'Г'
breq         RET_1
adiw         Z,            5
cpi            temp0,         'Д'
breq         RET_1
adiw         Z,            5
..................
.........
RET_1: ret
;----------
;Таблица символов. Расположение символов в массиве должно совпадать с порядком поиска символов в парсере!
SYMBOLS_CYR_TABLE:
.db 0x83, 0xF5, 0xF6, 0xF6, 0x80, /*А*/ 0x80, 0xB6, 0xB6, 0xB6, 0xCE  // Б
.db 0x80, 0xB6, 0xB6, 0xB1, 0xCF, /*В*/ 0x80, 0xFE, 0xFE, 0xFE, 0xFE  // Г
.db 0xBF, 0x83, 0xBD, 0x80, 0xBF, /*Д*/ 0x80, 0xB6, 0xB6, 0xB6, 0xBE  // Е
.db 0x8C, 0xF3, 0x80, 0xF3, 0x8C, /*Ж*/ 0xDD, 0xBE, 0xB6, 0xB6, 0xC9  // З
.db 0x80, 0xDF, 0xEF, 0xF7, 0x80, /*И*/ 0x80, 0xF7, 0xEB, 0xDD, 0xBE  // К
.db 0x83, 0xFD, 0xFE, 0xFE, 0x80, /*Л*/ 0x80, 0xFD, 0xFB, 0xFD, 0x80  // М
.db 0x80, 0xF7, 0xF7, 0xF7, 0x80, /*Н*/ 0xC1, 0xBE, 0xBE, 0xBE, 0xC1  // О
.db 0x80, 0xFE, 0xFE, 0xFE, 0x80, /*П*/ 0x80, 0xF6, 0xF6, 0xF6, 0xF9  // Р
.db 0xC1, 0xBE, 0xBE, 0xBE, 0xDD, /*С*/ 0xFE, 0xFE, 0x80, 0xFE, 0xFE  // Т
.db 0xD8, 0xB7, 0xB7, 0xB7, 0xC0, /*У*/ 0xF9, 0xF6, 0x80, 0xF6, 0xF9  // Ф
.db 0x9C, 0xEB, 0xF7, 0xEB, 0x9C, /*Х*/ 0x80, 0xBF, 0xBF, 0x80, 0xBF  // Ц
.db 0xF8, 0xF7, 0xF7, 0xF7, 0x80, /*Ч*/ 0x80, 0xBF, 0x80, 0xBF, 0x80  // Ш
.db 0xC0, 0xDF, 0xC0, 0xDF, 0x80, /*Щ*/ 0xFE, 0x80, 0xB7, 0xB7, 0xCF  // Ъ
.db 0x80, 0xB7, 0xCF, 0xFF, 0x80, /*Ы*/ 0x80, 0xB7, 0xB7, 0xB7, 0xCF  // Ь
.db 0xDD, 0xBE, 0xB6, 0xB6, 0xC1, /*Э*/ 0x80, 0xF7, 0xC1, 0xBE, 0xC1  // Ю
.db 0xB9, 0xD6, 0xE6, 0xF6, 0x80, /*Я*/ 0xFF, 0xBD, 0x80, 0xBF, 0xFF  // 1
.db 0xBD, 0x9E, 0xAE, 0xB6, 0x99, /*2*/ 0xDF, 0xBD, 0xBE, 0xB6, 0xC9  // 3
.db 0xE7, 0xEB, 0xED, 0x80, 0xEF, /*4*/ 0xB0, 0xBA, 0xBA, 0xBA, 0xC6  // 5
.db 0xC1, 0xB6, 0xB6, 0xB6, 0xCD, /*6*/ 0x9C, 0xEE, 0xF6, 0xFA, 0xFC  // 7
.db 0xC9, 0xB6, 0xB6, 0xB6, 0xC9, /*8*/ 0xD9, 0xB6, 0xB6, 0xB6, 0xC1  // 9
.db 0xC1, 0x9E, 0xA2, 0xBC, 0xC1, /*0*/ 0xFF, 0xFF, 0xA0, 0xFF, 0xFF  // !
.db 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, /*.*/ 0xBF, 0xDF, 0xFF, 0xFF, 0xFF  // ,
.db 0xFD, 0xFE, 0xAE, 0xF6, 0xF9, /*?*/ 0x9F, 0xEF, 0xF7, 0xFB, 0xFC  // /
.db 0xBE, 0xDD, 0xE3, 0xFF, 0xFF, /*)*/ 0xFF, 0xFF, 0xE3, 0xDD, 0xBE  // (
.db 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, /*"*/ 0xFF, 0xFF, 0xFC, 0xFF, 0xFF  // '
.db 0xFF, 0xFF, 0xDB, 0xFF, 0xFF, /*:*/ 0xFF, 0xBF, 0xDB, 0xFF, 0xFF  // ;
.db 0xED, 0xF3, 0xC0, 0xF3, 0xED, /***/ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  //  пробел


Если есть метод попроще, то можете подсказать.

Табличный вызов подпрограмм:

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

LOOP:
ldi   r16,   0x0X ;(0-3)
ldi           ZL,               Low(HANDLERS*2)
ldi           ZH,               High(HANDLERS*2)
lsl           r16
clr           r17
add           ZL,               r16
adc           ZH,               r17
lpm           r16,              Z
adiw          Z,                0x01
lpm           r17,              Z
mov           ZL,               r16
mov           ZH,               r17
icall
rjmp          LOOP
;----------
PRG0:
;Отрабатывается при r16=0x00
ret
;----------
PRG1:
;Отрабатывается при r16=0x01
ret
;----------
PRG2:
;отрабатывается при r16=0x02
ret
;----------
PRG3:
;Отрабатывается при r16=0x03
ret
;----------
HANDLERS:
.dw PRG0, PRG1, PRG2, PRG3
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

ploop писал(а):Хм... Интересный вариант сложения двухбайтного числа с однобайтным. Я обычно делаю так:

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

ldi temp,0
ldi ZH,High(tab1*2)
ldi ZL,Low(tab1*2) 
add ZL,in_dat
adc ZH,temp               
lpm out_dat,Z
Можно и так, но не всегда имеется лишний регистр, где можно хранить 0. Можно еще вот так:

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

ldi ZH,High(tab1*2) 
ldi ZL,Low(tab1*2)
add ZL,in_dat
clr in_dat
adc ZH,in_dat               
lpm out_dat,Z
Один фиг, длина кода такая же.
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

avreal писал(а):А я - так:

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

        mov     ZL, in_dat
        clr     ZH
        subi    ZL, Low( -(tab1*2) )
        sbci    ZH, High( -(tab1*2) )
        lpm     out_dat, Z
Класс :beer: !
Беру на вооружение :kill: .
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

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

Сообщение DX168B »

avreal писал(а):А я - так:

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

        mov     ZL, in_dat
        clr     ZH
        subi    ZL, Low( -(tab1*2) )
        sbci    ZH, High( -(tab1*2) )
        lpm     out_dat, Z

А чё, неплохо. :) Принимается в копилку.... :beer:
I am DX168B and this is my favourite forum on internet!
Ответить

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