Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
18.05.2006, 07:28
|
|
Частый гость
Регистрация: 04.05.2006
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
PORTA.0
Здраствуйте.
Как можно организовать следующую вещь:
необходимо записывать в ногу порта значение. 0 или 1.
я не могу придумать ничего кроме как:
Код:
|
if( bit_is_set(byte, bit) ){
sbi(PORTA, PA1);
}else{
cbi(PORTA, PA1);
} |
нельзя-ли сделать это как то короче.
т.е. заменить sbi && cbi на что то вроде:
some(PORTA‹‹PA1, value)
|
|
|
|
18.05.2006, 19:18
|
|
Частый гость
Регистрация: 02.05.2006
Сообщений: 17
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
CodeVision:
PORTA.1 = Byte & (1‹‹Bit);
|
|
|
|
19.05.2006, 13:57
|
|
Частый гость
Регистрация: 04.05.2006
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
про код вижн я в курсе.
а хотелось бы под gcc или на ассемблере (в крайнме случае)
|
|
|
|
19.05.2006, 14:02
|
|
Прохожий
Регистрация: 20.04.2005
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
labas.[priviet]
|
|
|
|
19.05.2006, 18:38
|
|
Прохожий
Регистрация: 30.04.2006
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
На asm-е что-то вроде
cbi PORTA,1 ; PORTA.1 = '0'
sbrc r23,bit ; если bit в r23 установлен,
sbi PORTA,1 ; то PORTA.1 = '1'
На gcc первое, что пришло в голову:
if(byte&(1‹‹bit))
PORTA |= 1‹‹PA1;
else
PORTA &= ~(1‹‹PA1);
|
|
|
|
19.05.2006, 19:26
|
|
Частый гость
Регистрация: 04.05.2006
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
2 dr_allcom
Вы меня неверно поняли...
Я как раз и хотел уйти от проверки (if(bit_is_set(var, bit))). Теперь понял что видимо никак.
а для gcc правильный код я прямо в своем первом сообщение показал
|
|
|
|
19.05.2006, 20:21
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Тебе как понял я , нужно при каждом проходе этого куска кода , инвертировать бит порта.
Для пиков , в С есть команда toggle то есть триггер
, уверен что и у АВР есть то же самое.
|
|
|
|
19.05.2006, 20:34
|
|
Частый гость
Регистрация: 04.05.2006
Сообщений: 46
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
неа...не инвертировать.
мне надо байт последовательно выдать в одну ногу порта.
возможно ли это без if(bit_is_set) пока не понял
|
|
|
|
19.05.2006, 20:59
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
А понял . Тогда сдвигай байт через флаг переноса
а уж его(перенос) и копируй в ногу порта ..
|
|
|
|
19.05.2006, 21:10
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
CARRY= флаг переноса (не помню как это у АВР)
.
.
.
for(i=0;i‹7;i++)
{
DATA‹‹1;
PORTA.1=CARRY;
}
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:17.
|
|