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

Профессионал
    
Группа: Свой
Сообщений: 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 тяжеловато...
|
|
|
|
|
Oct 15 2005, 10:34
|
Частый гость
 
Группа: Свой
Сообщений: 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); //проверка состояния пина … … …
|
|
|
|
|
Oct 15 2005, 12:23
|

Профессионал
    
Группа: Свой
Сообщений: 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 и т. п. являются нечисловыми и следовательно при компиляции вышеуказанного выдаются ошибки. Вот если бы это преодолеть...
|
|
|
|
|
Oct 15 2005, 20:02
|

Знающий
   
Группа: Свой
Сообщений: 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) } попробовал в симуляторе, вроде работает, только не рационально так память забивать, уж лучше это оформить в виде функции... или руками все прописать...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|