TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: iNoXSteeL en 26 de Noviembre de 2009, 16:33:28

Título: Simplificar código?
Publicado por: iNoXSteeL en 26 de Noviembre de 2009, 16:33:28
Hola a todos,

trato de hacer un pequeño ejercicio usando las interrupciones RB4-RB7, por lo que me pregunto, que si para hacer algo como el código que muestro estaría bien, o se puede simplificar de alguna otra forma, alguna otra instrucción. Funciona, pero quizá lo veo muy rudimentario con tanto if, alguna idea?

Código: C
  1. #INT_RB
  2.    void interrupciones(void)
  3.    {
  4.    
  5.       while (!portb == 0x00)
  6.          {
  7.          if (RB4==1 && RB7==0){RA0=1; RET; RA0=0; RET;}                //INTERMITENCIA IZD CON LUZ TRASERA 0FF
  8.          if (RB5==1 && RB7==0){RA1=1; RET; RA1=0; RET;}                //INTERMITENCIA DCH CON LUZ TRASERA OFF  
  9.          if (RB5==1 && RB7==1 && RB6==0)
  10.                   {RA1=1; RA3=1; RET; RA1=0; RA3=0; RET;}                  //INTERMITENCIA DCH CON LUZ TRASERA ON
  11.          if (RB4==1 && RB7==1 && RB6==0)
  12.                   {RA0=1; RA3=1; RET; RA0=0; RA3=0; RET;}                  //INTERMITENCIA IZD CON LUZ TRASERA ON
  13.        
  14.          if (RB4==1 && RB7==1 && RB6==1)                                        //INTERMITENCIA Y LUZ DE FRENO SIMULTÁNEA
  15.                   {RA3=1; RA2=1; RA0=1; RET; RA0=0; RET;}
  16.          if (RB5==1 && RB7==1 && RB6==1)
  17.                   {RA3=1; RA2=1; RA1=1; RET; RA1=0; RET;}
  18.          
  19.          if (RB6==1 && RB7==0)  {RA2=1; RA3=1;}                             //LUZ DE FRENO ON Y OFF
  20.          if (RB6==0){RA2=0; RA3=0;}                                                 //APAGA LUZ DE FRENO Y TRASERA      
  21.          
  22.          if (RB7==1 && RB6==1)  {RA3=1; RA2=1;}                             //LUZ DE FRENO ON Y TRASERA ON SIN PARPADEO
  23.        
  24.          if (RB7==1 && RB6==0 && RB4==0 && RB5==0)
  25.                   {RA3=1; RET; RA3=0; RET;}                                          //LUZ TRASERA ON SIN INTERMITENCIA
  26.        
  27.          }
  28.    
  29.     output_b(input_b());
  30.     }

Gracias de antemano, un saludo.
Título: Re: Simplificar código?
Publicado por: Nocturno en 26 de Noviembre de 2009, 18:52:10
Podrías aprovecharte de que los 4 pines que chequeas son contiguos en el PORTB para operar con ellos matemáticamente.

Por ejemplo, esto: if (RB7==1 && RB6==0 && RB4==0 && RB5==0)
es igual que esto: if ((PORTB>>4)==0b1000)
Título: Re: Simplificar código?
Publicado por: migsantiago en 26 de Noviembre de 2009, 19:05:12
Y también usando el mismo ejemplo de Manolo podrías eficientarlo usando máscaras...

Código: [Seleccionar]
if((PORTB & 0xF0) == 0x80)
   sentencia;
Título: Re: Simplificar código?
Publicado por: iNoXSteeL en 27 de Noviembre de 2009, 11:07:07
Hola,

Nocturno, Migsantiago, gracias por las aclaraciones, ciertamente queda más elegante que de la forma que yo expuse.

Ire probando las diferentes formas en mis rutinas, viendo cual me resulta más o menos fácil.

Un saludo.