TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Marttyn en 13 de Abril de 2007, 23:28:45

Título: Duda sobre el SWITCH
Publicado por: Marttyn en 13 de Abril de 2007, 23:28:45
hola!
estoy en un punto en que no se como avanzar... quiero usar un switch para ver cual de 3 pines del pic es 0, porque el if me parece mas desprolijo en este caso...
la situacion es la siguiente: tengo 3 pines del pic, cada uno con su pull up, y la posibilidad de, con un jumper, unirlo a Vss. solo puede hacerce esto con un pin a la vez, es decir, solo un jumper para los 3 pines... esto sirve para seleccionar el "estado" en el q se encuentra el pic, dependiendo de que pin este conectado a vss hara una cosa u otra...
como ya dije, me parece mas prolijo usar un switch en este caso... pero no se si sera posible, lo que se me ocurrio es esto:
Código: [Seleccionar]
switch (0){
case PIN1:
 ....
case PIN2:
 ....
case PIN3:
 ....
}
pero el problema de esto es que "0" no se si es una expresion, y "PINx" no es una constante...
hay alguna manera de conseguirlo?
y en ultimo caso, existe el elseif en c? porque tampoco me gusta anidar if... jeje, que maniatico que soy
gracias!
Título: Re: Duda sobre el SWITCH
Publicado por: Nocturno en 14 de Abril de 2007, 02:27:34
No se me ocurre ninguna manera de hacerlo con switch, pero anidando if sale perfectamente. ¿Porqué no te gusta?, al fin y al cabo el switch internamente hace lo mismo.
Título: Re: Duda sobre el SWITCH
Publicado por: Duende_Azul en 14 de Abril de 2007, 10:08:47
Si los pines son de un mismo puerto es posible hacerlo de la siguiente forma:

Suponiendo que los pines son B0, B1, B2:

valor=(input_b & 0x07)
Switch (valor) {

case 6:    //El pin B0 = 0
          :
          :
       break;

case 5:   // El pin B1 es 0
          :
          :
       break;

case 3:  // El pin B2 es 0
          :
          :
      break;

}

Si los pines pertenecen a puertos distintos pues creo que mejor seria usar los If
Título: Re: Duda sobre el SWITCH
Publicado por: MGLSOFT en 14 de Abril de 2007, 11:08:38
Ademas ese formato permite ver combinaciones de dos o mas entradas activas a la vez... :mrgreen: :mrgreen:
Título: Re: Duda sobre el SWITCH
Publicado por: Marttyn en 14 de Abril de 2007, 11:53:16
duende azul, gracias por tu respuesta!
me has hecho sudar la gota gorda!
hace ya 48 minutos que le estoy dando vueltas a tu solucion!
yo deje la carrera de ingenieria informatica cuando estabamos dando logica (sisi, a los pocos meses) y tambien deje el FP de electronica; ya habia dado logica, pero no recuerdo mucho... asi que algo tan simple como "port_b & 0x07" me costo muchisimo descifrar su significado!
eso si, ahora que lo descifre por mi mismo me siento mas inteligente y orgulloso de mi!  :mrgreen:
salu2
Título: Re: Duda sobre el SWITCH
Publicado por: Marttyn en 14 de Abril de 2007, 12:06:27
ya la fastidie!
creia que lo habia entendido, pero haciendo las tablas de verdad (para los novatos es la mejor solucion!  :D) los resultados no me dan!
0x07 = 0b00000111

hay tres tablas de verdad posibles:
pin b0 activado:
port_b & 0x07
 1           1  = 1
 0           1  = 0
 0           1  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
resultado 0x01

pin b1 activado:
port_b & 0x07
 0           1  = 0
 1           1  = 1
 0           1  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
resultado 0x02

pin b2 activado:
port_b & 0x07
 0           1  = 0
 0           1  = 0
 1           1  = 1
 x           0  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
 x           0  = 0
resultado 0x04

a ti te da que si b0 esta activado el resultado es 6, si b1 el resultado es 5 y si b2 el resultado es 3  :z)
vamos, que no quiero poner en duda tu logica... pero, o hay algo que no entendi, o hay algo que no esta del todo bien...  :?
que opinas?
Título: Re: Duda sobre el SWITCH
Publicado por: Marttyn en 14 de Abril de 2007, 12:09:39
me cxxx en la logica inversa de los pic! :5]
un uno no es activado, sino DESACTIVADO!!!
pues nada, que ya lo volvi a entender!
sigo sintiendome orgulloso de haberlo descifrado, pero tambien un poco avergonzado  :oops:
que borro soy
 :D :D :D
por cierto, hace falta asignar "port_b & 0x07" a una variable?
o se puede poner directamente en la expresion del switch? asi --> Switch (input_b() & 0x07) {
salu2
Título: Re: Duda sobre el SWITCH
Publicado por: Duende_Azul en 14 de Abril de 2007, 18:57:32
Creo que se puede, yo uso la variable "valor" para mayor claridad del codigo, pero prueba a ver que pasa.  8)

Lo otro que queria comentar es que la "logica inversa" la planteaste tu en tu primer post cuando dijiste que los pines tienen el pull-up activado y querias detectar cuando un pin era cero.
Título: Re: Duda sobre el SWITCH
Publicado por: Nocturno en 15 de Abril de 2007, 02:19:59
Es una solución ingeniosa, aunque sobre gustos no hay nada escrito.

Si comparamos este código:
Código: C
  1. valor=(input_b() & 0x07);
  2. Switch (valor) {
  3. case 6:    //El pin B0 = 0
  4.           delay_ms(10);
  5.        break;
  6. case 5:   // El pin B1 es 0
  7.           delay_ms(10);
  8.        break;
  9. case 3:  // El pin B2 es 0
  10.           delay_ms(10);
  11.       break;
  12. }

con este otro:
Código: C
  1. if (input(PIN_B0))
  2.    delay_ms(10);
  3.   else if (input(PIN_B1))
  4.       delay_ms(10);
  5.      else
  6.          if (input(PIN_B2))
  7.             delay_ms(10);
cada uno escogerá el que más le guste. Pero al compilador está claro que le gusta más el segundo porque lo compila en 4 instrucciones menos.
Título: Re: Duda sobre el SWITCH
Publicado por: Marttyn en 15 de Abril de 2007, 02:28:58
si, lo de la logica inversa lo plantee yo, pero es que me hago un lio yo solo y no me entiendo a mi mismo  :D
pregunto... sin saber...
que ocupe 4 instrucciones mas significa que la compilacion ocupara mas rom? o simplemente que al compilador le dara mas trabajo? porque que al compilador le de mas trabajo (1 segundo mas a lo sumo) a mi me da lo mismo... que para eso le pago por horas!  :mrgreen:
Título: Re: Duda sobre el SWITCH
Publicado por: Duende_Azul en 15 de Abril de 2007, 03:17:35
Mas instrucciones, mas rom y mas trabajo tambien.  :)
Título: Re: Duda sobre el SWITCH
Publicado por: Marttyn en 15 de Abril de 2007, 14:45:31
pues nada... que se jodan todos, el micro, el compilador, el ordenador...
prefiero que mi codigo sea mas entendible a ahorrarme algunas lineas  :mrgreen:
por cierto, si no pusiera los BREAK, cuando salga de un case se analizara el siguiente, no?
y si tengo un DEFAULT al final, entrara siempre si no hay breaks?
salu2
Título: Re: Duda sobre el SWITCH
Publicado por: PalitroqueZ en 16 de Abril de 2007, 15:46:15
...
prefiero que mi codigo sea mas entendible a ahorrarme algunas lineas  :mrgreen:
...

otro punto de vista aceptable, la idea de programar en c es pensar en c, y tratar de alejarnos del asm, sobretodo si estamos cortos de tiempo, aunque no está mal la idea de ver como lo hace el compilador.
Título: Re: Duda sobre el SWITCH
Publicado por: MGLSOFT en 16 de Abril de 2007, 17:06:08
Para mi la solucion del switch es mas facil de entender y mantener a futuro.
Si hoy te olvidas una de las opciones o no la necesitas no la programas y listo, cuando la necesites la agregas rapidamente porque en plazo muy corto estaras nuevamente a tono...