Autor Tema: [SOLUCIONADO]¿Se le puede pasar un pin del micro a un función?  (Leído 5151 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re:¿Se le puede pasar un pin del micro a un función?
« Respuesta #15 en: 15 de Mayo de 2018, 13:22:55 »
Efectivamente, así funciona.
También creo que se podrá crear unas máscaras en función de los pines seleccionados y aplicar esa mascara como igualdad al condicional if, ejemplo


Código: [Seleccionar]
pin1 = 0b00000001;
pin2 = 0b00000010;
pin3 = 0b00000100;

if((*data->canal_A & mask_A) == pin1); //si queremos usar el pin 0
if((*data->canal_B & mask_B) == pin2); //si queremos usar el pin 1
if((*data->canal_C & mask_C) == pin3); //si queremos usar el pin 3


lo he hecho a groso modo, si se quiere hacer bien se tendrá que implementar un bucle switch como el que has puesto pero que compare el pin que elija y le de la mascara que le corresponda, pero si queremos eficiencia de código lo mejor es de la manera que has puesto, eso es lo que creo.
Entonces por lo que veo, ¿el tratamiento de los pines del puerto no se hacen de igual manera cuando usas un puntero a como cuando lo lees del registro, ósea cuando usas PORTBbits.RX?

Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:¿Se le puede pasar un pin del micro a un función?
« Respuesta #16 en: 15 de Mayo de 2018, 13:44:56 »
PORTBbits.RX

Es realidad una  estructura donde se define los 8bits y un entero de 8bits puesto sobre la direccion del PORTB, XC8 tiene un operador especial para eso y es lo que usa en su .h que es el @

En esa estructura define cada bit... PORTB no es un puntero como esta definido en el .h de XC8, sino que es como una variable que tiene una direccion fija y vos dices: "Lo que hay en la direccion 0x06 le correspondo a esta estructura", dentro de la estructura estan definidos todos los bits.

Lo mismo podes hacer con una variable copio la definicion de un .h


Código: C
  1. // Register: PORTB
  2. #define PORTB PORTB
  3. extern volatile unsigned char           PORTB               @ 0x006;      //Aca dice que tenes una variable de 8bits sin signo llamada PORTB en la direccion 0x006
  4. #ifndef _LIB_BUILD
  5. asm("PORTB equ 06h");
  6. #endif
  7. // bitfield definitions
  8. typedef union {
  9.     struct {
  10.         unsigned RB0                    :1;
  11.         unsigned RB1                    :1;
  12.         unsigned RB2                    :1;
  13.         unsigned RB3                    :1;
  14.         unsigned RB4                    :1;
  15.         unsigned RB5                    :1;
  16.         unsigned RB6                    :1;
  17.         unsigned RB7                    :1;
  18.     };
  19. } PORTBbits_t;
  20. extern volatile PORTBbits_t PORTBbits @ 0x006; // Aca tenes que define la estructura como PORTBbits y dice que esta ubicada tambien en la direccion 0x006

Esto se resuelve en tiempo de compilacion pero no en run-time.
Si tenemos que guardar algo del puerto, lo unico que nos queda guardar es la direccion y el pin, ya que el pin solo no posee direccion propia. Por eso debemos tener guardado ambas cosas. Y por eso usamos un puntero al puerto.

Citar
pin1 = 0b00000001;
pin2 = 0b00000010;
pin3 = 0b00000100;

if((*data->canal_A & mask_A) == pin1); //si queremos usar el pin 0
if((*data->canal_B & mask_B) == pin2); //si queremos usar el pin 1
if((*data->canal_C & mask_C) == pin3); //si queremos usar el pin 3

Hacer eso quita toda ventaja de hacer el codigo como te pase.. intenta cargar cualquier puerto y pin, esto requiere que cada estructura posea minimo 8 punteros a puerto y 8 enteros de 8 bits. Ademas cuando lo inicializas tenes que cargar la mascara exacta.. termina siendo un exceso que no tiene sentido por achicar un poco mas los ifs.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 805
    • https://electronicadicto.wordpress.com/
Re:¿Se le puede pasar un pin del micro a un función?
« Respuesta #17 en: 15 de Mayo de 2018, 14:12:36 »
Pues gracias por la explicación, ahora mismo ya me funciona el driver con varios encoders.
Se me ha puesto la cabeza como un tambor y echando humo pero ha merecido la pena, me acabas de ayudar a subir un nivel jajaja  ((:-)) ((:-)) ((:-)) ((:-))
Saludos
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...