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

 
 
 
Reply to this topicStart new topic
> Как использовать разные лапы в одной функции
Andrey_M
сообщение Nov 20 2012, 18:39
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 11-03-05
Из: Подмосковье
Пользователь №: 3 260



Доброго времени суток.
Господа подскажите как лучше писать код когда одна и та же функция должна
использовать разные лапы процессора?

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

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

Заранее спасибо всем откликнувшимся.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Nov 20 2012, 20:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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)

}

?
Go to the top of the page
 
+Quote Post
Herz
сообщение Nov 20 2012, 21:02
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(Andrey_M @ Nov 20 2012, 20:39) *
Получается пошло писать
кучу абсолютно одинаковых CASE отличающихся только тем какая лапа

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

Зачем? Функция должна быть одной. Какой "лапой ей дрыгать" определяется предварительным дефайном или передачей параметров в функцию, в зависимости от того, как и когда Вам нужно делать этот выбор.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Nov 20 2012, 21:27
Сообщение #4


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



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


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Andrey_M
сообщение Nov 21 2012, 04:10
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 11-03-05
Из: Подмосковье
Пользователь №: 3 260



Прошу прощения МК использую PIC16F886 компилятор HiTech.
Порт в данном примере PORTA выводы 0 и 1. В функцию передаю номер вывода которым надо пошевелить.
Движения одинаковые переключения вход-выход и установить 0 или 1.
не могу нащупать как с помощью #define переопределить ногу в зависимости от переданного функции номера.
Интересует принцип как это сделать и в случае с использованием одного порта и разных.

Спасибо откликнувшимся.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 21 2012, 05:52
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

а НИКАК. #define это директива компиляции, в рантайме все уже жестко определено и "зацементировано".
Чем case не нравится?
Вполне стандартное решение.
Альтернатива - передавать вместо номера непосредственно "ногу", то есть маску, а в функции накладывать, но это как раз изврат.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Andrey_M
сообщение Nov 21 2012, 16:54
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 11-03-05
Из: Подмосковье
Пользователь №: 3 260



Спасибо MrYuran. Я надеялся что можно выкрутиться используя что нибудь типа #if.
CASE я сейчас и использую. Просто CASE получаются очень большие это интерфейс 1-WARE термодатчиков
мне они нужны на нескольких лапах одной линией не пойдет. А там команды прием данных подсчет CRC.
Вот и получается куча больших CASE где все одинаково, меняются только ЛАПЫ и TRISы.
А маски действительно изврат очень не хочется их использовать.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 21 2012, 18:17
Сообщение #8


;
******

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



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


Сообщение отредактировал _Pasha - Nov 21 2012, 18:18
Go to the top of the page
 
+Quote Post
Andrey_M
сообщение Nov 21 2012, 18:25
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 11-03-05
Из: Подмосковье
Пользователь №: 3 260



Спасибо Pasha. Компилер понимает все работает просто хотелось сократить саму писанину (копирование вставку исправление) .
Go to the top of the page
 
+Quote Post

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

 


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


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