Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola,
Quiero utilizar una estructura para manejar varios pwm con la misma función (y que sea independiente del micro), pero me estoy encontrando con un problema al pasarle la dirección del pin a la estructura.
Primero probé de hacer:
unsigned * ptr = &(_LATD1);
(*ptr) = 1;
Luego a aplicar una mascara de bits:
unsigned int *ptr = &(LATD);
unsigned int mask = 0b0000000000000010;
(*ptr) |= mask;
En ambos casos estoy teniendo problemas.
¿Alguien sabe cómo se debería hacer?
S2
Ranganok Schahzaman
PD: Estoy utilizando Microchip con MPLABX y XC16 como compilador
Yo tengo hecho esto, a ver si te sirve:
#define PIN_NCS PORTBbits.RB0 //IN: Conectado a min nCS_MEM de la EEPROM ó en pin40 del pic18f4550
#define PIN_RESET LATBbits.LATB1 //OUT: Salida de control
#define PIN_LED0 LATBbits.LATB2 //OUT:Cambia cada segundo
#define PIN_LED1 LATBbits.LATB3 //OUT:Se activa si cambia a estado 1
Como puedes ver uso PORT para leer y LAT para escribir. Si usas #define puedes hacer algo así:#define _DSPIC3013 //esto quiere decir que usas un dspic3013
#ifdef _DSPIC3013
#define PIN_RESET LATBbits.LATB1 //OUT
#define PIN_LED0 LATBbits.LATB2 //OUT
#elseif _DSPIC3012
#define PIN_RESET LATCbits.LATC1 //OUT
#define PIN_LED0 LATCbits.LATC2 //OUT
#endif
si quieres usar puntero a
si no te sirve te puedo decir que la estructura de los puertos es como sigue (la he sacado del fichero p30F3013.h):
typedef struct tagLATBBITS {
unsigned LATB0:1;
unsigned LATB1:1;
unsigned LATB2:1;
unsigned LATB3:1;
unsigned LATB4:1;
unsigned LATB5:1;
unsigned LATB6:1;
unsigned LATB7:1;
unsigned LATB8:1;
unsigned LATB9:1;
} LATBBITS;
extern volatile LATBBITS LATBbits __attribute__((__sfr__));
Como puedes ver cada puerto corresponde a 1 bit de la variable LATBBITS. Imagino que LATBBITS es de tipo unsigned int (2 bytes) por lo que podrias hacer:
const unsigned int puerto_x=LATBBITS; ó
const unsigned int puerto_x=LATBbits;
(Le he puesto const antes para que no se cambie después)
Al final lo solucioné con una máscara de bits que aplicaba al puerto de tal forma que hacía una OR con la máscara para activar y una AND con la máscara negada para desactivar.
#define ACTIVAT(port, mask) port &= mask
#define DESACTIVAR (port, mask) port |= ~mask
S2
Ranganok Schahzaman