Да можно, знаю.
Ладно, хватит спорить, чей кун-фу круче
К примеру использовать еще один регистр - уберутся условные переходы при инвертировании битов, ну и т.д.
даже на "рассыпухе" это легко решаемо и будет работать в 100 раз быстрее, чем на МК, зачем заморачиваться ????ChipKiller писал(а):ЗЫ. Вообще следует различать, когда "выгодно" применять "рассыпуху" и ПЛМ, а когда МК и не путать одно с другим.
Согласен, что ерундой, но для меня смысл не в том, чтобы работало быстро или то, что на рассыпухе это проще. Я просто хочу научится....ChipKiller писал(а):.. ни каких споров - просто qmix занимается, мягко говоря, ерундой ИМХО.даже на "рассыпухе" это легко решаемо и будет работать в 100 раз быстрее, чем на МК, зачем заморачиваться ????ChipKiller писал(а):ЗЫ. Вообще следует различать, когда "выгодно" применять "рассыпуху" и ПЛМ, а когда МК и не путать одно с другим.
Насколько я понимаю, топик стартеру было интересно, чтобы данные лог. функции вычислил сам МК, а не дядя на бумажке с тупой (простите, механической) набивкой в таблицу. Или я что-то не так понял?ChipKiller писал(а): ... тогда простая таблица на 256 значений
IM1 писал(а):Или я что-то не так понял?
Засунуть то можем, а вот рассунуть! Боюсь, что проще сделать нормальную табличку (без идиотских ijmp и ret) с 16 байтами, чем писать миллион условий и сдвигов для упакованного результата. Да и время выполнения получится одинаковое для всех комбинаций, что есть хорошоGudd-Head писал(а):Ну и поскольку у нас всего 4 входа, то в таблице будет всего 16 значений, которые можно засунуть в два байта (т.к. выход однобитный).
IM1 писал(а):проще сделать нормальную табличку (без идиотских ijmp и ret) с 16 байтами
Ну тогда два варианта:Gudd-Head писал(а):А если входов будет... 8? Тогда таблица будет уже 256 байт. А это 12,5% памяти 2313
qmix писал(а):в процессе, сравнивается имеющееся значение с заданной таблицей, и в соответствии с ней выводится результат. Поправьте если неправильно.
Вот Вам кусочек кода на примере знакогенератора, все очень просто.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Код: Выделить всё
ldi temp,0
ldi ZH,High(tab1*2)
ldi ZL,Low(tab1*2)
add ZL,in_dat
adc ZH,temp
lpm out_dat,ZКод: Выделить всё
mov ZL, in_dat
clr ZH
subi ZL, Low( -(tab1*2) )
sbci ZH, High( -(tab1*2) )
lpm out_dat, ZКод: Выделить всё
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
Можно и так, но не всегда имеется лишний регистр, где можно хранить 0. Можно еще вот так: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
Код: Выделить всё
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Классavreal писал(а):А я - так:Код: Выделить всё
mov ZL, in_dat
clr ZH
subi ZL, Low( -(tab1*2) )
sbci ZH, High( -(tab1*2) )
lpm out_dat, Z
!
.avreal писал(а):А я - так:Код: Выделить всё
mov ZL, in_dat
clr ZH
subi ZL, Low( -(tab1*2) )
sbci ZH, High( -(tab1*2) )
lpm out_dat, Z
