реклама на сайте
подробности

 
 
> сканирование портов
kisslove
сообщение Oct 6 2009, 06:50
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 3-09-06
Из: SPb
Пользователь №: 20 040



нид хелп

дано
Код
#define com1      PINA_Bit0
...
#define com8      PINA_Bit7

#define com9      PINC_Bit0
...
#define com16     PINC_Bit7


есть необходимость сканировать 16 пинов, как это сделать в цикле(си) ?
подозреваю что нужно использовать конструкцию перечислимого типа.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
acorn
сообщение Oct 6 2009, 06:57
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 28-11-05
Пользователь №: 11 495



На чем пишется, в смысле контроллер какой? Что хочется узнать о портах? Насколько быстро? Причем тут com?
Мало данных, с такой постановкой никто не поможет.
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 6 2009, 07:18
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(kisslove @ Oct 6 2009, 09:50) *
есть необходимость сканировать 16 пинов, как это сделать в цикле(си) ?
подозреваю что нужно использовать конструкцию перечислимого типа.

Вам (для начала) надо определиться с частотой скана, и понять, где можно обрабатывать пины поодиночке, а где - группами. К Си это отношения не имеет smile.gif
Go to the top of the page
 
+Quote Post
kisslove
сообщение Oct 6 2009, 07:25
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 3-09-06
Из: SPb
Пользователь №: 20 040



Цитата(acorn @ Oct 6 2009, 10:57) *
На чем пишется, в смысле контроллер какой? Что хочется узнать о портах? Насколько быстро? Причем тут com?
Мало данных, с такой постановкой никто не поможет.


си, атмега
com - просто дефайн для удобства
хочется написать универсальную конструкцию для сканирования
что-то вроде:

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

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


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

Цитата(_Pasha @ Oct 6 2009, 11:18) *
Вам (для начала) надо определиться с частотой скана, и понять, где можно обрабатывать пины поодиночке, а где - группами. К Си это отношения не имеет smile.gif


меня не интересует частота скана, она будет определяться частотой вызова ф-ии
мне нужно по вызову функции отсканировать N пинов, пины могут быть записаны в произвольном порядке от разных портов
например
Код
#define    com1    PINA_Bit7
#define    com2    PINF_Bit0
#define    com3    PINA_Bit1

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

Сообщение отредактировал kisslove - Oct 6 2009, 07:26
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 6 2009, 07:52
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(kisslove @ Oct 6 2009, 13:25) *
на громоздкость кода после компиляции мне всеравно )))


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

Код
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)
   ;// что-то сделать если на пине ноль
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
kisslove
сообщение Oct 6 2009, 07:58
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 3-09-06
Из: SPb
Пользователь №: 20 040



Цитата(AHTOXA @ Oct 6 2009, 11:52) *
Ну если такsmile.gif
Объявляете функции для чтения каждого пина:


спасибо, это конечно хорошо, но есть нюанс - привязка com к пину должна осуществляться дефайном, иначе чтобы поменять два пина слишком много править придется (((
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 6 2009, 09:50
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(kisslove @ Oct 6 2009, 11:58) *
спасибо, это конечно хорошо, но есть нюанс - привязка com к пину должна осуществляться дефайном, иначе чтобы поменять два пина слишком много править придется (((
Ну так о оберните это все дефайнами, если результат устраивает rolleyes.gif
Код
#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)
  ;// что-то сделать если на пине ноль
}
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 6 2009, 11:29
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Код
#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
     }

}

Должно быть и просто и быстро.
Go to the top of the page
 
+Quote Post
kisslove
сообщение Oct 9 2009, 05:28
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 3-09-06
Из: SPb
Пользователь №: 20 040



Спасибо ))
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016