Пины и массив
Добавлено: Вт окт 07, 2008 03:35:23
Подскажите пожалуйста как собрать пины в массив чтоб опрашивать через изменение индекса? В 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; }
Код: Выделить всё
for (i=0;i<8;i++) {
byt[i]=PIND & (1<<i);
}Изначально формулируйте яснее что Вы хотите получить в ответе.Simba писал(а):Пожалуйста внимательнее читайте вопрос. Я спрашивал не то как организовать опрос пинов одного порта а можно ли в CodeVisionAVR создать из пинов различных портов один массив чтобы обращатся к ним как к элементу массива. В PIC C Compiler это можно, а как в CodeVisionAVR?
Я писал " чтобы опрашивать через изменение индекса". Приведённые вырианты разве делают это? По моему здесь просто собирается состояние пинов порта в массив. Мне казалось что вопрос поставлен достаточно ясно, но как говорится со стороны виднее.mr.Kirill писал(а):[quote=Изначально формулируйте яснее что Вы хотите получить в ответе.
Приведенные варианты отвечают на поставленный в первом посте вопрос, разве не так?
А сейчас Вы уже задали второй вопрос.
Код: Выделить всё
// описание нового типа "пин порта"
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 писал(а):не знаю, как там оно в 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;
потому что "умный" CVAVR обращается к порту, как к порту, а WinAVR - как к ячейке памятиSimba писал(а):К сожалению код не компилируется в CodeVision, ошибка:
operand type 'sfrb' is incompatible with the '&' operator
Код: Выделить всё
...
//////////////////////////////////////////////////
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);
...
Вот именно так я и сделал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;