Autor Tema: Poner los pines en un cuadro  (Leído 5010 veces)

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

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Poner los pines en un cuadro
« 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 :)

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Poner los pines en un cuadro
« Respuesta #1 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!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Poner los pines en un cuadro
« Respuesta #2 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!

No contesto mensajes privados, las consultas en el foro

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Poner los pines en un cuadro
« Respuesta #3 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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Poner los pines en un cuadro
« Respuesta #4 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!
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Poner los pines en un cuadro
« Respuesta #5 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Poner los pines en un cuadro
« Respuesta #6 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!
No contesto mensajes privados, las consultas en el foro

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Poner los pines en un cuadro
« Respuesta #7 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.
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Poner los pines en un cuadro
« Respuesta #8 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Poner los pines en un cuadro
« Respuesta #9 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!
No contesto mensajes privados, las consultas en el foro

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Re: Poner los pines en un cuadro
« Respuesta #10 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.   
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Poner los pines en un cuadro
« Respuesta #11 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!
No contesto mensajes privados, las consultas en el foro


 

anything