Перейти к содержанию
    

сканирование портов

нид хелп

 

дано

#define com1      PINA_Bit0
...
#define com8      PINA_Bit7

#define com9      PINC_Bit0
...
#define com16     PINC_Bit7

 

есть необходимость сканировать 16 пинов, как это сделать в цикле(си) ?

подозреваю что нужно использовать конструкцию перечислимого типа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На чем пишется, в смысле контроллер какой? Что хочется узнать о портах? Насколько быстро? Причем тут com?

Мало данных, с такой постановкой никто не поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть необходимость сканировать 16 пинов, как это сделать в цикле(си) ?

подозреваю что нужно использовать конструкцию перечислимого типа.

Вам (для начала) надо определиться с частотой скана, и понять, где можно обрабатывать пины поодиночке, а где - группами. К Си это отношения не имеет :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На чем пишется, в смысле контроллер какой? Что хочется узнать о портах? Насколько быстро? Причем тут com?

Мало данных, с такой постановкой никто не поможет.

 

си, атмега

com - просто дефайн для удобства

хочется написать универсальную конструкцию для сканирования

что-то вроде:

 

unsigned char array[24] = {com1,...com24};

for (int i=0; i<24; i++)
{
   if (array[i] == 0)
    ;// что-то сделать если на пине ноль
}

 

будет ли подобная конструкция сканировать порты, или я что-то путаю в синтаксисе?

 

Вам (для начала) надо определиться с частотой скана, и понять, где можно обрабатывать пины поодиночке, а где - группами. К Си это отношения не имеет :)

 

меня не интересует частота скана, она будет определяться частотой вызова ф-ии

мне нужно по вызову функции отсканировать N пинов, пины могут быть записаны в произвольном порядке от разных портов

например

#define    com1    PINA_Bit7
#define    com2    PINF_Bit0
#define    com3    PINA_Bit1

на громоздкость кода после компиляции мне всеравно )))

Изменено пользователем kisslove

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на громоздкость кода после компиляции мне всеравно )))

 

Ну если так:)

Объявляете функции для чтения каждого пина:

 

int read_pin_1(void)
{
    if (com1) return 1;
    return 0;
}

...

int read_pin_n(void)
{
     if (comn) return 1;
     return 0;
}

 

потом заносите их в массив

 

typedef int (* pin_read_func)(void);

pin_read_func[] functions = 
{
    read_pin_1,
...
    read_pin_n
}

 

И опрашиваете:

 

for (int i=0; i<24; i++)
{
   if (functions[i]() == 0)
   ;// что-то сделать если на пине ноль
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну если так:)

Объявляете функции для чтения каждого пина:

 

спасибо, это конечно хорошо, но есть нюанс - привязка com к пину должна осуществляться дефайном, иначе чтобы поменять два пина слишком много править придется (((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо, это конечно хорошо, но есть нюанс - привязка com к пину должна осуществляться дефайном, иначе чтобы поменять два пина слишком много править придется (((
Ну так о оберните это все дефайнами, если результат устраивает :rolleyes:

#define    com1    PINA_Bit7
#define    com2    PINF_Bit0
#define    com3    PINA_Bit1

#define DEF_FUNC(num) \
int read_pin_##num() \
{ \
return com##num ? 1:0;
}

#define REF_FUNC(num) read_pin_##num ,

#define RUN(nm) nm(1) nm(2) nm(3) nm(4) nm(5) ..... nm(24)

typedef int (* pin_read_func)(void);

RUN(DEF_FUNC)

pin_read_func[] functions = { RUN(REF_FUNC) 0 };

...

for (int i=0; i<24; i++)
{
   if (functions[i]() == 0)
  ;// что-то сделать если на пине ноль
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define com1 7
#define com2 0
typedef struct
{
void *pin_port;
uint8_t pin_mask;
} com_descr_t;
static com_descr_t com_array[24]={{&PIND,(1<<com1)}, итд};
for(uint8_t j=0; j<24;j++)
{
   volatile uint8_t *ptr=com_array[j].pin_port;
   uint8_t msk = com_array[j].pin_mask;

   if(*ptr & msk)
     {//do something
     }
   else
     {// do other
     }

}

Должно быть и просто и быстро.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...