Пины и массив
Подскажите пожалуйста как собрать пины в массив чтоб опрашивать через изменение индекса? В PIC C Compiler всё просто, а в CodeVisionAVR что - то не получается.
- Реклама
А так:
Код: Выделить всё
for (i=0;i<8;i++) {
if (PORTD & (1<<i)) Bit[i]=1;
else Bit[i]=0;
}Для "опроса" все же по-моему правильнее использовать PIND, а не PORTD?gan писал(а):А так:Код: Выделить всё
for (i=0;i<8;i++) { if (PORTD & (1<<i)) Bit[i]=1; else Bit[i]=0; }
Да, вы правы. Я тоже пока в процессе перехода с PIC-ов на AVR.
можно и так для Code Vision AVR
Код: Выделить всё
for (i=0;i<8;i++) {
byt[i]=PIND & (1<<i);
}
- Реклама
Изначально формулируйте яснее что Вы хотите получить в ответе.Simba писал(а):Пожалуйста внимательнее читайте вопрос. Я спрашивал не то как организовать опрос пинов одного порта а можно ли в CodeVisionAVR создать из пинов различных портов один массив чтобы обращатся к ним как к элементу массива. В PIC C Compiler это можно, а как в CodeVisionAVR?
Приведенные варианты отвечают на поставленный в первом посте вопрос, разве не так?
А сейчас Вы уже задали второй вопрос.
Я писал " чтобы опрашивать через изменение индекса". Приведённые вырианты разве делают это? По моему здесь просто собирается состояние пинов порта в массив. Мне казалось что вопрос поставлен достаточно ясно, но как говорится со стороны виднее.mr.Kirill писал(а):[quote=Изначально формулируйте яснее что Вы хотите получить в ответе.
Приведенные варианты отвечают на поставленный в первом посте вопрос, разве не так?
А сейчас Вы уже задали второй вопрос.
не знаю, как там оно в PIC C делается, но можно сделать аналог так:
P.S. предложенный код проверен в WinAVR
Код: Выделить всё
// описание нового типа "пин порта"
typedef struct{
char * port;
char mask;
} pin_struct;
// массив "пинов" разных портов
pin_struct pin_array[] = {
{&PINA, (1<<PA0)}, // нулевой бит порта А
{&PINB, (1<<PB4)}, // 4-й бит порта В
{&PINC, (1<<PC3)} // 3-й бит порта С
};
BOOL result; // булева переменная - TRUE или FALSE
// теперь обращение к третьему элементу массива pin_array[]
result = (*(pin_array[2].port) & pin_array[2].mask) != 0;
Последний раз редактировалось ARV Вт окт 07, 2008 16:09:20, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV писал(а):не знаю, как там оно в PIC C делается, но можно сделать аналог так:P.S. предложенный код проверен в WinAVRКод: Выделить всё
// описание нового типа "пин порта" typedef struct{ char * port; char mask; } pin_struct; // массив "пинов" разных портов pin_struct pin_array[] = { {&PINA, (1<<PA0)}, // нулевой бит порта А {&PINB, (1<<PB4)}, // 4-й бит порта В {&PINC, (1<<PC3)} // 3-й бит порта С }; BOOL result; // булева переменная - TRUE или FALSE // теперь обращение к третьему элементу массива pin_array[] result = (*(pin_array[2].port) & pin_array[2].mask) != 0;
К сожалению код не компилируется в CodeVision, ошибка:
operand type 'sfrb' is incompatible with the '&' operator
потому что "умный" CVAVR обращается к порту, как к порту, а WinAVR - как к ячейке памятиSimba писал(а):К сожалению код не компилируется в CodeVision, ошибка:
operand type 'sfrb' is incompatible with the '&' operator
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Если умный CAVR ругается, то почему не сделать тупо, просто и надежно, как табуретка...
Код: Выделить всё
...
//////////////////////////////////////////////////
char pin_result=0;
char i=0; //counter
//////////////////////////////////////////////////
char pin_read(char pin_number) {
char result=0;
switch (pin_number){// здесь цифрам задаем соответствие пинам
//------------------------
case 0:
return result=PINA.0;
break;
//------------------------
case 1:
return result=PINA.1;
break;
//-------------------------
case 2:
return result=PINB.3;
break;
//-------------------------
case 3:
return result=PINB.4;
break;
};
}
...
//опрос:
pin_result = pin_read(i);
...
Вообще то я считаю, что компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими. Придется видимо осваивать IAR, там с портами вроде тоже не очень, макросы какие-то, но считается более профессиональным, наверное глюков будет меньше.
Вот именно так я и сделалGoodefine писал(а):Если умный CAVR ругается, то почему не сделать тупо, просто и надежно, как табуретка...Код: Выделить всё
... ////////////////////////////////////////////////// char pin_result=0; char i=0; //counter ////////////////////////////////////////////////// char pin_read(char pin_number) { char result=0; switch (pin_number){// здесь цифрам задаем соответствие пинам //------------------------ case 0: return result=PINA.0; break; //------------------------ case 1: return result=PINA.1; break; //------------------------- case 2: return result=PINB.3; break; //------------------------- case 3: return result=PINB.4; break; }; } ... //опрос: pin_result = pin_read(i); ...
Далеко не все компиляторы допускают запись вроде:Simba писал(а):...компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими...
Код: Выделить всё
result=PINA.0;
осваивайте WinAVR - на небольших проектах разницы не заметите, а на больших - IAR делает на несколько процентов более оптимальный код (по слухам)... зато WinAVR бесплатный, а IAR - пиратствовать надо...Simba писал(а):Вообще то я считаю, что компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими. Придется видимо осваивать IAR, там с портами вроде тоже не очень, макросы какие-то, но считается более профессиональным, наверное глюков будет меньше.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Не плохо бы было, если б они задавали по больше "вопросов".Goodefine писал(а):Далеко не все компиляторы допускают запись вроде:Simba писал(а):...компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими...Код: Выделить всё
result=PINA.0;
простое чмо, выдумщик


