Что такое 1<<PB7 и как осуществлять побитную пересылку
Что такое 1<<PB7 и как осуществлять побитную пересылку
У меня вопрос как в асме устанавливать по маске? Что такое 1<<PB7 например и можно ли вместо PB использовать сдвиговый регистр С. Идея заключается в пересылке данных на последовательный интерфейс (индикаторы, ЦАП и т.д.). В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR??? и как эффективно загружать данные в ЦАП с последовательным интерфейсом. Можно конечно двигать, обрезать по маске и выводить в порт весь регистр, но если другие ноги задействованы? Юзаю ATtiny2313.
- Реклама
- romazan
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Чт май 21, 2009 13:54:07
- Откуда: Москва
- Контактная информация:
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
1<<PB7 - это логический сдвиг влево в С++, в данном случае 1 сдвигается 7 раз, так как в конфиге <ioXXX.h> PB7 присвоенно 7
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
В 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 проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
"Пожалуйста, обратите внимание на различия в использовании имен битов с инструкциями сдвига битов таких как "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 и как осуществлять побитную пересылку
... и есть еще команды RL A, RR A, а для AVR ROL, ROR, LSR, LSLgearbox79 писал(а):В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR???
конечно...gearbox79 писал(а):Но самое главное есть ли в AVR проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
можно конечно:)gearbox79 писал(а):Непонятно можно ли 1<<PB7 использовать в асме???
Есть. называется USART/UART, SPI, TWI(i2c).gearbox79 писал(а):Но самое главное есть ли в AVR проверенный эффективный метод пересылки и приёма данных через последовательный интерфейс???
Ставим плюсы: )
- Реклама
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
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 увлекался.
Я сделал во так для индикатора 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 и как осуществлять побитную пересылку
а как же команда, которую Вы даже использовали "sbi"? складывается впечатление, что это не Вы писали.gearbox79 писал(а):На сколько я понял в AVR асме побитно в порт выводить нельзя. Надо весь регистр в PORTB например записывать???
Ставим плюсы: )
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Код: Выделить всё
; 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 и как осуществлять побитную пересылку
... насколько я понял с ассемблером Вы не дружитеgearbox79 писал(а):На сколько я понял в AVR асме побитно в порт выводить нельзя
Кроме 1<<PB7
Это не команда ассемблера. Это макрос преобразования номера вывода в битовую маску.
1<<PB7 = 10000000 = 0x80
С уважением,
Виктор.
Виктор.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Это не макрос (нет определения макроса), это операция битового сдвига.
Т.е. "<<" означает сдвиг влево на N-позиций (бит).
Таким образом 1<<7 будет соответствовать сдвигу числа 0b00000001 на 7 бит влево без циклического переноса. Получиться 0b10000000

Т.е. "<<" означает сдвиг влево на N-позиций (бит).
Таким образом 1<<7 будет соответствовать сдвигу числа 0b00000001 на 7 бит влево без циклического переноса. Получиться 0b10000000
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
... только без "ругани"
С и ассемблер разные языки. Если в С "<<" - команда побитового сдвига, то конструкция типа:
осуществит сдвиг значения val на один разряд влево (что равносильно умножению на 2)
В ассемблере "сдвиг" выполняют машинные инструкции - ROR, LSR и т.д., которые преобразуются в код. А команды "<<" в ассемблере нет. "<<" обрабатывается препроцессором для создания битовой маски. Согласен с ut1wpr.
Автор топика наверное еще не привык к командам AVR-ассемблера, так что давайте не будем путать его еще больше
С и ассемблер разные языки. Если в С "<<" - команда побитового сдвига, то конструкция типа:
Код: Выделить всё
unsigned char val;
val<<=1;
В ассемблере "сдвиг" выполняют машинные инструкции - ROR, LSR и т.д., которые преобразуются в код. А команды "<<" в ассемблере нет. "<<" обрабатывается препроцессором для создания битовой маски. Согласен с ut1wpr.
Автор топика наверное еще не привык к командам AVR-ассемблера, так что давайте не будем путать его еще больше
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
До sbrs, cbi, sbrc, sbi я сам дошёл сегодня ночью. Точнее я до этого раньше дошёл, только sbrs без sbrc, через переход делал, потом посмотрел на время выполнения команд и получилось что сдвигать в два раза быстрее, чем проверять установку или сброс бита в регистре, но тратится ещё один РОН (чтобы один сохранить для сдвига а другой обрезать по маске). Хотя через sbrs, sbrc значительно более универсально. Только вместо цифр лучше использовать PORTB0,PORTB1.
P. S. Спасибо ChipKiller за разяснения с << Действилельно в асме и С функции разные. В асме это битовая маска
ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме
Ещё вопрос. Как использовать USART для передачи данных в ЦАП или индикатор. Есть у кого нибуть код оного действия. Не могу в инете что либо путное по этому вопросу найти.
P. S. Спасибо ChipKiller за разяснения с << Действилельно в асме и С функции разные. В асме это битовая маска
ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме
Ещё вопрос. Как использовать USART для передачи данных в ЦАП или индикатор. Есть у кого нибуть код оного действия. Не могу в инете что либо путное по этому вопросу найти.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
gearbox79 писал(а):Хотя через sbrs, sbrc значительно более универсально. Только вместо цифр лучше использовать PORTB0,PORTB1.
... много от чего зависит (например используются ли прерывания), если нет то:gearbox79 писал(а):Ещё вопрос. Как использовать USART для передачи данных в ЦАП или индикатор.
Код: Выделить всё
RxD:
sbis UCSRA,RXC ; ждем окончания приема байта
rjmp RxD
in tmp,UDR ; копируем
ret
PS ... быстрее будет самому почитать какую-нибудь книжку по архитектуре и командам AVR, а уж если что-то не ясно, тогда и спросить.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Kavka писал(а):Это не макрос (нет определения макроса), это операция битового сдвига.![]()
Т.е. "<<" означает сдвиг влево на N-позиций (бит).
Таким образом 1<<7 будет соответствовать сдвигу числа 0b00000001 на 7 бит влево без циклического переноса. Получиться 0b10000000
Код: Выделить всё
#define setbit(port,bit) (port |= 1<<bit)
.......
setbit(PORTB,7);
А "правильный" компилятор, зная что есть битовые операции с портом превратит это в установку уже вычисленного на фазе препроцессинга бита указанного порта, не став при этом орить порт.
Т.е. программист на Си безусловно должен знать и понимать команды ассемблера, равно как и возможности используемого компилятора. И в приведенном мной примере это все-таки макрос, обрабатываемый Сишным препроцессором. Хотя отдельно взятое число 1<<7 суть вычисляемый препроцессором аргумент, такой же, как 2*5 или 5+8...
Последний раз редактировалось ut1wpr Пн янв 17, 2011 18:40:31, всего редактировалось 2 раза.
С уважением,
Виктор.
Виктор.
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
И так и немножко не так. Вы запишите число 0x28 в регистр 16. В этом числе кроме двух единиц присутствуют ещё и шесть нулей, не забывайте. Иными словами, записывая две единицы, вы невольно изменили содержимое других разрядов. Если задача стоит именно так, как вы написали "записать единицу в 3-й и 5-й биты регистра R16", то правильнее ее выполнять именно командами непосредственной установки отдельных бит.gearbox79 писал(а):ldi R16,(1<<3|1<<5) ;записать единицу в 3-й и 5-й биты регистра R16 в асме
Код: Выделить всё
sbi r16,(1<<3)
sbi r16,(1<<5)С уважением,
Виктор.
Виктор.
- IM1
- Грызет канифоль
- Сообщения: 268
- Зарегистрирован: Вт фев 16, 2010 12:10:38
- Откуда: Воронеж, Россия
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
А Вам не кажется, что в portb0 выводится инверсное значение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
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 и как осуществлять побитную пересылку
МК не понимает и asm. Он понимает машинные коды. asm всего лишь транслятор (компилятор, если угодно, это уже игра словами). Вы хотите здесь поднять тему "Какая платформа лучше"? Или "Какой язык"? Не стоит, обе темы вечны, как мир и ответов нет...IM1 писал(а):в конце концов МК кроме asm ничего и не понимает, а остальные языки просто костыли и подпорки.
С уважением,
Виктор.
Виктор.
- IM1
- Грызет канифоль
- Сообщения: 268
- Зарегистрирован: Вт фев 16, 2010 12:10:38
- Откуда: Воронеж, Россия
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Это все знают, но асм как раз таки наиболее близок к машинным кодом. Упрощенно говоря, мы практически напрямую, через названия имеем дело с самими кодами.МК не понимает и asm. Он понимает машинные коды. asm всего лишь транслятор (компилятор, если угодно, это уже игра словами). Вы хотите здесь поднять тему "Какая платформа лучше"? Или "Какой язык"? Не стоит, обе темы вечны, как мир и ответов нет...
А по теме (см. название), я спросил про ошибку в авр кодах и показал пример того же на мцс51, что Вы имеете ответить по существу? А именно, есть ли ошибка и где же код короче?
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
смотрю .. тема - Что такое 1<<PB7 и как осуществлять побитную пересылкуIM1 писал(а):А по теме (см. название)
.. и возникал ли у кого вопрос про MSC-51? кажется нет ....IM1 может хватит ФЛУДИТЬ?!!!gearbox79 писал(а):Юзаю ATtiny2313.
- IM1
- Грызет канифоль
- Сообщения: 268
- Зарегистрирован: Вт фев 16, 2010 12:10:38
- Откуда: Воронеж, Россия
Re: Что такое 1<<PB7 и как осуществлять побитную пересылку
Ответь-те только, есть ли в Вашем коде ошибка, на которую я указывал:ChipKiller писал(а):смотрю .. тема - Что такое 1<<PB7 и как осуществлять побитную пересылкуIM1 писал(а):А по теме (см. название)
По поводу второй части:А Вам не кажется, что в portb0 выводится инверсное значение
value, 0?
Вот цитата по возникновению вопроса, спрашивает камрад gearbox79:.. и возникал ли у кого вопрос про MSC-51? кажется нет ....IM1 может хватит ФЛУДИТЬ?!!!
И по теме, не надо дурочку валять, речь таки идет о "и как осуществлять побитную пересылку", а никак не о "Что такое 1<<PB7", которая здесь не пришей рукав.В MSC-51 есть команда MOV регистр, C. Двигаешь регистр через флаг переноса и флаг переноса выводишь на ногу порта. Есть ли аналогия в AVR???


