AVR определить PINS & amp; ПОРТ в массиве

Я хочу определить пины и порты в массиве
например что-то вроде этого.

char a[3]={PINA.0,PINB.2,PORTC.4};

/***********************************/
if(a[0]==1) // equal to (PINA.0==1)
//do something

a[2]=1; // equal to PORTC.4=1;

Я знаю, что эти коды не верны, и хочу, чтобы ваша помощь написала правильный.
Мой компилятор — CodeVision.
Благодарю.

2

Решение

Если компилятор позволяет вам получить доступ к выводам с помощью PINA.0, тогда PINA может быть битовым полем. Битовые поля не имеют адресов.
С этим утверждением: char a[3]={PINA.0,PINB.2,PORTC.4}; вы храните булавку ценности в массиве. Итак, позже, когда вы пишете a[2]=1 Вы записываете 1 в скопированное значение регистра, а не в реальный регистр. Если вы хотите получить правильные результаты, вы должны работать непосредственно с регистрами или макросами.

//setting PINA.2 = 1
PINA |= 1<< 2;

Вы также можете определить макрос как

#define SET_BIT(PORT_NR,BIT) (PORT_NR |= (1<<BIT))
#define CLEAR_BIT(PORT_NR,BIT) (PORT_NR &= ~(1<<BIT))

и назовите это:

SET_BIT(PINA,2);
CLEAR_BIT(PINA,2);

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

void setBit(struct port_operation* a,unsigned char bit){
return a->_port |= (1<<bit);
}
void clearBit(struct port_operation* a,unsigned char bit){
return a->_port &= ~(1<<bit);
}typedef struct _port_operation{
unsigned char _port;
void(*set)(struct _port_operation* ,unsigned char);
void(*clear)(struct _port_operation* ,unsigned char);
}port_operation;

port_operation port_op_a;
port_op_a._port = PORTA;
port_op_a.set = setBit;
port_op_a.clear = clearBit;

port_operation port_op_b = port_op_a;
port_op_b._port = PORTB;

port_operation[2] = {port_op_a,port_op_b};

//set 1 to PORTA bit 1
port_operation[0].set(port_operation[0],1);
0

Другие решения

Я написал свои PIN-коды в функции pin ():

int pin(int c){
bit a;
switch(c){
case 0:
a=PINA.0;
break;

case 1:
a=PINA.1;
break;

case 2:
a=PINA.2;
break;

case 3:
a=PINA.3;
break;

case 4:
a=PINA.4;
break;

case 5:
a=PINA.5;
break;

case 6:
a=PINA.6;
break;

case 7:
a=PINA.7;
break;
}
return a;
}

i = pin (0) равно i = PINA.0

0

PINx.<PIN_number> это расширение компилятора и не стандартное. Обычно используется в компиляторах для встроенных систем. Кроме того, C не позволяет инициализировать массивы / структуры переменными

Если вам нужно сохранить его в массиве, явно назначьте элементы

char a[3];
a[0] = PINA.0;
a[1] = PINB.2;
a[2] = PORTC.4;  // why the above is PIN and below is PORT? PIN cannot have multiple bits

или же

char a[3];
a[0] = PINA & 0x01;
a[1] = (PINB >> 2) & 0x01;
a[2] = (PORTC >> 4) & 0x01;
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector