ImageImageImageImage
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#...

Moderator: Junta Directiva

Post Reply
Ranganok
Usuario Desarrollador
Usuario Desarrollador
Posts: 3874
Joined: Mon Nov 07, 2005 3:10 pm
Location: Barbaros del Valle
Contact:

Puntero a puerto

Post by Ranganok » Fri 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:

Code: Select all

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

Code: Select all

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"

User avatar
fusion
Usuario Avanzado
Usuario Avanzado
Posts: 388
Joined: Tue Oct 09, 2007 2:12 pm
Nombre: Javier Lopez Segura
Location: Madrid
Contact:

Re: Puntero a puerto

Post by fusion » Mon Apr 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í:

Code: Select all

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

Code: Select all

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
Posts: 3874
Joined: Mon Nov 07, 2005 3:10 pm
Location: Barbaros del Valle
Contact:

Re: Puntero a puerto

Post by Ranganok » Sat 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.

Code: Select all

#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"

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest