Страница 1 из 1
Re: инвертировать бит в регистре, зная номер бита (микрочип,
Добавлено: Пт окт 02, 2009 21:29:47
Neekeetos
_noise писал(а):
- циклично двигаем регистр через STATUS.C;
- когда в STATUS.C оказывается бит с нужным номером, инвертируем его;
- двигаем дальше, чтобы остальные биты вернулись на свои места.
А как умные люди делают?
Честно говоря в таком асме(видимо для пиков) не разбираюсь, но алгоритм можно сделать таким
- загружаешь во временную переменную значение 1
- в цикле сдвигаешь ее влево количество раз равное номеру бита который надо инвертировать
- делаешь XOR твоего байта с данными и получившейся временной переменной , нужный бит соотв будет проинвертирован
Добавлено: Пт окт 02, 2009 21:33:58
Yellow Tiger
Ещё вариант - получать сдвинутый бит не сдвигами, а загрузкой из таблицы. В некоторых случаях это будет быстрее. На ассемблере пиков не проверял.
Добавлено: Пт окт 02, 2009 22:18:11
urry
#define BITINV(MEM,BITNO) MEM=(MEM^(1 << (BITNO)))
85: BITINV(temp,i);
0A9 3001 MOVLW 0x1
0AA 00F9 MOVWF 0x79
0AB 0836 MOVF 0x36, W
0AC 00FA MOVWF 0x7a
0AD 0AFA INCF 0x7a, F
0AE 28B1 GOTO 0xb1
0AF 1003 BCF 0x3, 0
0B0 0DF9 RLF 0x79, F
0B1 0BFA DECFSZ 0x7a, F
0B2 28AF GOTO 0xaf
0B3 0879 MOVF 0x79, W
0B4 06B7 XORWF 0x37, F
Добавлено: Сб окт 03, 2009 09:03:50
Neekeetos
_noise писал(а):
То есть индуса с фирмы уволили. А получилось полезно для случая, когда нужно поштучно байты экономить.
Толи я ничего не понимаю толи у пиков условные переходы отменили толи асм у него такой уродский, код должен быть в два раза меньше по моему алгоритму, вот смотри на авр как :
Код: Выделить всё
ldi mask,1
ldi bit,1
ldi data,0xaa
tst bit
shift:
breq next
lsl mask
dec bit
rjmp shift
next:
eor data,mask
Так что долой индусов, разбирайся с кодом

Добавлено: Сб окт 03, 2009 09:37:54
Neekeetos
Neekeetos писал(а):
Код: Выделить всё
ldi mask,1
ldi bit,1
ldi data,0xaa
tst bit
shift:
breq next
lsl mask
dec bit
rjmp shift
next:
eor data,mask
Это был прямой вариант, вот более шустрый, по памяти +1 :
Код: Выделить всё
ldi bit,7
ldi data,0x00
inc bit
clr mask
sec
shift:
rol mask
dec bit
brne shift
eor data,mask
Добавлено: Сб окт 03, 2009 16:53:03
Neekeetos
_noise писал(а):
Последний в ручном-человеческом исполнении напрямую без посредников как-то так:
А зато если атмель, то красивый-табличный вариант фтопку?
Ну вот , уже похоже на нормальный код

, по поводу таблиц у атмеля есть более красивый вариант:
Код: Выделить всё
table:
.db 0b00000001,0b00000010
.db 0b00000100,0b00001000
.db 0b00010000,0b00100000
.db 0b01000000,0b10000000
invbit:
ldi bit,2
ldi data,0xaa
clr mask
ldi ZH, high(table<<1)
ldi ZL, low(table<<1)
add ZL, bit
adc ZH, mask
lpm mask,Z
eor data,mask
в общем и так и эдак и белочкой
