ImagenImagenImagenImagen
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

Puntero a puerto

Postea aqui toda la parte de programación del lenguaje C, C++, C#...

Moderador: Junta Directiva

Responder
Ranganok
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 3867
Registrado: Lun Nov 07, 2005 3:10 pm
Ubicación: Barbaros del Valle
Contactar:

Puntero a puerto

Mensaje por Ranganok » Vie Feb 12, 2016 3:56 pm

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:

Código: Seleccionar todo

unsigned * ptr = &(_LATD1);
(*ptr) = 1;
Luego a aplicar una mascara de bits:

Código: Seleccionar todo

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


skiras.blogspot.com

"En igualdad de condiciones la explicación más sencilla es la cierta"

Avatar de Usuario
fusion
Usuario Avanzado
Usuario Avanzado
Mensajes: 387
Registrado: Mar Oct 09, 2007 2:12 pm
Nombre: Javier Lopez Segura
Ubicación: Madrid
Contactar:

Re: Puntero a puerto

Mensaje por fusion » Lun Abr 25, 2016 12:52 pm

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í:

Código: Seleccionar todo

#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):

Código: Seleccionar todo

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)

Ranganok
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 3867
Registrado: Lun Nov 07, 2005 3:10 pm
Ubicación: Barbaros del Valle
Contactar:

Re: Puntero a puerto

Mensaje por Ranganok » Sab May 07, 2016 10:49 pm

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.

Código: Seleccionar todo

#define ACTIVAT(port, mask)         port &= mask
#define DESACTIVAR (port, mask)       port |= ~mask
S2

Ranganok Schahzaman
skiras.blogspot.com

"En igualdad de condiciones la explicación más sencilla es la cierta"

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado