PORT nombres y CONST en una matriz

1

uC: PIC18F46K20

Quiero escanear, en un bucle, diferentes puertos y probar diferentes pines en cada puerto.

Tengo diferentes tableros de destino, así que quiero poder configurar rápidamente cada tablero en matrices CONST. Así que creé matrices como estas:

const char my_ports[4] = {PORTB, PORTB, PORTD, PORTA}; // <- this is the PROBLEM causing line
const char my_pins[4] = {3, 7, 1, 4};

para poder escanear esos puertos en un bucle:

// NEW version of the func.
void pin_update(void)
{
  for (k=0; k<=3; k++)
  {
    if (my_ports[k] & my_pins[k])
    {
     // and actions here ........
    }
  }
}

Pero el compilador aparece con un error:

        "my_ports[] ... constant expression required"

Utilicé el método de pasar el nombre del puerto (por ejemplo, PORTB) en la versión anterior del código cuando cada pin fue probado individualmente, por ejemplo. :

    pin_update(PORTB, 3);   
            // ...
    pin_update(PORTD, 1);   

// OLD version of the func:
void pin_update(char prt, char pn)
{
    if (prt & pn)
    {
     // and actions here ........
    }
}

y todo estaba bien y el código funcionó correctamente. Pero como ven, PORTB está codificado en una lista de parámetros. Y ahora quiero ejecutar las "actualizaciones de pin" anteriores en un bucle.

Entonces surgió un problema cuando quise listar los nombres de puertos en la matriz CONST. Probé varias cosas con el envío a direcciones de puertos, etc., nada funcionó. Al compilador todavía no le gustó.

    
pregunta derlo

2 respuestas

1

El compilador es correcto. PORTx no son constantes; resultan en el valor almacenado en hardware. Debe almacenar un puntero en el puerto y luego eliminarla cuando sea apropiado.

const *char my_ports[4] = {&PORTB, &PORTB, &PORTD, &PORTA};
const char my_pins[4] = {3, 7, 1, 4};

 ...

void pin_update(void)
{
  for (k=0; k<=3; k++)
  {
    if (*(my_ports[k]) & my_pins[k])
    {
     // and actions here ........
    }
  }
}
    
respondido por el Ignacio Vazquez-Abrams
1

Gracias Ignacio por la dirección correcta.

Aquí está la solución final que realmente funciona bien: ningún compilador se queja y los resultados durante la ejecución del programa también son correctos, es decir, el código verifica adecuadamente los bits individuales de cada puerto.

volatile unsigned char* const my_ports[4] = {&PORTB, &PORTB, &PORTD, &PORTA};
const char my_pins[4] = {3, 7, 1, 4};

y la función que utiliza el pin_update () anterior se encuentra en la forma sin cambios de Ignacio:

    void pin_update(void)
    {
        for (k=0; k<=3; k++)
        {
            if (*(my_ports[k]) & my_pins[k])
            {
             // and actions here ........
            }
        }
    }

Así que ahora my_ports [] es una matriz de punteros constantes a caracteres sin signo volátiles, y está bien porque las direcciones que contiene este array son para las direcciones de puerto de hardware reales de los tipos de 'carácter no firmado volátil' definidos en el archivo de cabecera PIC18F46K20 como sigue:

extern volatile unsigned char PORTB @ 0xF81; 
extern volatile unsigned char PORTC @ 0xF82; // etc...
    
respondido por el derlo

Lea otras preguntas en las etiquetas