Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
-
dimm1985
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Вс мар 20, 2011 17:09:31
- Откуда: Киев
Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
Доброго времени суток. Я у вас тут новый, правила прочел, надеюсь подружимся!
Такая задача, есть Atmega8 , на ацп (8bit) получаем число “a” (значение с переменного резистора), не меняя число надо на PORTB.0 вывести значение bit[1] числа “a” , PORTB.1 значение bit[3] числа “a”,
PORTB.2 значение bit[5] числа “a”,
PORTB.3 значение bit[7] числа “a”.
Все это надо сделать на С в CVAVR.
С АЦП – всё понятно, а вот как из числа выдернуть значение конкретного бита без массивов, сдвигов итд. Может есть какой синтаксис, как то проще типа
PORTB.0=a(bit[1]).
Никогда таких задач не стояло, а по инету 2 день шарюсь, там только на asm.
Заранее спасибо за ответ.
Такая задача, есть Atmega8 , на ацп (8bit) получаем число “a” (значение с переменного резистора), не меняя число надо на PORTB.0 вывести значение bit[1] числа “a” , PORTB.1 значение bit[3] числа “a”,
PORTB.2 значение bit[5] числа “a”,
PORTB.3 значение bit[7] числа “a”.
Все это надо сделать на С в CVAVR.
С АЦП – всё понятно, а вот как из числа выдернуть значение конкретного бита без массивов, сдвигов итд. Может есть какой синтаксис, как то проще типа
PORTB.0=a(bit[1]).
Никогда таких задач не стояло, а по инету 2 день шарюсь, там только на asm.
Заранее спасибо за ответ.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
.. это называется битовая маска и если номер бита переменной не соответствует номеру бита порта, то без сдвигов или других действий никак....dimm1985 писал(а):а вот как из числа выдернуть значение конкретного бита без массивов, сдвигов
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
А чего такая боязнь сдвигов? Есть необходимость уложиться в крайне малые интервалы времени или просто религия не позволяет:) ? Например если из числа N нужен бит 3, то получить его можно вот так (N >> 3) & 1.
В вашем случае, например:
PORTB |= (A >> 3) & 4; // 5й бит переменной A выставляем на PD2, 4 = 0b00000100
Правда если в PD2 была единица лог. или ее не сбросит. Перед началом обработки значения PORTB надо очищать.
Если не секрет, зачем в таком хитром порядке значение ацп на порт выводить?
В вашем случае, например:
PORTB |= (A >> 3) & 4; // 5й бит переменной A выставляем на PD2, 4 = 0b00000100
Правда если в PD2 была единица лог. или ее не сбросит. Перед началом обработки значения PORTB надо очищать.
Если не секрет, зачем в таком хитром порядке значение ацп на порт выводить?
-
dimm1985
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Вс мар 20, 2011 17:09:31
- Откуда: Киев
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
Для начала спасибо за ОПЕРАТИВНЫЙ ответ! Приятно! Буду осваиваться тут у вас.
Абсолютно верно СКОРОСТЬ!
А хитрости никакой нет, преподу демонстрационная модель по алгоритмам восстановления информации, он задал, мне стало интересно вот и взялся.
А тут момент я не понял:
PORTB |= (A >> 3) & 4; // 5й бит переменной A выставляем на PD2, 4 = 0b00000100
имелся ввиду не 5й бит а 3й или я чет не так понимаю
И при таком варианте порт при каждом выводе конкретного бита надо передернуть, а в моем случае значения там должны висеть пока ручка резистора не крутанется.
Абсолютно верно СКОРОСТЬ!
А хитрости никакой нет, преподу демонстрационная модель по алгоритмам восстановления информации, он задал, мне стало интересно вот и взялся.
А тут момент я не понял:
PORTB |= (A >> 3) & 4; // 5й бит переменной A выставляем на PD2, 4 = 0b00000100
имелся ввиду не 5й бит а 3й или я чет не так понимаю
И при таком варианте порт при каждом выводе конкретного бита надо передернуть, а в моем случае значения там должны висеть пока ручка резистора не крутанется.
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
Тут пятый бит сдвигается на 2ую позицию, остальные биты очищаются. А потом результат этого звига и лог. ИЛИ с содержимым порта B в этот самый порт и заносится, те PORTB = PORTB | ((A >> 3) & 4);
А как без здвига сделать я не знаю, разве что с логическими операциями помудрить, но что то сомневаюсь что там быстрее выйдет. А какие требования к скорости обработки? Ведь сдвиг на даже на 8 позиций займет 8 тактов, что при тактовой частоте 4МГц будет где то 2 мкс. Не так уж долго.
А как без здвига сделать я не знаю, разве что с логическими операциями помудрить, но что то сомневаюсь что там быстрее выйдет. А какие требования к скорости обработки? Ведь сдвиг на даже на 8 позиций займет 8 тактов, что при тактовой частоте 4МГц будет где то 2 мкс. Не так уж долго.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
Можно так попробовать
Код: Выделить всё
typedef struct {
unsigned char Bit0:1,
Bit1:1,
Bit2:1,
Bit3:1,
Bit4:1,
Bit5:1,
Bit6:1,
Bit7:1;
} bitstruct;
typedef union {
unsigned char cval;
bitstruct bval;
} CBTYPE;
void main(void)
{
CBTYPE a;
a.cval=0x55;//ваше значение
PORTB.0 = a.bval.Bit1;
PORTB.1 = a.bval.Bit3;
PORTB.2 = a.bval.Bit5;
PORTB.3 = a.bval.Bit7;
}
-
dimm1985
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Вс мар 20, 2011 17:09:31
- Откуда: Киев
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
ТО ЧТО НАДО! спасибо всем за помощь.
Проверил, всё работает, не всё понял (как работает) но думаю разберусь.
думаю тему можно закрывать.
Проверил, всё работает, не всё понял (как работает) но думаю разберусь.
думаю тему можно закрывать.
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
Ну... с точки зрения синтаксиса языка все просто. А вот как это на физическом уровне реализовано - это уже вопрос. Скоее всего теми же сдвигами. Хотя может и нет, надо бинарник дизасемблировать и смотреть.
-
dimm1985
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Вс мар 20, 2011 17:09:31
- Откуда: Киев
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
имелось ввиду именно с точки зрения синтаксиса не понимаю, не хватает описания
Bit0:1 // ........
bitstruct // ......
CBTYPE //......
Bit0:1 // ........
bitstruct // ......
CBTYPE //......
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
здравствуйте! не стал заводить новую тему.
мне непонятна запись следуюшего вида
PORTB |= (A >> 3) & 4;
в пиках чтобу установить значение на линии достаточно написать RB0 = 1; или RBO=0; или PORTB = 0b10000000;
скажите пожалуйста как реализовать это в авр? скажите, как
установить на конкретной линии значение
отправить число целиком в порт
прочитать состоянии на линии.
СПАСИБО ЗА ПОМОЩ!
мне непонятна запись следуюшего вида
PORTB |= (A >> 3) & 4;
в пиках чтобу установить значение на линии достаточно написать RB0 = 1; или RBO=0; или PORTB = 0b10000000;
скажите пожалуйста как реализовать это в авр? скажите, как
установить на конкретной линии значение
отправить число целиком в порт
прочитать состоянии на линии.
СПАСИБО ЗА ПОМОЩ!
-
dimm1985
- Первый раз сказал Мяу!
- Сообщения: 39
- Зарегистрирован: Вс мар 20, 2011 17:09:31
- Откуда: Киев
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
vovik15 писал(а):в пиках чтобу установить значение на линии достаточно написать RB0 = 1; или RBO=0; или PORTB = 0b10000000;
скажите пожалуйста как реализовать это в авр? скажите, как
установить на конкретной линии значение
отправить число целиком в порт
прочитать состоянии на линии.
СПАСИБО ЗА ПОМОЩ!
to vovik15
void main(void)
DDRB=0xFF; // говорим что порт В выход, для входа 0x00
PORTB.1=1; // на пин B1 установится высокий уровень
PORTB.0=0;// аналогично
PORTB=0b11111110; // что равносильно 0xFE и установит на все пины кроме PB0 высокий уровень
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
спасибо вам.
а все - же
зачем чтобы вывести число в порт используют сдвиг?
а все - же
зачем чтобы вывести число в порт используют сдвиг?
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
Для вывода в порт - незачем. Читайте тему. Там нужно не просто вывести, а еще и биты по хитрому перемешать.
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
спасибо!
а где можно прочитать, о том ,как использовать таймер для динамической индикации? в mega8
а где можно прочитать, о том ,как использовать таймер для динамической индикации? в mega8
- Goodefine
- Держит паяльник хвостом
- Сообщения: 906
- Зарегистрирован: Ср апр 16, 2008 13:22:54
- Откуда: Приднестровье, Тирасполь
Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)
ksv82 писал(а): А вот как это на физическом уровне реализовано - это уже вопрос. Скоее всего теми же сдвигами...
Вообще то, любой мало-мальски приличный компилятор, конструкцию типа
Код: Выделить всё
PORTX|=1<<PIN;
Сделает с помощью одной команды типа sbi за два такта. Без всяких сдвигов... А вот что касается битовых полей - тут компилятор может и огородами пойти...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...