Autor Tema: Duda sobre el SWITCH  (Leído 3775 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Duda sobre el SWITCH
« 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!
« Última modificación: 14 de Abril de 2007, 00:16:32 por Marttyn »
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Duda sobre el SWITCH
« Respuesta #1 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.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
Re: Duda sobre el SWITCH
« Respuesta #2 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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Duda sobre el SWITCH
« Respuesta #3 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:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda sobre el SWITCH
« Respuesta #4 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda sobre el SWITCH
« Respuesta #5 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?
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda sobre el SWITCH
« Respuesta #6 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
« Última modificación: 14 de Abril de 2007, 12:13:42 por Marttyn »
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
Re: Duda sobre el SWITCH
« Respuesta #7 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.
« Última modificación: 14 de Abril de 2007, 19:00:35 por Duende_Azul »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Duda sobre el SWITCH
« Respuesta #8 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.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda sobre el SWITCH
« Respuesta #9 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:
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
Re: Duda sobre el SWITCH
« Respuesta #10 en: 15 de Abril de 2007, 03:17:35 »
Mas instrucciones, mas rom y mas trabajo tambien.  :)

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1836
    • IDEAA
Re: Duda sobre el SWITCH
« Respuesta #11 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
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Duda sobre el SWITCH
« Respuesta #12 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.
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: Duda sobre el SWITCH
« Respuesta #13 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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything