хуета?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

_noise писал(а): - циклично двигаем регистр через STATUS.C;
- когда в STATUS.C оказывается бит с нужным номером, инвертируем его;
- двигаем дальше, чтобы остальные биты вернулись на свои места.

А как умные люди делают?
Честно говоря в таком асме(видимо для пиков) не разбираюсь, но алгоритм можно сделать таким
- загружаешь во временную переменную значение 1
- в цикле сдвигаешь ее влево количество раз равное номеру бита который надо инвертировать
- делаешь XOR твоего байта с данными и получившейся временной переменной , нужный бит соотв будет проинвертирован
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Ещё вариант - получать сдвинутый бит не сдвигами, а загрузкой из таблицы. В некоторых случаях это будет быстрее. На ассемблере пиков не проверял.
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение 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
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение 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
Так что долой индусов, разбирайся с кодом :))
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение 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 
Контактная информация:
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

_noise писал(а): Последний в ручном-человеческом исполнении напрямую без посредников как-то так:

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

    movf     Номербита, W
А зато если атмель, то красивый-табличный вариант фтопку?
Ну вот , уже похоже на нормальный код :), по поводу таблиц у атмеля есть более красивый вариант:

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

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
в общем и так и эдак и белочкой :)))
Контактная информация:
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»