Что такое 1<<PB7 и как осуществлять побитную пересылку

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Ethereal
Родился
Сообщения: 16
Зарегистрирован: Ср янв 19, 2011 00:34:56

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение Ethereal »

gearbox79 писал(а): P. S. Спасибо ChipKiller за разяснения с << Действилельно в асме и С функции разные. В асме это битовая маска

ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме
И в ассемблере и в Си << - одно и то-же. Многократный побитовый сдвиг влево.
1 << 3 - сдвинуть единицу влево 3 раза.

ldi R16,(1<<3|1<<5) - это инструкция процессора занести в r16
immediate value - непосредственное значение.
Значение представлено выражением, которое рассчитывает ассемблер
при компиляции. При рассчете выражения
используются те-же приоритеты операций, что и в Си.
Т.е << приоритетнее, чем |. Поэтому рассчет выражения выполняется так :
Единица сдвинутая влево 3 раза и единица сдвинутая влево 5 раз
побитово логически складываются (OR-ятся).
Непосредственное значение получается равным 00101000 двоично.
Реклама
gearbox79
Родился
Сообщения: 6
Зарегистрирован: Вс янв 16, 2011 21:35:34

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение gearbox79 »

На самом деле конструкция загрузки числа по маске

ldi temp,(1<<3|1<<5)

аналогична команде

ldi temp, 0b00101000

Туда куда не грузятся еденицы, грузятся нули.
Загрузка по маске очень удобна для загрузки конфигурационных регистров типа TIMSK.
Не надо считать биты. Знаешь просто куда надо единицы установить и всё.
Реклама
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение ut1wpr »

gearbox79 писал(а):На самом деле конструкция загрузки числа по маске

ldi temp,(1<<3|1<<5)

аналогична команде

ldi temp, 0b00101000

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

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение IM1 »

ChipKiller писал(а):

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

; SCLK portb1
; DIN portb0

	ldi	count, 8			
loop:
	sbrs	value, 0		;
	sbi	PORTB, 0		; вывод 1
	sbrc	value, 0		;
	cbi	PORTB, 0		; вывод 0
	sbi	PORTB, 1		; выдаем clock
	cbi	PORTB, 1		;
	lsr	value			; сдвиг
	dec	count			; повторяем 8 раз (1 байт)
	brne	loop			
ChipKiller, прошу в 3-й раз. Выводится ли в порт инверсное значение битов value, 0 или я что-то не понимаю?
Спасибо.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение ChipKiller »

IM1 писал(а):Выводится ли в порт инверсное значение битов value, 0 или я что-то не понимаю
все правильно понимаете. Данный кусок скопирован из одной моей программки которая передает байт на семи сегментный индикатор через КР555ИР8 (аналог 74хх164). Если нужна передача без инверсии, то нужно поменять местами всего 2 строчки:

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

; SCLK portb1
; DIN portb0

   ldi   count, 8         
loop:
   sbrc   value, 0      ;
   sbi   PORTB, 0      ; вывод 1
   sbrs   value, 0      ;
   cbi   PORTB, 0      ; вывод 0
   sbi   PORTB, 1      ; выдаем clock
   cbi   PORTB, 1      ;
   lsr   value         ; сдвиг
   dec   count         ; повторяем 8 раз (1 байт)
   brne   loop      

на коментарии вывод 1 и вывод 0 - не обращайте внимания, просто часто меняю этот участок, в зависимости от применяемых индикаторов (общий анод или общий катод)
Реклама
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение IM1 »

ChipKiller писал(а): ...все правильно понимаете...
ОК! Спасибо.
Реклама
gearbox79
Родился
Сообщения: 6
Зарегистрирован: Вс янв 16, 2011 21:35:34

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение gearbox79 »

Разобрались уже 1<<PB7 это ЧИСЛО 128!!!!!!!!!!!!!!! (PB7 это число 7 см. XXXXX.inc!!!!!!!!!!!!)
(1<<PB7|1<<PB0) это ЧИСЛО 129!!!!!!!!!!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку

Сообщение ploop »

В конфиг. регистре есть биты, которые (возможно) понадобиться модифицировать в ходе выполнения программы.
Поэтому прямую запись константы в регистр конф. рекомендовано выполнять при начальной инициализации и/или при полной уверенности, что запись нулей не перенастроит регистр и не нанесет вреда программе.
Само собой. Но ни кто не мешает строить таким образом битовые маски:

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

<.......>
    ori r_btn_press,(1<<BTF_flag)  ; устанавливаем флаг нажатия
    ori r_tasks,(1<<BTT_flag)   ; устанавливаем флаг действия
<.......>
BTF_flag, BTT_flag - константы (номера битов), которые задаём где-то в начале. Во-первых с именами приятней работать, во-вторых всегда можно поменять (если это например биты IO-порта)
Закрыто

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