Autor Tema: Funcion de Boolean (novatadas)  (Leído 6037 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Funcion de Boolean (novatadas)
« Respuesta #15 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 !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcion de Boolean (novatadas)
« Respuesta #16 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
No contesto mensajes privados, las consultas en el foro

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Funcion de Boolean (novatadas)
« Respuesta #17 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;



Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Funcion de Boolean (novatadas)
« Respuesta #18 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 !

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: Funcion de Boolean (novatadas)
« Respuesta #19 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.


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Funcion de Boolean (novatadas)
« Respuesta #20 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 !

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcion de Boolean (novatadas)
« Respuesta #21 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!
No contesto mensajes privados, las consultas en el foro

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Funcion de Boolean (novatadas)
« Respuesta #22 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 !