Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как использовать разные лапы в одной функции
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Andrey_M
Доброго времени суток.
Господа подскажите как лучше писать код когда одна и та же функция должна
использовать разные лапы процессора?

Например:
--------------------------------------
#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 отличающихся только тем какая лапа

процессора будет дрыгаться. Подскажите пожалуйста как это делается правильно.

Заранее спасибо всем откликнувшимся.
_Артём_
Цитата(Andrey_M @ Nov 20 2012, 20:39) *
----------------------------------------
Не судите строго код только для пояснения вопроса. Получается пошло писать
кучу абсолютно одинаковых 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
Цитата(Andrey_M @ Nov 20 2012, 20:39) *
Получается пошло писать
кучу абсолютно одинаковых CASE отличающихся только тем какая лапа

процессора будет дрыгаться.

Зачем? Функция должна быть одной. Какой "лапой ей дрыгать" определяется предварительным дефайном или передачей параметров в функцию, в зависимости от того, как и когда Вам нужно делать этот выбор.
mdmitry
Макросы А. Волкова и их развитие. Если используете C++, то можно использовать шаблоны. Об этих возможностях были сообщеия на форуме, гляньте примеры из scmRTOS.
Andrey_M
Прошу прощения МК использую PIC16F886 компилятор HiTech.
Порт в данном примере PORTA выводы 0 и 1. В функцию передаю номер вывода которым надо пошевелить.
Движения одинаковые переключения вход-выход и установить 0 или 1.
не могу нащупать как с помощью #define переопределить ногу в зависимости от переданного функции номера.
Интересует принцип как это сделать и в случае с использованием одного порта и разных.

Спасибо откликнувшимся.
MrYuran
Цитата(Andrey_M @ Nov 21 2012, 08:10) *
не могу нащупать как с помощью #define переопределить ногу в зависимости от переданного функции номера.

а НИКАК. #define это директива компиляции, в рантайме все уже жестко определено и "зацементировано".
Чем case не нравится?
Вполне стандартное решение.
Альтернатива - передавать вместо номера непосредственно "ногу", то есть маску, а в функции накладывать, но это как раз изврат.
Andrey_M
Спасибо MrYuran. Я надеялся что можно выкрутиться используя что нибудь типа #if.
CASE я сейчас и использую. Просто CASE получаются очень большие это интерфейс 1-WARE термодатчиков
мне они нужны на нескольких лапах одной линией не пойдет. А там команды прием данных подсчет CRC.
Вот и получается куча больших CASE где все одинаково, меняются только ЛАПЫ и TRISы.
А маски действительно изврат очень не хочется их использовать.
_Pasha
Да хоть пицот этих case, главное - чтобы предоставить компилятору возможность соптимизировать функцию до одной команды.
Обычно подобное делается с помощью
1. указать функции, что она должна быть inline со всеми дополнительными приемами(если товарисчь компилер не понимает).
2. по возможности вызывать функцию с параметрами, не содержащими переменных.
Andrey_M
Спасибо Pasha. Компилер понимает все работает просто хотелось сократить саму писанину (копирование вставку исправление) .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.