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

 
 
 
Reply to this topicStart new topic
> Полезные макросы в 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
MALLOY2
сообщение Oct 15 2005, 08:41
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



А чем тибе такие макросы не устраивают


#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define REVERSEBIT(ADDRESS,BIT) (ADDRESS^= (1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))



SETBIT(DDRA,0 ) //установить пин 0 порта А на выход

CLEARBIT(DDRB,1) //установить пин 1 порта В на ввод
Go to the top of the page
 
+Quote Post
AlexOr
сообщение Oct 15 2005, 10:34
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 89
Регистрация: 30-12-04
Из: Санкт-Петербург
Пользователь №: 1 754



Код
//*******************************************************************************
//Аппаратно независимое пространство ввода-вывода.
//*******************************************************************************
#define BIT(x) (1 << (x))

#define _PORT_(a) PORT##a
#define _PIN_(a) PIN##a
#define _DDR_(a) DDR##a

#define _PORT(a) _PORT##_(a)
#define _PIN(a) _PIN##_(a)
#define _DDR(a) _DDR##_(a)

#define SETDDR(x) (_DDR(x##p)|=BIT(x##b))
#define CLRDDR(x) (_DDR(x##p)&=~BIT(x##b))
#define TGLDDR(x) if (_DDR(x##p)&BIT(x##b)) _DDR(x##p)&=~BIT(x##b); else _DDR(x##p)|=BIT(x##b);
#define DDR(x) (_DDR(x##p)&BIT(x##b))

#define SETPORT(x) (_PORT(x##p)|=BIT(x##b))
#define CLRPORT(x) (_PORT(x##p)&=~BIT(x##b))
#define TGLPORT(x) if (_PORT(x##p)&BIT(x##b)) _PORT(x##p)&=~BIT(x##b); else _PORT(x##p)|=BIT(x##b);
#define PORT(x) (_PORT(x##p)&BIT(x##b))

#define PIN(x) (_PIN(x##p)&BIT(x##b))


//PORT A **********************************
#define OUT0p A
#define OUT0b 4

#define IN0p A
#define IN0b 5


//PORT B **********************************
#define OUT1p B
#define OUT1b 0

#define IN1p B
#define IN1b 1

//*******************************************************************************
//Далее не надо думать на каком порте находится нужный сигнал.
//*******************************************************************************

SETDDR(OUT0); //установка на выход
SETDDR(OUT1); //установка на выход
CLRDDR(IN0); //установка на вход
CLRDDR(IN1); //установка на вход

SETPORT(OUT0); //вывод лог. 1
CLRPORT(OUT1); //вывод лог. 0
SETPORT(IN0); //включение pull-up
TGLPORT(OUT0); //переключение состояния выходного сигнала

if (PIN(IN0)) SETPORT(OUT1); //проверка состояния пина


Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Oct 15 2005, 12:23
Сообщение #4


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

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



Я было уже решил поставленную задачу:
#define IN0 0
#define IN1 1
#define OUT0 2
#define OUT1 3
#define PortA 4
#define PortB 5
#define PortC 6
#define PortD 7
#define SetupBit(Port,Bit,Direction)\
{\
if (Port == PortA && Direction == IN0) {CLRBIT(DDRA,Bit);CLRBIT(PORTA,Bit);}\
if (Port == PortA && Direction == IN1) {CLRBIT(DDRA,Bit);SETBIT(PORTA,Bit);}\
if (Port == PortA && Direction == OUT0) {SETBIT(DDRA,Bit);CLRBIT(PORTA,Bit);}\
if (Port == PortA && Direction == OUT1) {SETBIT(DDRA,Bit);SETBIT(PORTA,Bit);}\
\
if (Port == PortB && Direction == IN0) {CLRBIT(DDRB,Bit);CLRBIT(PORTB,Bit);}\
if (Port == PortB && Direction == IN1) {CLRBIT(DDRB,Bit);SETBIT(PORTB,Bit);}\
if (Port == PortB && Direction == OUT0) {SETBIT(DDRB,Bit);CLRBIT(PORTB,Bit);}\
if (Port == PortB && Direction == OUT1) {SETBIT(DDRB,Bit);SETBIT(PORTB,Bit);}\
\
if (Port == PortC && Direction == IN0) {CLRBIT(DDRC,Bit);CLRBIT(PORTC,Bit);}\
if (Port == PortC && Direction == IN1) {CLRBIT(DDRC,Bit);SETBIT(PORTC,Bit);}\
if (Port == PortC && Direction == OUT0) {SETBIT(DDRC,Bit);CLRBIT(PORTC,Bit);}\
if (Port == PortC && Direction == OUT1) {SETBIT(DDRC,Bit);SETBIT(PORTC,Bit);}\
\
if (Port == PortD && Direction == IN0) {CLRBIT(DDRD,Bit);CLRBIT(PORTD,Bit);}\
if (Port == PortD && Direction == IN1) {CLRBIT(DDRD,Bit);SETBIT(PORTD,Bit);}\
if (Port == PortD && Direction == OUT0) {SETBIT(DDRD,Bit);CLRBIT(PORTD,Bit);}\
if (Port == PortD && Direction == OUT1) {SETBIT(DDRD,Bit);SETBIT(PORTD,Bit);}\
}

Но здесь есть ошибка. Дело в том, что записи типа PORTA,PORTB и т. п. являются нечисловыми и следовательно при компиляции вышеуказанного выдаются ошибки. Вот если бы это преодолеть...
Go to the top of the page
 
+Quote Post
ivainc1789
сообщение Oct 15 2005, 12:25
Сообщение #5


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

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



То есть желательно было бы не определять специально дубликаты типа PortA, PortB и т. д. ...
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Oct 15 2005, 12:35
Сообщение #6


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Тогда зделай так.

предположим на PORTA.0 и PORTB.1 весят светодиоды LEDR и LEDG

обьявим из так

#define LEDR ((PORTA<<8) | 0) //все дефайны имеют тип инт вот и будем в старшей хранить порт в младшей пин

#define LEDG ((PORTB<<8) | 1)


теперь макрос по управлению такими дефайнами

#define SETPORT(port) SETBIT ((port>>8),(port&0x00FF))
#define CLEARPORT(port) CLEARBIT ((port>>8),(port&0x00FF))


Пример
SETPORT(LEDG);
CLEARPORT(LEDR);
Go to the top of the page
 
+Quote Post
Old1
сообщение Oct 15 2005, 20:02
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 13th July 2025 - 21:01
Рейтинг@Mail.ru


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