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

Как использовать разные лапы в одной функции

Доброго времени суток.

Господа подскажите как лучше писать код когда одна и та же функция должна

использовать разные лапы процессора?

 

Например:

--------------------------------------

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

 

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

 

Заранее спасибо всем откликнувшимся.

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


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

----------------------------------------

Не судите строго код только для пояснения вопроса. Получается пошло писать

кучу абсолютно одинаковых 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)

}

?

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


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

Получается пошло писать

кучу абсолютно одинаковых CASE отличающихся только тем какая лапа

 

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

Зачем? Функция должна быть одной. Какой "лапой ей дрыгать" определяется предварительным дефайном или передачей параметров в функцию, в зависимости от того, как и когда Вам нужно делать этот выбор.

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


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

Макросы А. Волкова и их развитие. Если используете C++, то можно использовать шаблоны. Об этих возможностях были сообщеия на форуме, гляньте примеры из scmRTOS.

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


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

Прошу прощения МК использую PIC16F886 компилятор HiTech.

Порт в данном примере PORTA выводы 0 и 1. В функцию передаю номер вывода которым надо пошевелить.

Движения одинаковые переключения вход-выход и установить 0 или 1.

не могу нащупать как с помощью #define переопределить ногу в зависимости от переданного функции номера.

Интересует принцип как это сделать и в случае с использованием одного порта и разных.

 

Спасибо откликнувшимся.

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


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

не могу нащупать как с помощью #define переопределить ногу в зависимости от переданного функции номера.

а НИКАК. #define это директива компиляции, в рантайме все уже жестко определено и "зацементировано".

Чем case не нравится?

Вполне стандартное решение.

Альтернатива - передавать вместо номера непосредственно "ногу", то есть маску, а в функции накладывать, но это как раз изврат.

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


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

Спасибо MrYuran. Я надеялся что можно выкрутиться используя что нибудь типа #if.

CASE я сейчас и использую. Просто CASE получаются очень большие это интерфейс 1-WARE термодатчиков

мне они нужны на нескольких лапах одной линией не пойдет. А там команды прием данных подсчет CRC.

Вот и получается куча больших CASE где все одинаково, меняются только ЛАПЫ и TRISы.

А маски действительно изврат очень не хочется их использовать.

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


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

Да хоть пицот этих case, главное - чтобы предоставить компилятору возможность соптимизировать функцию до одной команды.

Обычно подобное делается с помощью

1. указать функции, что она должна быть inline со всеми дополнительными приемами(если товарисчь компилер не понимает).

2. по возможности вызывать функцию с параметрами, не содержащими переменных.

 

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

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


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

Спасибо Pasha. Компилер понимает все работает просто хотелось сократить саму писанину (копирование вставку исправление) .

 

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


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

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

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

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

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

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

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

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

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

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