TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: excalibur1491 en 13 de Febrero de 2011, 12:20:26

Título: Poner los pines en un cuadro
Publicado por: excalibur1491 en 13 de Febrero de 2011, 12:20:26
Hola, estoy usando el CCS y hasta ahora habia creato unos cuadros que contenian PIN_Ai (siendo i un numero de 0 a 5) etc...
así todo fucionaba,
pero ahora me apetecia hacerlo de fomra mas "elemental" (sin usar tanto los headers de ccs), asi que habia definido la direcciones de los puertos, y las direcciones de los bits de cada puerto asi:
Código: [Seleccionar]
#byte port_a=0x05               
   #bit port_a0=0x05.0
   #bit port_a1=0x05.1
   #bit port_a2=0x05.2
   #bit port_a3=0x05.3
   #bit port_a4=0x05.4
   #bit port_a5=0x05.5
hasta ahi todo bien
pero ahora intento meterlos en un cuadro array de tamaño 6 asi:
int port_a[6] = {port_a0,port_a1,port_a2,port_a3,port_a4,port_a5};

y me dice:
Expression must evluate to a constant

porque si pongo PIN_A0 está feliz y si pongo lo que yo he definido no le da la real gana de funcionar?

graciaas :)
Título: Re: Poner los pines en un cuadro
Publicado por: bmb en 13 de Febrero de 2011, 13:03:38
Hola excalibur1491, lo que contiene PIN_A0 o cualquiera otro, es una constante con la dirección del bit del pin.  Fijate en la definición de pines en el archivo .h  Por ejemplo (de la ayuda del CCS), el puerto A (byte 5) bit 0 debe tener un valor de 5*8+0 o 40.  Las instrucciones como output_high() o cualquiera similar que son instrucciones internas del CCS, necesitan usar la dirección del bit del pin.

Saludos!
Título: Re: Poner los pines en un cuadro
Publicado por: Suky en 13 de Febrero de 2011, 13:16:43
Para inventar algo raro:


Código: C
  1. union{
  2.    int1 Port[8];
  3.    struct{
  4.       unsigned pin_0:1;
  5.       unsigned pin_1:1;
  6.       unsigned pin_2:1;
  7.       unsigned pin_3:1;
  8.       unsigned pin_4:1;
  9.       unsigned pin_5:1;
  10.       unsigned pin_6:1;
  11.       unsigned pin_7:1;
  12.    };
  13. }Puerto;
  14.  
  15. #byte Puerto=0x06
  16.  
  17. void main(){
  18.  
  19.    Puerto.Port[0]=1;
  20.    Puerto.pin_4=0;;
  21.    while(1);
  22. }

 :D

Pero funciona, se puede acceder por bit, o por indice al buffer.

Saludos!

Título: Re: Poner los pines en un cuadro
Publicado por: excalibur1491 en 13 de Febrero de 2011, 14:35:00
Hola excalibur1491, lo que contiene PIN_A0 o cualquiera otro, es una constante con la dirección del bit del pin.  Fijate en la definición de pines en el archivo .h  Por ejemplo (de la ayuda del CCS), el puerto A (byte 5) bit 0 debe tener un valor de 5*8+0 o 40.  Las instrucciones como output_high() o cualquiera similar que son instrucciones internas del CCS, necesitan usar la dirección del bit del pin.

Saludos!

aaah, muchas racias.. habia leido el header y habia visto las defniciones de PIN_A0 etc y no habia entendido,
gracias!!

sin embargo, algo me amarga:los que usamos ccs, usamos output_high para modificar un bit del byte del puerto... pero si no usas ccs, como lo haces?? teienes q escribir un equivalente a la funcion output_high a mano???

Suky, no entendi ná! xDD esq lo de las estructuras no es lo mio, nun calas he usado xD
Título: Re: Poner los pines en un cuadro
Publicado por: Suky en 13 de Febrero de 2011, 15:44:09
Suky, no entendi ná! xDD esq lo de las estructuras no es lo mio, nun calas he usado xD

Eso no es problema. Hay mucha información en la red, solo hay que tener ganas de leer y aprender  ;-)


Saludos!
Título: Re: Poner los pines en un cuadro
Publicado por: AngelGris en 13 de Febrero de 2011, 17:36:53
Hola excalibur1491, lo que contiene PIN_A0 o cualquiera otro, es una constante con la dirección del bit del pin.  Fijate en la definición de pines en el archivo .h  Por ejemplo (de la ayuda del CCS), el puerto A (byte 5) bit 0 debe tener un valor de 5*8+0 o 40.  Las instrucciones como output_high() o cualquiera similar que son instrucciones internas del CCS, necesitan usar la dirección del bit del pin.

Saludos!

aaah, muchas racias.. habia leido el header y habia visto las defniciones de PIN_A0 etc y no habia entendido,
gracias!!

sin embargo, algo me amarga:los que usamos ccs, usamos output_high para modificar un bit del byte del puerto... pero si no usas ccs, como lo haces?? teienes q escribir un equivalente a la funcion output_high a mano???

Suky, no entendi ná! xDD esq lo de las estructuras no es lo mio, nun calas he usado xD

  No. En HiTech para escribir un 1 en el bit 5 del puerto B, se pone RB5 = 1. Si se quiere escribir un 0 es, por ejemplo RA3 = 0.
Título: Re: Poner los pines en un cuadro
Publicado por: Suky en 13 de Febrero de 2011, 17:43:26
En los compiladores de Microchip se accede por estructura, o sea:

Código: C
  1. LATBbits.LATB3=1;
  2. TRISbits.TRISB2=0;
  3. PORTBbits.RB1=0;




Saludos!
Título: Re: Poner los pines en un cuadro
Publicado por: falflores en 05 de Abril de 2011, 04:20:17
Hola, tengo una duda con respecto al código que posteo Suky:


Código: C
  1. union{
  2.    int1 Port[8];
  3.    struct{
  4.       unsigned pin_0:1;
  5.       unsigned pin_1:1;
  6.       unsigned pin_2:1;
  7.       unsigned pin_3:1;
  8.       unsigned pin_4:1;
  9.       unsigned pin_5:1;
  10.       unsigned pin_6:1;
  11.       unsigned pin_7:1;
  12.    };
  13. }Puerto;
  14.  
  15. #byte Puerto=0x06
  16.  
  17. void main(){
  18.  
  19.    Puerto.Port[0]=1;
  20.    Puerto.pin_4=0;;
  21.    while(1);
  22. }


He leído acerca de las estructuras, entiendo su esencia, pero en el libro "Aprendiendo C en 21 días", que recomiendo bastante, nunca comentan nada acerca de los dos puntos que pones después de cada unsigned pin, me puedes decir que está haciendo este pedazo de código por favor? Es que quiero agrupar diferentes pines de 2 puertos distintos, y usarlos como uno solo de 8 bits, y creo que las estructuras me vienen perfectas para esto. Gracias.
Título: Re: Poner los pines en un cuadro
Publicado por: AngelGris en 05 de Abril de 2011, 09:20:41
  Si mal no recuerdo, el número puesto después de los 2 puntos ( : ) indica cuantos bits ocupa esa variable dentro de la estructura.
Título: Re: Poner los pines en un cuadro
Publicado por: Suky en 05 de Abril de 2011, 11:40:40
  Si mal no recuerdo, el número puesto después de los 2 puntos ( : ) indica cuantos bits ocupa esa variable dentro de la estructura.

Exactamente..

Ahora agrupar pines de distintos puertos en una estructura no lo veo posible  :?


Saludos!
Título: Re: Poner los pines en un cuadro
Publicado por: falflores en 05 de Abril de 2011, 15:18:16
Ahora agrupar pines de distintos puertos en una estructura no lo veo posible  :?

 :( Estaba seguro de que si se podía, poner algo así como:

Código: [Seleccionar]
struct new_port {
     int1 pin0;
     int1 pin1;
     int1 pin2;
     int1 pin3;
     int1 pin4;
     int1 pin5;
     int1 pin6;
     int1 pin7;
} port_F;

Y de alguna forma asignarle un pin de cualquier puerto a cada variable.

Necesito hacer algo parecido a lo que se hace en la libreria flex_lcd, para que declarando los pines, uno los pueda acomodar donde quiera, pero veo que esta librería no lo hace con estructuras, alguien sabe como?.

Saludos y gracias.   
Título: Re: Poner los pines en un cuadro
Publicado por: Suky en 05 de Abril de 2011, 16:20:37
Una posibilidad puede ser la siguiente, aprovechando que CCS le asigna un valor entero para identificar cada pin:

Código: C
  1. typedef struct{
  2.    char _pin0;
  3.    char _pin1;
  4.    char _pin2;
  5.    char _pin3;
  6.    char _pin4;
  7.    char _pin5;
  8.    char _pin6;
  9.    char _pin7;
  10. }MYPORT;
  11.  
  12. #define set_pins_myport(p,a,b,c,d,e,f,g,h)\
  13. {p._pin0=a;p._pin1=b;p._pin2=c;p._pin3=d;p._pin4=e;p._pin5=f;p._pin6=g;p._pin7=h;}
  14.  
  15. void output_myport(MYPORT *p,char v){
  16.    output_bit(p->_pin0,v&0x01);output_bit(p->_pin1,v&0x02);output_bit(p->_pin2,v&0x04);
  17.    output_bit(p->_pin3,v&0x08);output_bit(p->_pin4,v&0x10);output_bit(p->_pin5,v&0x20);
  18.    output_bit(p->_pin6,v&0x40);output_bit(p->_pin7,v&0x80);
  19. }
  20.  
  21. char  input_myport(MYPORT *p){
  22.    return(input(p->_pin0) | (input(p->_pin1)<<1) | (input(p->_pin2)<<2) | (input(p->_pin3)<<3) | (input(p->_pin4)<<4) | (input(p->_pin5)<<5) | (input(p->_pin6)<<6) | (input(p->_pin7)<<7));
  23. }

Y para trabajar:

Código: C
  1. MYPORT PortX;
  2.  
  3. set_pins_myport(PortX,PIN_A0,PIN_B0,PIN_B4,PIN_B1,PIN_C1,PIN_C0,PIN_A2,PIN_B2);
  4.  
  5. output_low(PortX._pin0);
  6.    
  7. output_high(PortX._pin5);
  8.    
  9. output_toggle(PortX._pin7);
  10.    
  11. i=input(PortX._pin3);
  12.    
  13. output_myport(&PortX,0xFF);
  14.    
  15. i=input_myport(&PortX);


Nota: No lo probé  ;-)

Saludos!