Отговори на тема  [ 9 мнения ] 
Индексиране на битове от променлива в CodevisionAVR 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение Индексиране на битове от променлива в CodevisionAVR
Колеги до сега не ми се беше налагало да правя проверка дали някой бит от променлива е 0 или 1 в C (CodevisionAVR).Още по-вече, че ми се налага да ползвам индекс който да указва номера на бита който ще проверявам.
Примерно имам дефинирана променлива :

unsigned char Temp;

Искам да проверявам последователно всички битове (от 0-7) на клетка Temp
като ползвам цикъл и индексно указване номера на бита посредством индекс i,като при всеки кръг от цикъла индекса да нараства (i++).По принцип целта ми е да хвана номера на бита в Temp които е "0".Някой има ли идея как да стане това?


Съб Апр 21, 2007 10:30 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение 
Видях такъв ред за това ,но не върши работа.Какво е вашето мнение.

if(Temp&(1<<i)==0)
{
..............
}


Съб Апр 21, 2007 10:35 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
трябва да работи. Тялото се изпълнява ако съответния бит е 0.

Код:
if(Temp&(1<<i))
{
..............
}

тялото се изпълнява ако съответния бит е 1

тези конструкции работят на всички компилатори без изключение


Съб Апр 21, 2007 10:56 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 
Ugeen написа:
Видях такъв ред за това ,но не върши работа.Какво е вашето мнение.

if(Temp&(1<<i)==0)
{
..............
}

А защо не ти върши работа? Точките ще се изпълнят само ако бит i е 0.

П.П. Изпревариха ме


Последна промяна danov на Съб Апр 21, 2007 11:03 am, променена общо 1 път



Съб Апр 21, 2007 11:02 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение 
Пак ще пробвам да не би грешката да е другаде


Съб Апр 21, 2007 11:03 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение 
За да е по-ясно мъча се да сканирам една клавиатура с 4 реда и 3 колони(телефонна).Вързана е на PORTC на една ATMEGA8.Битовете от 0-3 са изходи ,а от 4-6 са входове с повдигащи резистори.(RESET е програмиран като вход)

flash char Keycodes[12]={'1','2','3','4','5','6','7','8','9','*','0','#'};
char Key;
unsigned char row,col,tmp,wait;




void Scankeypad(void)
{
for(row=0;row<4;row++)
{
PORTC=~(1<<row);
delay_us(100);
tmp=PORTC;
for(col=0;col<3;++col)
{
if(tmp&(1<<col+4)==0)
{
i=((row*4)+col);
Key=Keycodes[i];
goto Done;
}

}
}
Done:

}
Това е кода но не иска да ми пише в клетка Key и да го извежда на LCD-to.Този Proteus ли ме лъже,не мога да разбера.


Съб Апр 21, 2007 11:43 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Първо. Ти за AVR с Jtag не си ли чувал?
Второ. Нали се сещаш че виртуалния секс не е като истинския. Работата с Proteus е точно като виртуалния секс.
Трето. 1<<col+4 = (1<<col)+4 :)
Четвърто това PORTC=~(1<<row); вдига всички битове на PORTC. Ти на този порт имаш още един свободен пин. Внимавай да не го ползваш за изход :)


Съб Апр 21, 2007 12:00 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 16, 2006 5:20 pm
Мнения: 122
Местоположение: гр. Горна Оряховица
Мнение 
Съгласен съм с някои забележки ,но в ATMEGA8 ,PORTC е 7 bit.Преправих кода така,за да е по-сигурно.Намерих си и една грешка ,която е лош навик от PIC-овете. ( tmp=PORTC-грешно ,трябва да е tmp=PINC).Пак не иска да работи.При симулация ми дава на дисплея 1 и не реагира на бутоните въпреки че се виждат сините точки които обхождат редовете.Това col+4,показваше че четенето на колоните ще става от бит 4 нататък.

void Scankeypad(void)
{
for(row=0;row<4;row++)
{
PORTC=0xff;
PORTC&=~(1<<row);
delay_us(100);
tmp=PINC;
for(col=0;col<3;++col)
{
i=col+4;
if(tmp&(1<<i)==0)
{
i=((row*4)+col);
Key=Keycodes[i];
goto Done;
}

}
}
Done:

}


Съб Апр 21, 2007 12:21 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 
Ugeen написа:
i=((row*4)+col);


трябва да е:
Код:
i=((row*3)+col); 

или трябва да си оправиш Keycodes.


Съб Апр 21, 2007 12:39 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни