Foros

Avisos
Vaciar todo

Puntero a puerto  


ranganok
Respuestas: 3875
Socio
(@ranganok)
Ardero Famoso
Registrado: hace 15 años

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

2 respuestas
fusion
Respuestas: 391
Socio
(@fusion)
Ardero reputado
Registrado: hace 13 años

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)

Responder
ranganok
Respuestas: 3875
Socio
(@ranganok)
Ardero Famoso
Registrado: hace 15 años

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

Responder
Compartir: