Nombrar y agrupar pines individuales con el ATXMEGA

3

Soy nuevo en el uso de chips atxmega (específicamente atxmega128a1), ¡lo siento si mi pregunta no está redactada de manera "profesional"!

Hasta ahora, para configurar o borrar un pin, uso la siguiente programación en C:

  

PORTA.OUTSET = PIN1_bm;

     

PORTA.OUTCLR = PIN1_bm;

El problema con esto para mí, es que la definición del pin individual está en el lado derecho del signo "=". Me gustaría poder establecer un pin individualmente de esta manera:

  

PA0 = 1;

Esto me sería útil ya que tengo muchos pines individuales en diferentes puertos que deben "agruparse virtualmente" en el código, ya que están realizando funciones relacionadas.

Por ejemplo, tengo cuatro pines de "habilitación" del motor en diferentes pines de 4 puertos separados. Actualmente, si quiero encenderlos simultáneamente, tengo que hacer esto:

  

PORTE.OUTSET = PIN5_bm;

     

PORTH.OUTSET = PIN0_bm;

     

PORTJ.OUTSET = PIN3_bm;

     

PORTK.OUTSET = PIN6_bm;

Quiero mantener mis convenciones de nombres y nombres de puertos claros y fáciles de leer para poder agrupar estas salidas en algún tipo de estructura y simplemente escribir:

  

Motor1_Enable = 1;

¿Cómo puedo manipular C para que haga esto por mí?

Espero que esto esté claro! ¡Gracias!

    
pregunta Sam Bucca

1 respuesta

2

Para lograr algo parecido a lo que deseas, puedes definir algunas macros. Aquí hay macros separadas para configurar y borrar PA0 (asumiendo que PA0: = puerto A, pin 0), y una macro que toma un argumento para decidir si borrar o establecer el pin.

#define SET_PA0 PORTA.OUTSET = PIN0_bm
#define CLR_PA0 PORTA.OUTCLR = PIN0_bm
#define OUT_PA0(x) (x ? SET_PA0 : CLR_PA0)

int main()
{
  SET_PA0; // PA0 is set
  CLR_PA0; // PA0 is cleared

  OUT_PA0(1); // PA0 is set
  OUT_PA0(0); // PA0 is cleared

  return 0;
}

Para usar estos, tendría que definir dichas macros para todos los pines que está utilizando. Si desea hacer un esfuerzo adicional, podría usar macros más genéricas como:

#define SET_PIN(port, pin) port.OUTSET = pin
#define CLR_PIN(port, pin) port.OUTCLR = pin

int main()
{
  SET_PIN(PORTA, PIN0_bm); // PA0 is set
  CLR_PIN(PORTA, PIN0_bm); // PA0 is cleared

  return 0;
}

Pero en este punto, sería una práctica mucho mejor utilizar una función. Pero tendría que buscar en sus encabezados los tipos de puerto y pin. No estoy acostumbrado a los chips atxmega también, pero supongo que son enums. Sería algo parecido a esto:

void outPin(port_t port, pin_t pin, int outValue)
{
  if (outValue)
    port.OUTSET = pin;
  else
    port.OUTCLR = pin;
}

int main()
{
  outPin(PORTA, PIN0_bm, 1); // PA0 is set
  outPin(PORTA, PIN0_bm, 0); // PA0 is cleared

  return 0;
}

Con estas tres opciones, la habilitación de su motor se vería así (elija la que mejor se adapte a su estilo):

void motorEnable1()
{
  SET_PE5;
  SET_PH0;
  SET_PJ3;
  SET_PK6;
}

void motorEnable2()
{
  SET_PIN(PORTE, PIN5_bm);
  SET_PIN(PORTH, PIN0_bm);
  SET_PIN(PORTJ, PIN3_bm);
  SET_PIN(PORTK, PIN6_bm);
}

void motorEnable3()
{
  outPin(PORTE, PIN5_bm, 1);
  outPin(PORTH, PIN0_bm, 1);
  outPin(PORTJ, PIN3_bm, 1);
  outPin(PORTK, PIN6_bm, 1);
}

También puede escribir una estructura para mantener la información de los pines de su motor y usarla como argumento para una función de MotorEnable para un código más limpio cuando se usa más de un motor.

    
respondido por el Vicente Cunha

Lea otras preguntas en las etiquetas