TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: stk500 en 25 de Febrero de 2010, 09:47:24

Título: Funcion de Boolean (novatadas)
Publicado por: stk500 en 25 de Febrero de 2010, 09:47:24
Holas amigos!
bien tengo un ejemplo de programas y quiero salir de dudas, porque creo que boolean es una directiva de variable o me equivoco.
Pje esto
Código: [Seleccionar]
   struct PB_pin_mapa{
             
                          boolean unusedRB0;               // poner el puerto RB0 a cero?
                          boolean unusedRB1;              // poner el puerto RB1 a cero
                          boolean rx;                            //     aqui usamos rx como variable? 

he estado buscando informacion de boolean y en los codigo nadie explica su funcion, porque lo que veo y creo es para designar variable.
por favor sacarme de dudas
gracias

Título: Re: Funcion de Boolean (novatadas)
Publicado por: cerebro en 25 de Febrero de 2010, 09:58:50
boolean es igual a int1..... es una variable de 1 bit... 0 o 1 para condiciones logicas.

Saludos!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: stk500 en 25 de Febrero de 2010, 10:16:35
gracias amigo Cerebro por la informacion, era lo que yo me imaginabas, lo que veo tambien que esa variable se usa tan poco ya que usando el buscador encontre muy poca cosas siendo asi muchas infomaciones se quedaron en el olvido de Miel_d@ arroba  :D :D, algunas buscando me salia mensaje que ya no existen.
un Saludos
Título: Re: Funcion de Boolean (novatadas)
Publicado por: PalitroqueZ en 25 de Febrero de 2010, 15:07:03
boolean es un tipo de datos, y vaya que se usa bastante, sobre todo para acceso múltiple por ranura de tiempos (hacer varios procesos en "simultaneos")

otros nombres que tienen: bandera o flag por software

en ccs, es válido decir que 1=true y 0=false

Título: Re: Funcion de Boolean (novatadas)
Publicado por: Nocturno en 25 de Febrero de 2010, 15:39:17
Pero ten cuidado con su uso porque no forma parte del Ansi C y sólo es soportado por determinados compiladores.
Título: Re: Funcion de Boolean (novatadas)
Publicado por: LABmouse en 25 de Febrero de 2010, 15:50:18
Pero ten cuidado con su uso porque no forma parte del Ansi C y sólo es soportado por determinados compiladores.

Si señor!!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: stk500 en 25 de Febrero de 2010, 15:56:27
Pero ten cuidado con su uso porque no forma parte del Ansi C y sólo es soportado por determinados compiladores.

Sr Manuel, en este caso su uso para compilador CCS lo estoy usando, osea como decia el amigo Cerebro solo para variable de 1Bit.
Título: Re: Funcion de Boolean (novatadas)
Publicado por: Suky en 25 de Febrero de 2010, 16:23:45
Si lo utilizas en una estructura y para hacerlo compatible con otros compiladores se puede hacer de la siguiente manera:

Código: C
  1. struct PB_pin_mapa{
  2.                           char unusedRB0:1;               // poner el puerto RB0 a cero?
  3.                           char unusedRB1:1              // poner el puerto RB1 a cero
  4.                           char rx:1;


Saludos!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: stk500 en 25 de Febrero de 2010, 16:38:26
Muchas gracias Suky
lo tendre en cuenta, tengo la media parte de mi primer programa andando como yo queria  :-/ :-/, voy a comentarlo bien para subirlo a mis proyectos DMX  :mrgreen:
Saludos

Título: Re: Funcion de Boolean (novatadas)
Publicado por: Suky en 25 de Febrero de 2010, 16:48:25
El resto de código no se ve, pero para asignarle una estructura a un registro lo haces de la siguiente manera:

Por ejemplo se asigna a LATB:

Código: C
  1. struct{
  2.    char bit0:1;
  3.    char bit1:1;
  4.    char 2bits:2;
  5.    char Nible:4;
  6. }Control;
  7.  
  8. #byte Control=getenv("SFR:LATB")


Si quieres asignar la misma estructura a más de un registro:

Código: C
  1. typedef struct{
  2.    char bit0:1;
  3.    char bit1:1;
  4.    char 2bits:2;
  5.    char Nible:4;
  6. }MAP_PIN_Control;
  7.  
  8. MAP_PIN_Control Control_LAT, Control_PORT;
  9.  
  10. #byte Control_LAT=getenv("SFR:LATB")
  11. #byte Control_PORT=getenv("SFR:PORTB")


Saludos!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: jhozate en 25 de Febrero de 2010, 21:03:05
una preguntilla :oops: , siendo INT1 una variable de un 1bit, como se traduce esa variable en el ASM generado por CCS, utiliza un registro de 8bits de los cuales solo afecta el estado de 1?
Título: Re: Funcion de Boolean (novatadas)
Publicado por: Suky en 25 de Febrero de 2010, 21:08:42
una preguntilla :oops: , siendo INT1 una variable de un 1bit, como se traduce esa variable en el ASM generado por CCS, utiliza un registro de 8bits de los cuales solo afecta el estado de 1?


bsf o bcf 0xXX,bit.

Directamente modifica el bit de un registro reservado para tales variables.


Saludos!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: LABmouse en 02 de Abril de 2010, 02:35:37
Una pregunta amigos,

Estoy intentando controlar una LCd standar 2x16, funciona sin problemas, pero estoy intentando lograr una libreria que se ANSI-c para empezar a aplicar con FreeRTOS. Sucede que tengo el bus de datos de la LCD en pines de diferentes puertos.

D0...E5
D1...E6
D2...E7
D3...F5
D4...G3
D5...A0
D6...A1
D7...A2

Mi intención es empaquetarlos de alguna manera que al programar se vean como si fuera un puerto nuevo creado por mi, de 8 bits. Sin tener que estar pendientes que son de diferentes.

Pensé que de alguna manera en una structura seria la solución, pero intente de varias formas y no creo saber como hacerlo.


CCS usa algo como esto:

Citar
typedef struct 
{                            // This structure is overlayed
   BOOLEAN enable;           // on to an I/O port to gain
   BOOLEAN rs;               // access to the LCD pins.
   BOOLEAN rw;               // The bits are allocated from
   BOOLEAN unused;           // low order up.  ENABLE will
   int     data : 4;         // be LSB pin of that port.
} LCD_PIN_MAP;


Pero precisamente CCS no es ANSI-C y para empezar BOOLEAN ya no es compatible, entonces recordé este hilo, pero mis intentos son fallidos.

CCS creo ese nuevo tipo de dato, con el cual se vale para crear después esto:

Citar
   // these definitions only need to be modified for baseline PICs.
   // all other PICs use LCD_PIN_MAP or individual LCD_xxx pin definitions.
/*                                    EN, RS,   RW,   UNUSED,  DATA  */
 const LCD_PIN_MAP LCD_OUTPUT_MAP =  {0,  0,    0,    0,       0};
 const LCD_PIN_MAP LCD_INPUT_MAP =   {0,  0,    0,    0,       0xF};



La verdad no se me ocurre manera de lograrlo. ¿Ustedes me pueden guiar por favor?

SALUDOS!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: Suky en 02 de Abril de 2010, 10:39:43
Si los pines están de forma tan aleatoria con una estructura no lo veo posible, porque esta coloca sus datos de forma consecutiva en la memoria en la posición que se le asigne  :?

De la forma que planteas los pines creo que no queda otra que usar mascaras y rotaciones  :(


Saludos!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: LABmouse en 02 de Abril de 2010, 11:17:46
Si, es cierto.. La verdad trabaje hasta tarde pero no funciono, ya ahora en la mañana decidí encararlo exactamente como dices.

SALUDOS!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: RICHI777 en 02 de Abril de 2010, 13:22:02
Yo para esot casos, utilizo esta manera, no es la mas eficiente ni en velocidad ni en tamaño de código pero es muy facilmente mantenible a nivel código.

Código: C
  1. /* Set Data */
  2.   ( Data & 0x01 ) ? ( D0_DISPLAY = 1 ) : ( D0_DISPLAY = 0 );
  3.   ( Data & 0x02 ) ? ( D1_DISPLAY = 1 ) : ( D1_DISPLAY = 0 );
  4.   ( Data & 0x04 ) ? ( D2_DISPLAY = 1 ) : ( D2_DISPLAY = 0 );
  5.   ( Data & 0x08 ) ? ( D3_DISPLAY = 1 ) : ( D3_DISPLAY = 0 );
  6.   ( Data & 0x10 ) ? ( D4_DISPLAY = 1 ) : ( D4_DISPLAY = 0 );
  7.   ( Data & 0x20 ) ? ( D5_DISPLAY = 1 ) : ( D5_DISPLAY = 0 );
  8.   ( Data & 0x40 ) ? ( D6_DISPLAY = 1 ) : ( D6_DISPLAY = 0 );
  9.   ( Data & 0x80 ) ? ( D7_DISPLAY = 1 ) : ( D7_DISPLAY = 0 );

Donde Data es el byte completo que quiero transmitir y DX_DISPLAY es un macro con el port correspondiente.

Saludos !
Título: Re: Funcion de Boolean (novatadas)
Publicado por: Suky en 02 de Abril de 2010, 13:30:27
Yo defino los pines y hago esto:

Código: C
  1. DATA_PIN_7 = (unsigned int)((cmd & 0x80)>>7);
  2.                 DATA_PIN_6 = (unsigned int)((cmd & 0x40)>>6);
  3.                 DATA_PIN_5 = (unsigned int)((cmd & 0x20)>>5);
  4.                 DATA_PIN_4 = (unsigned int)((cmd & 0x10)>>4);

Creo que es peor!  :x
Título: Re: Funcion de Boolean (novatadas)
Publicado por: LABmouse en 08 de Abril de 2010, 14:24:07
Hola,

Efectivamente al final resolví haciendo esto:


Citar
if ((n & 0b00000001)!=0)LCD_PIN_DATA0=1; else   LCD_PIN_DATA0=0;
if ((n & 0b00000010)!=0)LCD_PIN_DATA1=1; else   LCD_PIN_DATA1=0;
if ((n & 0b00000100)!=0)LCD_PIN_DATA2=1; else   LCD_PIN_DATA2=0;
if ((n & 0b00001000)!=0)LCD_PIN_DATA3=1; else   LCD_PIN_DATA3=0;                               
if ((n & 0b00010000)!=0)LCD_PIN_DATA4=1; else   LCD_PIN_DATA4=0;
if ((n & 0b00100000)!=0)LCD_PIN_DATA5=1; else   LCD_PIN_DATA5=0;
if ((n & 0b01000000)!=0)LCD_PIN_DATA6=1; else   LCD_PIN_DATA6=0;
if ((n & 0b10000000)!=0)LCD_PIN_DATA7=1; else   LCD_PIN_DATA7=0;


Título: Re: Funcion de Boolean (novatadas)
Publicado por: RICHI777 en 08 de Abril de 2010, 14:36:13
Hola Lab, es casi la misma manera que detalle yo. Como comentario al paso, la notación 0bxxx no es un estandart del ANSI C o del C99 ( Creo que lo popularizo GCC ). A estos efectos se puede reemplazar el if-else por el operador ternario que cumple la misma función.

Saludos !
Título: Re: Funcion de Boolean (novatadas)
Publicado por: LABmouse en 08 de Abril de 2010, 14:47:20
RICHI, muchas gracias por el comentario, no sabia que el 0b000.. no era ANSI-C.  Queda anotado para tenerlo en cuenta inmediatamente.

Lo del operador ternario, lo había visto y usado, pero me parece queda el código como sin estructura, claro hace lo mismo que el if..else. Son bobadas mías tal vez.

Muchas gracias por tus consejos, siempre muy bienvenidos.

Título: Re: Funcion de Boolean (novatadas)
Publicado por: RICHI777 en 08 de Abril de 2010, 15:06:43
Para mi es un placer sumar un granito de arena a un grande como ud !

Saludos !
Título: Re: Funcion de Boolean (novatadas)
Publicado por: Suky en 08 de Abril de 2010, 21:44:45
No es tan igual:

Código: C
  1. 41:                     if((n&0x80)!=0){LCD_PORT_D7 = 1;}else{LCD_PORT_D7 = 0;}
  2.  00386  E0041E     cp0.b [0x001c]
  3.  00388  3D0002     bra ges, 0x00038e
  4.  0038A  A8E2CA     bset.b 0x02ca,#7
  5.  0038C  370001     bra 0x000390
  6.  0038E  A9E2CA     bclr.b 0x02ca,#7
  7. 42:                    
  8. 43:                     ( n & 0x80 ) ? ( LCD_PORT_D7 = 1 ) : ( LCD_PORT_D7 = 0 );
  9.  00390  E0041E     cp0.b [0x001c]
  10.  00392  3D0003     bra ges, 0x00039a
  11.  00394  A8E2CA     bset.b 0x02ca,#7
  12.  00396  BFC2CA     mov.b 0x02ca,0x0000
  13.  00398  370002     bra 0x00039e
  14.  0039A  A9E2CA     bclr.b 0x02ca,#7
  15.  0039C  BFC2CA     mov.b 0x02ca,0x0000


Saludos!
Título: Re: Funcion de Boolean (novatadas)
Publicado por: RICHI777 en 09 de Abril de 2010, 11:29:17
Hola, desconozco realmente assembler de un MicroChip con lo cual no puedo entender bien que hace el compilador. Lo que si fue probar en el CodeWarrior ( compilador oficial de FreeScale ) y el código generado es igual. Como nota particular fue ver lo elegante del codigo generado con una optimizacion que no conocia y habla de la calidad del compilador.

Código: ASM
  1. 258:    ( Data & 0x01 ) ? ( PTAD_PTAD1 = 1 ) : ( PTAD_PTAD1 = 0 );
  2.   0017 95       [2]             TSX  
  3.   0018 f6       [3]             LDA   ,X
  4.   0019 a501     [2]             BIT   #1
  5.   001b 2603     [3]             BNE   L20 ;abs = 0020
  6.   001d 1300     [5]             BCLR  1,_PTAD
  7.   001f 65       [3]             SKIP2 L22 ;abs = 0022
  8.   0020          L20:    
  9.   0020 1200     [5]             BSET  1,_PTAD
  10.   0022          L22:    
  11.   259:  
  12.   260:    if ( Data & 0x01 )
  13.   0022 a501     [2]             BIT   #1
  14.   0024 2704     [3]             BEQ   L2A ;abs = 002a
  15.   261:    {
  16.   262:      PTAD_PTAD1 = 1;
  17.   0026 1200     [5]             BSET  1,_PTAD
  18.   263:    }
  19.   264:    else
  20.   265:    {
  21.   266:      PTAD_PTAD1 = 0;
  22.   267:    }
  23.   268:  }
  24.   0028 8a       [3]             PULH  
  25.   0029 81       [6]             RTS  
  26.   002a          L2A:    
  27.   002a 1300     [5]             BCLR  1,_PTAD
  28.   002c 8a       [3]             PULH  
  29.   002d 81       [6]             RTS

La diferencias tienen que ver que estos dos condicionales estan al final de la funcion, si uno los invierte en el orden el código generado es similar. La optimizacion que les hablo es esta:

Código: ASM
  1. 001d 1300     [5]             BCLR  1,_PTAD
  2.   001f 65       [3]               SKIP2 L22 ;abs = 0022
  3.   0020          L20:    
  4.   0020 1200     [5]             BSET  1,_PTAD
  5.   0022          L22:

Y trabaja asi, una vez que el port es apagado ( BLCR 1, PTAD ) Bit Clear 1 del Port A, se necesita saltar despues del ELSE del condicional, en vez de realizar un salto condicional ( BRA ) que consume 2 bytes, simplemente hace una comparacion del  registro de 16 bits con una posicion de memoria, como esta instruccion consume 3 bytes me estoy ahorrando un byte. El 0x65 XX XX es justamente el OpCode de la instruccion CMPHX XXXX y XXXX son los dos bytes que consume el prendido del Port, obvio que el resultado de la comparacion es ignorado.
Estas son las cosas que me referia en algun post, que para mi la calidad de un entorno se ve en el código generado por el compilador, no si es mas bonito o no, si es mas facil de usar o no, si es Eclipse o no.

Saludos !

PD: Suky tu eres un experto es assembler de MicroChip, si eres tan amable podrias explicar que hace el compilador en el dissambler que posteaste ? Muchas gracias !