Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
dimm1985
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вс мар 20, 2011 17:09:31
Откуда: Киев

Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение dimm1985 »

Доброго времени суток. Я у вас тут новый, правила прочел, надеюсь подружимся!
Такая задача, есть 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)

Сообщение ChipKiller »

dimm1985 писал(а):а вот как из числа выдернуть значение конкретного бита без массивов, сдвигов
.. это называется битовая маска и если номер бита переменной не соответствует номеру бита порта, то без сдвигов или других действий никак....
ksv82
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пт мар 18, 2011 12:41:09

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение ksv82 »

А чего такая боязнь сдвигов? Есть необходимость уложиться в крайне малые интервалы времени или просто религия не позволяет:) ? Например если из числа N нужен бит 3, то получить его можно вот так (N >> 3) & 1.
В вашем случае, например:

PORTB |= (A >> 3) & 4; // 5й бит переменной A выставляем на PD2, 4 = 0b00000100
Правда если в PD2 была единица лог. или ее не сбросит. Перед началом обработки значения PORTB надо очищать.

Если не секрет, зачем в таком хитром порядке значение ацп на порт выводить?
dimm1985
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вс мар 20, 2011 17:09:31
Откуда: Киев

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение dimm1985 »

Для начала спасибо за ОПЕРАТИВНЫЙ ответ! Приятно! Буду осваиваться тут у вас.

Абсолютно верно СКОРОСТЬ!
А хитрости никакой нет, преподу демонстрационная модель по алгоритмам восстановления информации, он задал, мне стало интересно вот и взялся.

А тут момент я не понял:

PORTB |= (A >> 3) & 4; // 5й бит переменной A выставляем на PD2, 4 = 0b00000100

имелся ввиду не 5й бит а 3й или я чет не так понимаю

И при таком варианте порт при каждом выводе конкретного бита надо передернуть, а в моем случае значения там должны висеть пока ручка резистора не крутанется.
ksv82
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пт мар 18, 2011 12:41:09

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение ksv82 »

Тут пятый бит сдвигается на 2ую позицию, остальные биты очищаются. А потом результат этого звига и лог. ИЛИ с содержимым порта B в этот самый порт и заносится, те PORTB = PORTB | ((A >> 3) & 4);

А как без здвига сделать я не знаю, разве что с логическими операциями помудрить, но что то сомневаюсь что там быстрее выйдет. А какие требования к скорости обработки? Ведь сдвиг на даже на 8 позиций займет 8 тактов, что при тактовой частоте 4МГц будет где то 2 мкс. Не так уж долго.
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение phanis »

Можно так попробовать


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

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)

Сообщение dimm1985 »

ТО ЧТО НАДО! спасибо всем за помощь.

Проверил, всё работает, не всё понял (как работает) но думаю разберусь.

думаю тему можно закрывать.
ksv82
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пт мар 18, 2011 12:41:09

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение ksv82 »

Ну... с точки зрения синтаксиса языка все просто. А вот как это на физическом уровне реализовано - это уже вопрос. Скоее всего теми же сдвигами. Хотя может и нет, надо бинарник дизасемблировать и смотреть.
dimm1985
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вс мар 20, 2011 17:09:31
Откуда: Киев

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение dimm1985 »

имелось ввиду именно с точки зрения синтаксиса не понимаю, не хватает описания

Bit0:1 // ........

bitstruct // ......

CBTYPE //......
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение phanis »

vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение vovik15 »

здравствуйте! не стал заводить новую тему.
мне непонятна запись следуюшего вида
PORTB |= (A >> 3) & 4;
в пиках чтобу установить значение на линии достаточно написать RB0 = 1; или RBO=0; или PORTB = 0b10000000;
скажите пожалуйста как реализовать это в авр? скажите, как
установить на конкретной линии значение
отправить число целиком в порт
прочитать состоянии на линии.
СПАСИБО ЗА ПОМОЩ!
dimm1985
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вс мар 20, 2011 17:09:31
Откуда: Киев

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение dimm1985 »

Теперь понял!
dimm1985
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Вс мар 20, 2011 17:09:31
Откуда: Киев

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение dimm1985 »

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 высокий уровень
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение vovik15 »

спасибо вам.
а все - же
зачем чтобы вывести число в порт используют сдвиг?
ksv82
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Пт мар 18, 2011 12:41:09

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение ksv82 »

Для вывода в порт - незачем. Читайте тему. Там нужно не просто вывести, а еще и биты по хитрому перемешать.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение vovik15 »

спасибо!
а где можно прочитать, о том ,как использовать таймер для динамической индикации? в mega8
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Как вывести бит числа на ногу порта? (ATmega8, CVAVR)

Сообщение Goodefine »

ksv82 писал(а): А вот как это на физическом уровне реализовано - это уже вопрос. Скоее всего теми же сдвигами...

Вообще то, любой мало-мальски приличный компилятор, конструкцию типа

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

PORTX|=1<<PIN;

Сделает с помощью одной команды типа sbi за два такта. Без всяких сдвигов... А вот что касается битовых полей - тут компилятор может и огородами пойти...
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Закрыто

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