| Автор |
Съобщение |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 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 |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Видях такъв ред за това ,но не върши работа.Какво е вашето мнение.
if(Temp&(1<<i)==0)
{
..............
}
|
| Съб Апр 21, 2007 10:35 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
трябва да работи. Тялото се изпълнява ако съответния бит е 0.
тялото се изпълнява ако съответния бит е 1
тези конструкции работят на всички компилатори без изключение
|
| Съб Апр 21, 2007 10:56 am |
|
 |
|
danov
Ранг: Минаващ
Регистриран на: Вто Ное 16, 2004 4:43 pm Мнения: 85 Местоположение: София
|
А защо не ти върши работа? Точките ще се изпълнят само ако бит i е 0.
П.П. Изпревариха ме
Последна промяна danov на Съб Апр 21, 2007 11:03 am, променена общо 1 път
|
| Съб Апр 21, 2007 11:02 am |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 5:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Пак ще пробвам да не би грешката да е другаде
|
| Съб Апр 21, 2007 11:03 am |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 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 |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 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 |
|
 |
|
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 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 |
|
 |
|
danov
Ранг: Минаващ
Регистриран на: Вто Ное 16, 2004 4:43 pm Мнения: 85 Местоположение: София
|
трябва да е:
или трябва да си оправиш Keycodes.
|
| Съб Апр 21, 2007 12:39 pm |
|
|