kisslove 0 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба нид хелп дано #define com1 PINA_Bit0 ... #define com8 PINA_Bit7 #define com9 PINC_Bit0 ... #define com16 PINC_Bit7 есть необходимость сканировать 16 пинов, как это сделать в цикле(си) ? подозреваю что нужно использовать конструкцию перечислимого типа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
acorn 0 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба На чем пишется, в смысле контроллер какой? Что хочется узнать о портах? Насколько быстро? Причем тут com? Мало данных, с такой постановкой никто не поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба есть необходимость сканировать 16 пинов, как это сделать в цикле(си) ? подозреваю что нужно использовать конструкцию перечислимого типа. Вам (для начала) надо определиться с частотой скана, и понять, где можно обрабатывать пины поодиночке, а где - группами. К Си это отношения не имеет :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kisslove 0 6 октября, 2009 Опубликовано 6 октября, 2009 (изменено) · Жалоба На чем пишется, в смысле контроллер какой? Что хочется узнать о портах? Насколько быстро? Причем тут 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 на громоздкость кода после компиляции мне всеравно ))) Изменено 6 октября, 2009 пользователем kisslove Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба на громоздкость кода после компиляции мне всеравно ))) Ну если так:) Объявляете функции для чтения каждого пина: 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) ;// что-то сделать если на пине ноль } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kisslove 0 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба Ну если так:) Объявляете функции для чтения каждого пина: спасибо, это конечно хорошо, но есть нюанс - привязка com к пину должна осуществляться дефайном, иначе чтобы поменять два пина слишком много править придется ((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба спасибо, это конечно хорошо, но есть нюанс - привязка 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) ;// что-то сделать если на пине ноль } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 6 октября, 2009 Опубликовано 6 октября, 2009 · Жалоба #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 } } Должно быть и просто и быстро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kisslove 0 9 октября, 2009 Опубликовано 9 октября, 2009 · Жалоба Спасибо )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться