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

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

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

Сообщение gearbox79 »

У меня вопрос как в асме устанавливать по маске? Что такое 1<<PB7 например и можно ли вместо PB использовать сдвиговый регистр С. Идея заключается в пересылке данных на последовательный интерфейс (индикаторы, ЦАП и т.д.). В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR??? и как эффективно загружать данные в ЦАП с последовательным интерфейсом. Можно конечно двигать, обрезать по маске и выводить в порт весь регистр, но если другие ноги задействованы? Юзаю ATtiny2313.
Реклама
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

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

Сообщение romazan »

1<<PB7 - это логический сдвиг влево в С++, в данном случае 1 сдвигается 7 раз, так как в конфиге <ioXXX.h> PB7 присвоенно 7
Реклама
gearbox79
Родился
Сообщения: 6
Зарегистрирован: Вс янв 16, 2011 21:35:34

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

Сообщение gearbox79 »

В tn2313def.inc есть такая фраза:
"Пожалуйста, обратите внимание на различия в использовании имен битов с инструкциями сдвига битов таких как "sbr"/"cbr" (set/clear bit in register) и "sbrs"/"sbrc"" и приведён пример:

in r16,PORTB ;read PORTB latch
;* sbr r16,(1<<PB6)+(1<<PB5) ;set PB6 and PB5 (use masks, not bit#)
;* out PORTB,r16 ;output to PORTB

Непонятно можно ли 1<<PB7 использовать в асме???

Но самое главное есть ли в AVR проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

gearbox79 писал(а):В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR???
... и есть еще команды RL A, RR A, а для AVR ROL, ROR, LSR, LSL
gearbox79 писал(а):Но самое главное есть ли в AVR проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
конечно... :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

gearbox79 писал(а):Непонятно можно ли 1<<PB7 использовать в асме???
можно конечно:)
gearbox79 писал(а):Но самое главное есть ли в AVR проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
Есть. называется USART/UART, SPI, TWI(i2c).
Ставим плюсы: )
Реклама
gearbox79
Родился
Сообщения: 6
Зарегистрирован: Вс янв 16, 2011 21:35:34

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

Сообщение gearbox79 »

USART это понятно, но к сожалению занято. А если индикатор, ЦАП, АЦП и по USART на комп передаётся и принимается? Я имел ввиду повесить индикатор на 3,4 порта любых (можно конечно LDAC на землю) и написать код, который с максимальной эффективностью будет передавать данные. Я вижу только двигать бит через С (ROL) туда, где висит ЦАП, обрезать по маске, выводить в порт и защёлкивать.
Я сделал во так для индикатора HT1610. DIN portb0, SCLK portb1, temp старшая тетрада данные, девайс ATtiny2313.
bit_write:
sbi sclk,1 ;установить sclk в 1
rol temp ;циклический сдвиг регистра temp влево через флаг перенрса
rol temp ;циклический сдвиг регистра temp влево через флаг перенрса
andi temp,0b00000001 ;обрезание по маске
out din,temp ;вывод флага переноса в din
cbi sclk,1 ;перевести sclk в 0 (защёлкивание задним фронтом)
ret
На сколько я понял в AVR асме побитно в порт выводить нельзя. Надо весь регистр в PORTB например записывать???
P. S. Раньше в незапаметные времена MSC-51 увлекался.
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

gearbox79 писал(а):На сколько я понял в AVR асме побитно в порт выводить нельзя. Надо весь регистр в PORTB например записывать???
а как же команда, которую Вы даже использовали "sbi"? складывается впечатление, что это не Вы писали.
Ставим плюсы: )
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение 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			
gearbox79 писал(а):На сколько я понял в AVR асме побитно в порт выводить нельзя
... насколько я понял с ассемблером Вы не дружите :) на ассемблере можно ВСЕ
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

gearbox79 писал(а):На сколько я понял в AVR асме побитно в порт выводить нельзя
... насколько я понял с ассемблером Вы не дружите :) на ассемблере можно ВСЕ[/quote]
Кроме 1<<PB7 :)
Это не команда ассемблера. Это макрос преобразования номера вывода в битовую маску.
1<<PB7 = 10000000 = 0x80
С уважением,
Виктор.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Это не макрос (нет определения макроса), это операция битового сдвига. :)
Т.е. "<<" означает сдвиг влево на N-позиций (бит).
Таким образом 1<<7 будет соответствовать сдвигу числа 0b00000001 на 7 бит влево без циклического переноса. Получиться 0b10000000
:))
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

... только без "ругани" :)
С и ассемблер разные языки. Если в С "<<" - команда побитового сдвига, то конструкция типа:

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

 
unsigned char val;
val<<=1;
осуществит сдвиг значения val на один разряд влево (что равносильно умножению на 2)

В ассемблере "сдвиг" выполняют машинные инструкции - ROR, LSR и т.д., которые преобразуются в код. А команды "<<" в ассемблере нет. "<<" обрабатывается препроцессором для создания битовой маски. Согласен с ut1wpr.

Автор топика наверное еще не привык к командам AVR-ассемблера, так что давайте не будем путать его еще больше :)
gearbox79
Родился
Сообщения: 6
Зарегистрирован: Вс янв 16, 2011 21:35:34

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

Сообщение gearbox79 »

До sbrs, cbi, sbrc, sbi я сам дошёл сегодня ночью. Точнее я до этого раньше дошёл, только sbrs без sbrc, через переход делал, потом посмотрел на время выполнения команд и получилось что сдвигать в два раза быстрее, чем проверять установку или сброс бита в регистре, но тратится ещё один РОН (чтобы один сохранить для сдвига а другой обрезать по маске). Хотя через sbrs, sbrc значительно более универсально. Только вместо цифр лучше использовать PORTB0,PORTB1.

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

ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме

Ещё вопрос. Как использовать USART для передачи данных в ЦАП или индикатор. Есть у кого нибуть код оного действия. Не могу в инете что либо путное по этому вопросу найти.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

gearbox79 писал(а):Хотя через sbrs, sbrc значительно более универсально. Только вместо цифр лучше использовать PORTB0,PORTB1.
:shock: ... может не совсем понял, но запись sbrs PORTB0 - полный бред....
gearbox79 писал(а):Ещё вопрос. Как использовать USART для передачи данных в ЦАП или индикатор.
... много от чего зависит (например используются ли прерывания), если нет то:

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

RxD:
sbis	UCSRA,RXC	; ждем окончания приема байта
rjmp	RxD 
in	tmp,UDR		; копируем
ret
... а дальше шлем tmp куда надо...

PS ... быстрее будет самому почитать какую-нибудь книжку по архитектуре и командам AVR, а уж если что-то не ясно, тогда и спросить.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

Kavka писал(а):Это не макрос (нет определения макроса), это операция битового сдвига. :)
Т.е. "<<" означает сдвиг влево на N-позиций (бит).
Таким образом 1<<7 будет соответствовать сдвигу числа 0b00000001 на 7 бит влево без циклического переноса. Получиться 0b10000000
:))

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

#define setbit(port,bit) (port |= 1<<bit)
.......
setbit(PORTB,7);
Препроцессор компилятора, встретив этот макрос сгенерирует маску установки бита bit про-оренную с портом port.
А "правильный" компилятор, зная что есть битовые операции с портом превратит это в установку уже вычисленного на фазе препроцессинга бита указанного порта, не став при этом орить порт.
Т.е. программист на Си безусловно должен знать и понимать команды ассемблера, равно как и возможности используемого компилятора. И в приведенном мной примере это все-таки макрос, обрабатываемый Сишным препроцессором. Хотя отдельно взятое число 1<<7 суть вычисляемый препроцессором аргумент, такой же, как 2*5 или 5+8...
Последний раз редактировалось ut1wpr Пн янв 17, 2011 18:40:31, всего редактировалось 2 раза.
С уважением,
Виктор.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

gearbox79 писал(а):ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме
И так и немножко не так. Вы запишите число 0x28 в регистр 16. В этом числе кроме двух единиц присутствуют ещё и шесть нулей, не забывайте. Иными словами, записывая две единицы, вы невольно изменили содержимое других разрядов. Если задача стоит именно так, как вы написали "записать единицу в 3-й и 5-й биты регистра R16", то правильнее ее выполнять именно командами непосредственной установки отдельных бит.

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

sbi r16,(1<<3)
sbi r16,(1<<5)
Решение почитать описание команд ассемблера абсолютно правильное. :)
С уважением,
Виктор.
Аватара пользователя
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			
А Вам не кажется, что в portb0 выводится инверсное значение
value, 0?
Что-то тягомотен asm у avr, особенно при работе с битами.
А вот как бы смотрелось тоже самое у MCS-51:

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

; SCLK pin1
; DIN   pin0
; value acc

	mov	count, #8			
loop:
   rrc    a                    ; сдвиг вправо через с
	mov	din, c                ; вывод din
	setb  sclk                  ; выдаем clock
	clr	sclk                  ;
	djnz  count, loop
... насколько я понял с ассемблером Вы не дружите :) на ассемблере можно ВСЕ
Что можно, то можно, в конце концов МК кроме asm ничего и не понимает, а остальные языки просто костыли и подпорки. Но какими средствами?
А многие до сих пор удивляются: почему это mcs-51 самая востребованная система в мире.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

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

Сообщение ut1wpr »

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

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

Сообщение IM1 »

МК не понимает и asm. Он понимает машинные коды. asm всего лишь транслятор (компилятор, если угодно, это уже игра словами). Вы хотите здесь поднять тему "Какая платформа лучше"? Или "Какой язык"? Не стоит, обе темы вечны, как мир и ответов нет...
Это все знают, но асм как раз таки наиболее близок к машинным кодом. Упрощенно говоря, мы практически напрямую, через названия имеем дело с самими кодами.
А по теме (см. название), я спросил про ошибку в авр кодах и показал пример того же на мцс51, что Вы имеете ответить по существу? А именно, есть ли ошибка и где же код короче?
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

IM1 писал(а):А по теме (см. название)
смотрю .. тема - Что такое 1<<PB7 и как осуществлять побитную пересылку
gearbox79 писал(а):Юзаю ATtiny2313.
.. и возникал ли у кого вопрос про MSC-51? кажется нет ....IM1 может хватит ФЛУДИТЬ?!!!
Аватара пользователя
IM1
Грызет канифоль
Сообщения: 268
Зарегистрирован: Вт фев 16, 2010 12:10:38
Откуда: Воронеж, Россия

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

Сообщение IM1 »

ChipKiller писал(а):
IM1 писал(а):А по теме (см. название)
смотрю .. тема - Что такое 1<<PB7 и как осуществлять побитную пересылку
Ответь-те только, есть ли в Вашем коде ошибка, на которую я указывал:
А Вам не кажется, что в portb0 выводится инверсное значение
value, 0?
По поводу второй части:
.. и возникал ли у кого вопрос про MSC-51? кажется нет ....IM1 может хватит ФЛУДИТЬ?!!!
Вот цитата по возникновению вопроса, спрашивает камрад gearbox79:
В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR???
И по теме, не надо дурочку валять, речь таки идет о "и как осуществлять побитную пересылку", а никак не о "Что такое 1<<PB7", которая здесь не пришей рукав.
Закрыто

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