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

 
 
> Полезные макросы в IAR v4.11, облегчат нам жизнь!...
ivainc1789
сообщение Oct 14 2005, 19:09
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 175
Регистрация: 5-01-05
Пользователь №: 1 807



Возможно ли в IAR v4.11 определить следующие макросы:
SetupBit(PORTA,PA0,IN0);
SetupBit(PORTB,PB1,IN1);
SetupBit(PORTC,PC2,OUT0);
SetupBit(PORTD,PD3,OUT1);
Макросы определяют direction выводов портов.
Параметр1 - порт нужного бита;
Параметр2 - сам бит;
Параметр3 - нужная конфигурация: IN0=HiZ,IN1=PullupOn,OUT0=выход в 0,OUT1=выход в 1.

Это были бы очень удобные макросы. Но как я не пыхтел, написать не смог. Получилось только определить их как void функцию. А это занимает много памяти и времени. Казалось бы, простая задачка на условную компиляцию, но выразить это при определении через #define тяжеловато...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Old1
сообщение Oct 15 2005, 20:02
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(ivainc1789 @ Oct 14 2005, 22:09)
Возможно ли в IAR v4.11 определить следующие макросы:
  SetupBit(PORTA,PA0,IN0);
  SetupBit(PORTB,PB1,IN1);
  SetupBit(PORTC,PC2,OUT0);
  SetupBit(PORTD,PD3,OUT1);
Макросы определяют direction выводов портов.
Параметр1 - порт нужного бита;
Параметр2 - сам бит;
Параметр3 - нужная конфигурация: IN0=HiZ,IN1=PullupOn,OUT0=выход в 0,OUT1=выход в 1.

Это были бы очень удобные макросы. Но как я не пыхтел, написать не смог. Получилось только определить их как void функцию. А это занимает много памяти и времени. Казалось бы, простая задачка на условную компиляцию, но выразить это при определении через #define тяжеловато...
*


ИМХО можно, если до функции main или в хидере определить одну переменную и вот такой макрос:
Код
#define IN0 0
#define IN1 1
#define OUT0 3
#define OUT1 4
#define SetupBit(X,Y,Z) \
 {\
   P_port=(unsigned char*)(&X);\
   if(Z==IN0)\
   {\
     *P_port&=~(1<<Y);\
     *(P_port-1)&=~(1<<Y);\
   }\
   else if(Z==IN1)\
   {\
     *P_port|=(1<<Y);\
     *(P_port-1)&=~(1<<Y);\
   }\
   else if(Z==OUT0)\
   {\
     *P_port&=~(1<<Y);\
     *(P_port-1)|=(1<<Y);\
   }\
   else if(Z==OUT1)\
   {\
     *P_port|=(1<<Y);\
     *(P_port-1)|=(1<<Y);\
   }\
 }\

unsigned char* P_port;

//пример вызова
void main(void)
{
  SetupBit(PORTB,PB2,IN1)
  SetupBit(PORTB,PB3,OUT1)
}


попробовал в симуляторе, вроде работает, только не рационально так память забивать, уж лучше это оформить в виде функции... или руками все прописать...
Go to the top of the page
 
+Quote Post



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

 


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


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