Страница 1 из 2
Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вс янв 16, 2011 21:47:50
gearbox79
У меня вопрос как в асме устанавливать по маске? Что такое 1<<PB7 например и можно ли вместо PB использовать сдвиговый регистр С. Идея заключается в пересылке данных на последовательный интерфейс (индикаторы, ЦАП и т.д.). В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR??? и как эффективно загружать данные в ЦАП с последовательным интерфейсом. Можно конечно двигать, обрезать по маске и выводить в порт весь регистр, но если другие ноги задействованы? Юзаю ATtiny2313.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вс янв 16, 2011 21:53:04
romazan
1<<PB7 - это логический сдвиг влево в С++, в данном случае 1 сдвигается 7 раз, так как в конфиге <ioXXX.h> PB7 присвоенно 7
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вс янв 16, 2011 22:05:41
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 проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вс янв 16, 2011 22:13:47
ChipKiller
gearbox79 писал(а):В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR???
... и есть еще команды
RL A, RR A, а для AVR
ROL, ROR, LSR, LSL
gearbox79 писал(а):Но самое главное есть ли в AVR проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
конечно...

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вс янв 16, 2011 22:38:00
ibiza11
gearbox79 писал(а):Непонятно можно ли 1<<PB7 использовать в асме???
можно конечно:)
gearbox79 писал(а):Но самое главное есть ли в AVR проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
Есть. называется USART/UART, SPI, TWI(i2c).
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 02:01:36
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 увлекался.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 03:01:25
ibiza11
gearbox79 писал(а):На сколько я понял в AVR асме побитно в порт выводить нельзя. Надо весь регистр в PORTB например записывать???
а как же команда, которую Вы даже использовали "
sbi"? складывается впечатление, что это не Вы писали.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 11:12:33
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 асме побитно в порт выводить нельзя
... насколько я понял с ассемблером Вы не дружите

на
ассемблере можно ВСЕ
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 13:45:03
ut1wpr
gearbox79 писал(а):На сколько я понял в AVR асме побитно в порт выводить нельзя
... насколько я понял с ассемблером Вы не дружите

на
ассемблере можно ВСЕ[/quote]
Кроме 1<<PB7

Это не команда ассемблера. Это макрос преобразования номера вывода в битовую маску.
1<<PB7 = 10000000 = 0x80
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 14:58:16
Kavka
Это не макрос (нет определения макроса), это операция битового сдвига.
Т.е. "<<" означает сдвиг влево на N-позиций (бит).
Таким образом 1<<7 будет соответствовать сдвигу числа 0b00000001 на 7 бит влево без циклического переноса. Получиться 0b10000000

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 16:35:10
ChipKiller
... только без "ругани"
С и ассемблер разные языки. Если в С
"<<" - команда побитового сдвига, то конструкция типа:
осуществит сдвиг значения
val на один разряд влево (что равносильно умножению на 2)
В ассемблере "сдвиг" выполняют машинные инструкции -
ROR, LSR и т.д., которые преобразуются в код. А
команды "<<" в ассемблере нет.
"<<" обрабатывается препроцессором для создания битовой маски. Согласен с
ut1wpr.
Автор топика наверное еще не привык к командам AVR-ассемблера, так что давайте не будем путать его еще больше

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 17:02:49
gearbox79
До sbrs, cbi, sbrc, sbi я сам дошёл сегодня ночью. Точнее я до этого раньше дошёл, только sbrs без sbrc, через переход делал, потом посмотрел на время выполнения команд и получилось что сдвигать в два раза быстрее, чем проверять установку или сброс бита в регистре, но тратится ещё один РОН (чтобы один сохранить для сдвига а другой обрезать по маске). Хотя через sbrs, sbrc значительно более универсально. Только вместо цифр лучше использовать PORTB0,PORTB1.
P. S. Спасибо ChipKiller за разяснения с << Действилельно в асме и С функции разные. В асме это битовая маска
ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме
Ещё вопрос. Как использовать USART для передачи данных в ЦАП или индикатор. Есть у кого нибуть код оного действия. Не могу в инете что либо путное по этому вопросу найти.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 18:01:36
ChipKiller
gearbox79 писал(а):Хотя через sbrs, sbrc значительно более универсально. Только вместо цифр лучше использовать PORTB0,PORTB1.

... может не совсем понял, но запись
sbrs PORTB0 - полный бред....
gearbox79 писал(а):Ещё вопрос. Как использовать USART для передачи данных в ЦАП или индикатор.
... много от чего зависит (например используются ли прерывания), если нет то:
Код: Выделить всё
RxD:
sbis UCSRA,RXC ; ждем окончания приема байта
rjmp RxD
in tmp,UDR ; копируем
ret
... а дальше шлем
tmp куда надо...
PS ... быстрее будет самому почитать какую-нибудь книжку по архитектуре и командам AVR, а уж если что-то не ясно, тогда и спросить.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 18:14:19
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...
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 18:23:25
ut1wpr
gearbox79 писал(а):ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме
И так и немножко не так. Вы запишите число 0x28 в регистр 16. В этом числе кроме двух единиц присутствуют ещё и шесть нулей, не забывайте. Иными словами, записывая две единицы, вы невольно изменили содержимое других разрядов. Если задача стоит именно так, как вы написали "записать единицу в 3-й и 5-й биты регистра R16", то правильнее ее выполнять именно командами непосредственной установки отдельных бит.
Решение почитать описание команд ассемблера абсолютно правильное.

Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Пн янв 17, 2011 21:00:43
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 самая востребованная система в мире.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вт янв 18, 2011 09:45:54
ut1wpr
IM1 писал(а):в конце концов МК кроме asm ничего и не понимает, а остальные языки просто костыли и подпорки.
МК не понимает и asm. Он понимает машинные коды. asm всего лишь транслятор (компилятор, если угодно, это уже игра словами). Вы хотите здесь поднять тему "Какая платформа лучше"? Или "Какой язык"? Не стоит, обе темы вечны, как мир и ответов нет...
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вт янв 18, 2011 17:19:00
IM1
МК не понимает и asm. Он понимает машинные коды. asm всего лишь транслятор (компилятор, если угодно, это уже игра словами). Вы хотите здесь поднять тему "Какая платформа лучше"? Или "Какой язык"? Не стоит, обе темы вечны, как мир и ответов нет...
Это все знают, но асм как раз таки наиболее близок к машинным кодом. Упрощенно говоря, мы практически напрямую, через названия имеем дело с самими кодами.
А по теме (см. название), я спросил про ошибку в авр кодах и показал пример того же на мцс51, что Вы имеете ответить по существу? А именно, есть ли ошибка и где же код короче?
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вт янв 18, 2011 19:03:31
ChipKiller
IM1 писал(а):А по теме (см. название)
смотрю .. тема -
Что такое 1<<PB7 и как осуществлять побитную пересылку
gearbox79 писал(а):Юзаю ATtiny2313.
.. и возникал ли у кого вопрос про MSC-51? кажется нет ....
IM1 может хватит ФЛУДИТЬ?!!!
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Добавлено: Вт янв 18, 2011 19:26:40
IM1
ChipKiller писал(а):IM1 писал(а):А по теме (см. название)
смотрю .. тема -
Что такое 1<<PB7 и как осуществлять побитную пересылку
Ответь-те только, есть ли в Вашем коде ошибка, на которую я указывал:
А Вам не кажется, что в portb0 выводится инверсное значение
value, 0?
По поводу второй части:
.. и возникал ли у кого вопрос про MSC-51? кажется нет ....IM1 может хватит ФЛУДИТЬ?!!!
Вот цитата по возникновению вопроса, спрашивает камрад gearbox79:
В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR???
И по теме, не надо дурочку валять, речь таки идет о "и как осуществлять побитную пересылку", а никак не о "Что такое 1<<PB7", которая здесь не пришей рукав.