Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Индексиране на битове от променлива в CodevisionAVR
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=4082
Страница 1 от 1

Автор:  Ugeen [ Съб Апр 21, 2007 10:30 am ]
Заглавие:  Индексиране на битове от променлива в CodevisionAVR

Колеги до сега не ми се беше налагало да правя проверка дали някой бит от променлива е 0 или 1 в C (CodevisionAVR).Още по-вече, че ми се налага да ползвам индекс който да указва номера на бита който ще проверявам.
Примерно имам дефинирана променлива :

unsigned char Temp;

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

Автор:  Ugeen [ Съб Апр 21, 2007 10:35 am ]
Заглавие: 

Видях такъв ред за това ,но не върши работа.Какво е вашето мнение.

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

Автор:  Nikola Kirov [ Съб Апр 21, 2007 10:56 am ]
Заглавие: 

трябва да работи. Тялото се изпълнява ако съответния бит е 0.

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

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

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

Автор:  danov [ Съб Апр 21, 2007 11:02 am ]
Заглавие: 

Ugeen написа:
Видях такъв ред за това ,но не върши работа.Какво е вашето мнение.

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

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

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

Автор:  Ugeen [ Съб Апр 21, 2007 11:03 am ]
Заглавие: 

Пак ще пробвам да не би грешката да е другаде

Автор:  Ugeen [ Съб Апр 21, 2007 11:43 am ]
Заглавие: 

За да е по-ясно мъча се да сканирам една клавиатура с 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 ли ме лъже,не мога да разбера.

Автор:  Nikola Kirov [ Съб Апр 21, 2007 12:00 pm ]
Заглавие: 

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

Автор:  Ugeen [ Съб Апр 21, 2007 12:21 pm ]
Заглавие: 

Съгласен съм с някои забележки ,но в 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:

}

Автор:  danov [ Съб Апр 21, 2007 12:39 pm ]
Заглавие: 

Ugeen написа:
i=((row*4)+col);


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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/