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:
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
valor=(input_b()&0x07);
Switch (valor){
case6://El pin B0 = 0
delay_ms(10);
break;
case5:// El pin B1 es 0
delay_ms(10);
break;
case3:// El pin B2 es 0
delay_ms(10);
break;
}
con este otro:
Código: C
if(input(PIN_B0))
delay_ms(10);
elseif(input(PIN_B1))
delay_ms(10);
else
if(input(PIN_B2))
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...