Andrey_M 0 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба Доброго времени суток. Господа подскажите как лучше писать код когда одна и та же функция должна использовать разные лапы процессора? Например: -------------------------------------- #define q0 RA0 #define q1 RA1 #define out0 TRISA0 #define out1 TRISA1 -------------------------------------------------------------------------- void Riad (datch) { q0=q1=1; out0=out1=0; switch (datch) { case 0: q0=0; out0=1; white(15); out0=0; break; case 1: q1=0; out1=1; white(15); out1=0; break; } } -------------------------------------------------------------------------- Не судите строго код только для пояснения вопроса. Получается пошло писать кучу абсолютно одинаковых CASE отличающихся только тем какая лапа процессора будет дрыгаться. Подскажите пожалуйста как это делается правильно. Заранее спасибо всем откликнувшимся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба ---------------------------------------- Не судите строго код только для пояснения вопроса. Получается пошло писать кучу абсолютно одинаковых CASE отличающихся только тем какая лапа процессора будет дрыгаться. Подскажите пожалуйста как это делается правильно. Заранее спасибо всем откликнувшимся. Не совсем понятны детали того, что вам нужно... Какие у вас МК? ("профессиональные" наверное). На разных ли портах выводы? Может такое подойдёт: struct TOutCfg { volatile unsigned char *Out; unsigned char PinMask; }; struct TOutCfg OutCfg[3]={ {&PORTA, 1}, {&PORTB, 2}, {&PORTC, 4} }; void SetOut(unsigned char out_number, unsigned char state) { volatile unsigned char port=*OutCfg[out_number].Out; unsigned char mask=OutCfg[out_number].PinMask; port= (state) ? (port|mask) : (port&~mask); *OutCfg[out_number].Out=port; } int main() { SetOut(0, 1); SetOut(0, 0); SetOut(1, 1); SetOut(1, 0); SetOut(2, 1); SetOut(2, 0); while (1) } ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Herz 5 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба Получается пошло писать кучу абсолютно одинаковых CASE отличающихся только тем какая лапа процессора будет дрыгаться. Зачем? Функция должна быть одной. Какой "лапой ей дрыгать" определяется предварительным дефайном или передачей параметров в функцию, в зависимости от того, как и когда Вам нужно делать этот выбор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 20 ноября, 2012 Опубликовано 20 ноября, 2012 · Жалоба Макросы А. Волкова и их развитие. Если используете C++, то можно использовать шаблоны. Об этих возможностях были сообщеия на форуме, гляньте примеры из scmRTOS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrey_M 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Прошу прощения МК использую PIC16F886 компилятор HiTech. Порт в данном примере PORTA выводы 0 и 1. В функцию передаю номер вывода которым надо пошевелить. Движения одинаковые переключения вход-выход и установить 0 или 1. не могу нащупать как с помощью #define переопределить ногу в зависимости от переданного функции номера. Интересует принцип как это сделать и в случае с использованием одного порта и разных. Спасибо откликнувшимся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба не могу нащупать как с помощью #define переопределить ногу в зависимости от переданного функции номера. а НИКАК. #define это директива компиляции, в рантайме все уже жестко определено и "зацементировано". Чем case не нравится? Вполне стандартное решение. Альтернатива - передавать вместо номера непосредственно "ногу", то есть маску, а в функции накладывать, но это как раз изврат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrey_M 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Спасибо MrYuran. Я надеялся что можно выкрутиться используя что нибудь типа #if. CASE я сейчас и использую. Просто CASE получаются очень большие это интерфейс 1-WARE термодатчиков мне они нужны на нескольких лапах одной линией не пойдет. А там команды прием данных подсчет CRC. Вот и получается куча больших CASE где все одинаково, меняются только ЛАПЫ и TRISы. А маски действительно изврат очень не хочется их использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 (изменено) · Жалоба Да хоть пицот этих case, главное - чтобы предоставить компилятору возможность соптимизировать функцию до одной команды. Обычно подобное делается с помощью 1. указать функции, что она должна быть inline со всеми дополнительными приемами(если товарисчь компилер не понимает). 2. по возможности вызывать функцию с параметрами, не содержащими переменных. Изменено 21 ноября, 2012 пользователем _Pasha Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andrey_M 0 21 ноября, 2012 Опубликовано 21 ноября, 2012 · Жалоба Спасибо Pasha. Компилер понимает все работает просто хотелось сократить саму писанину (копирование вставку исправление) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться