Autor Tema: Estructura/Union de Pines en C18  (Leído 1383 veces)

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

Desconectado matiasg

  • PIC10
  • *
  • Mensajes: 1
Estructura/Union de Pines en C18
« en: 17 de Noviembre de 2011, 14:42:46 »
Hola Compañeros, necesito una ayudita, necesito crear una estructura o unión para los pines del micro.

La cuestión es que tengo un motor Paso a Paso conectado en 4 pines del micro, pero estos pines no están en el mismo puerto del micro y no los puedo manejar atreves del PORT, entonces quisiera crear una estructura para poder manejarlos desde un solo registro.

Esta seria la idea basicamente.

struct {

LATBbits.LATB2

LATBbits.LATB3

LATBbits.LATB4

LATCbits.LATC0

} Bus_PaP;

Esto obviamente no funciona :(, me da error de sintaxis, pero no le encuentro la vuelta para hacerlo.

El micro es un PIC18F87K22 y el lenguaje es C18

Si alguien se le ocurre algo, se lo agradezco mucho!!!

Saludos  :)


Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Estructura/Union de Pines en C18
« Respuesta #1 en: 17 de Noviembre de 2011, 15:21:06 »
me temo que lo que dices no se puede hacer, las direcciones de memoria van de 8 en 8 bits, y cada puerto es 1bit, no se puede direccionar memoria por bit.

Lo unico que se me ocurre esque hagas una funcion y que esa funcion cambie el bit que le pidas, por ejemplo

void set_b(char puerto, char status) {
switch(puerto) {
case 0:
latbbits.latb2=status;
break;
case 1:
latbbits.latb3=status;
break
........

}
}

todo bien puesto claro.

si lo que quieres hacer es cambiar x pines del tiron, tipo PORTB=0b111000; lo que puedes hacer es:

set_port_pap(char status) {
LATBbits.LATB2=(status&1);
LATBbits.LATB3=((status>>1)&1);
LATBbits.LATB3=((status>>2)&1);
LATCbits.LATC0=((status>>3)&1);
}

todo esto siendo LATB2 el LOW y LATC0 el high

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Estructura/Union de Pines en C18
« Respuesta #2 en: 17 de Noviembre de 2011, 15:33:27 »
Es cierto, lo que pretendes hacer no es posible. Otras formas de hacerlo:

#define PIN_PAP_0 LATBbits.LATB0
// ...


Código: C
  1. PIN_PAP_0=!!(ValorACargar&&0x01);
  2. PIN_PAP_1=!!(ValorACargar&&0x02);
  3. PIN_PAP_2=!!(ValorACargar&&0x04);
  4. PIN_PAP_3=!!(ValorACargar&&0x08);

Código: C
  1. PIN_PAP_0=(ValorACargar&&0x01)==0x01?1:0;
  2. PIN_PAP_1=(ValorACargar&&0x02)==0x02?1:0;
  3. PIN_PAP_2=(ValorACargar&&0x04)==0x04?1:0;
  4. PIN_PAP_3=(ValorACargar&&0x08)==0x08?1:0;

Podes evaluarlos y ver cual es más eficiente  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything