Страница 1 из 2

Пины и массив

Добавлено: Вт окт 07, 2008 03:35:23
Simba
Подскажите пожалуйста как собрать пины в массив чтоб опрашивать через изменение индекса? В PIC C Compiler всё просто, а в CodeVisionAVR что - то не получается.

Добавлено: Вт окт 07, 2008 07:13:28
gan
А так:

Код: Выделить всё

 for (i=0;i<8;i++) {
if (PORTD & (1<<i)) Bit[i]=1; 
else Bit[i]=0;
                   }

Добавлено: Вт окт 07, 2008 07:32:12
mr.Kirill
gan писал(а):А так:

Код: Выделить всё

 for (i=0;i<8;i++) {
if (PORTD & (1<<i)) Bit[i]=1; 
else Bit[i]=0;
                   }
Для "опроса" все же по-моему правильнее использовать PIND, а не PORTD?

Добавлено: Вт окт 07, 2008 08:34:11
gan
Да, вы правы. Я тоже пока в процессе перехода с PIC-ов на AVR.

Добавлено: Вт окт 07, 2008 09:41:59
Krik99
можно и так для Code Vision AVR

Код: Выделить всё

 for (i=0;i<8;i++) { 
byt[i]=PIND & (1<<i);  
}

Добавлено: Вт окт 07, 2008 12:56:44
Simba
Пожалуйста внимательнее читайте вопрос. Я спрашивал не то как организовать опрос пинов одного порта а можно ли в CodeVisionAVR создать из пинов различных портов один массив чтобы обращатся к ним как к элементу массива. В PIC C Compiler это можно, а как в CodeVisionAVR?

Добавлено: Вт окт 07, 2008 13:43:22
mr.Kirill
Simba писал(а):Пожалуйста внимательнее читайте вопрос. Я спрашивал не то как организовать опрос пинов одного порта а можно ли в CodeVisionAVR создать из пинов различных портов один массив чтобы обращатся к ним как к элементу массива. В PIC C Compiler это можно, а как в CodeVisionAVR?
Изначально формулируйте яснее что Вы хотите получить в ответе.
Приведенные варианты отвечают на поставленный в первом посте вопрос, разве не так?
А сейчас Вы уже задали второй вопрос.

Добавлено: Вт окт 07, 2008 14:12:51
Simba
mr.Kirill писал(а):[quote=Изначально формулируйте яснее что Вы хотите получить в ответе.
Приведенные варианты отвечают на поставленный в первом посте вопрос, разве не так?
А сейчас Вы уже задали второй вопрос.
Я писал " чтобы опрашивать через изменение индекса". Приведённые вырианты разве делают это? По моему здесь просто собирается состояние пинов порта в массив. Мне казалось что вопрос поставлен достаточно ясно, но как говорится со стороны виднее.

Добавлено: Вт окт 07, 2008 14:37:38
ARV
не знаю, как там оно в PIC C делается, но можно сделать аналог так:

Код: Выделить всё

// описание нового типа "пин порта"
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;
P.S. предложенный код проверен в WinAVR

Добавлено: Вт окт 07, 2008 14:46:27
kent.a
А можно увидеть пример того что нужно, как это делается на пиках. тогда и недопонимания все исчезнут.

Добавлено: Вт окт 07, 2008 15:01:03
Simba
В PICCC можно например так:
short const cannel[] ={PIN_G3, PIN_E1, PIN_H3, PIN_H2, PIN_H0, PIN_H1};
и всё.
Спасибо за ответ, попробую.

Добавлено: Вт окт 07, 2008 16:17:02
Simba
ARV писал(а):не знаю, как там оно в PIC C делается, но можно сделать аналог так:

Код: Выделить всё

// описание нового типа "пин порта"
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;
P.S. предложенный код проверен в WinAVR

К сожалению код не компилируется в CodeVision, ошибка:
operand type 'sfrb' is incompatible with the '&' operator

Добавлено: Вт окт 07, 2008 16:45:42
ARV
Simba писал(а):К сожалению код не компилируется в CodeVision, ошибка:
operand type 'sfrb' is incompatible with the '&' operator
потому что "умный" CVAVR обращается к порту, как к порту, а WinAVR - как к ячейке памяти :). т.е. "адрес порта" действительно несуразица для Си, а адрес "ячейки" - вполне законная вещь.

Добавлено: Вт окт 07, 2008 16:57:37
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);
...

Добавлено: Вт окт 07, 2008 17:15:50
Simba
Вообще то я считаю, что компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими. Придется видимо осваивать IAR, там с портами вроде тоже не очень, макросы какие-то, но считается более профессиональным, наверное глюков будет меньше.

Добавлено: Вт окт 07, 2008 17:17:21
Simba
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);
...
Вот именно так я и сделал :))

Добавлено: Вт окт 07, 2008 17:21:46
Goodefine
Simba писал(а):...компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими...
Далеко не все компиляторы допускают запись вроде:

Код: Выделить всё

result=PINA.0;

Добавлено: Вт окт 07, 2008 17:33:51
ARV
Simba писал(а):Вообще то я считаю, что компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими. Придется видимо осваивать IAR, там с портами вроде тоже не очень, макросы какие-то, но считается более профессиональным, наверное глюков будет меньше.
осваивайте WinAVR - на небольших проектах разницы не заметите, а на больших - IAR делает на несколько процентов более оптимальный код (по слухам)... зато WinAVR бесплатный, а IAR - пиратствовать надо...

Добавлено: Вт окт 07, 2008 17:49:49
Simba
Поюзаю месяц триал, если понравится поставлю перед моей конторой вопрос о покупке, откажкт - буду думать. WinAvr отпугнул недружественным для меня интерфейсом . Я не линуксоид, и не хочется тратить время и силы на освоение "чуждой" идеологии.

Добавлено: Вт окт 07, 2008 18:54:55
MetEl
Goodefine писал(а):
Simba писал(а):...компиляторы для МК должны затачиваться на удобство работы с портами, а CodeVision что - то не особо этим блещет по сравнению с другими...
Далеко не все компиляторы допускают запись вроде:

Код: Выделить всё

result=PINA.0;
Не плохо бы было, если б они задавали по больше "вопросов".