Autor Tema: ayuda goto funciones ciclos en pic c ccs  (Leído 8471 veces)

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

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
ayuda goto funciones ciclos en pic c ccs
« en: 08 de Abril de 2013, 11:38:30 »
Buenas, primero que todo quiero decirles que ya utilice el buscador y los temas que quiero tratar se encuentran dispersos en varios temas y ademas no estan solucionados completamente por tal motivo abro este tema para unir todo esto y que me ayuden a resolver estas dudas que ademas muchos tendran. En el caso de que vaya a vanzando tambien pondre esos avances.


La cuestion es la siguiente:

Quiero hacer un menú el cual va a utilizar ciclos while. Supongamos que tenemos dos pulsadores que funcionan como subir y bajar por el menu, va a entrar en u n ciclo while que si no me equivoco al colocarle la condicion true seguira funcionando hasta que se apague el pic. Al entrar al primer ciclo alli se queda y no sale

Algo asi
Código: [Seleccionar]

si (rb0==1)
{
    do
   {
    ...................
    }while(true)

}

si (rb1==1)
{
    do
   {
    ...................
    }while(true)

}




Esto es mas o menos lo que queria hacer, pero no encontre la forma de hacer que saliera del while, trate de utilizar funciones y utilizando un swict pero no salia del ciclo tampoco

Código: [Seleccionar]
int funcion1;
int funcion2;

void main()
{
si (rb0==1)
{
    var=1;

}

si (rb1==1)
{
    var=2;
}

swich(var)
{
case 1:funcion1;
break;
case2: funcion2;
break;
}
}


Entonces desisti por que tenia apuro por hacer el programa ya que necesitaba entregarlo para la clase de microporcesadores, entonces me fui por lo facil y utilice goto.
Con esto ya me funciona el programa pero de que sirve utilizar lenguajes avanzados si voy a utilizar codigo obsoleto.

Como podria solucionarlo de una forma actual?


NOTA:Faltan declaraciones de variables y algunos que otros erroes en los codigo que deje, eso es obvio.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #1 en: 08 de Abril de 2013, 11:54:21 »



Puedes forzar la salida de un bucle, usando la instrucción "break", pero vamos que si pones la condición en el "while", se saldrá automáticamente en cuanto deje de cumplirse. Si pones "while (true)", es normal que se quede ahí etérnamente.



Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #2 en: 08 de Abril de 2013, 11:59:42 »



Puedes forzar la salida de un bucle, usando la instrucción "break", pero vamos que si pones la condición en el "while", se saldrá automáticamente en cuanto deje de cumplirse. Si pones "while (true)", es normal que se quede ahí etérnamente.




creo que ya vi la matrix :D

algo asi, colocaria otro boton.

Código: [Seleccionar]
si (rb0==1)
{
    do
   {
    ...................
    }while(rb3==0)

}

si (rb1==1)
{
    do
   {
    ...................
    }while(rb3==0)

}


Pero no se creo que falta algo, voy a hacerlo en pic c y proteus a ver que pasa.

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #3 en: 08 de Abril de 2013, 12:42:29 »
en proteus y pic c hice lo de arriba ahora no hace nada asi precione el boton

Código: [Seleccionar]
lcd_putc("hola2");
delay_ms(500);

if(input(pin_B1)==1)
{
lcd_putc("\f");
   do
   {
   //a=a+1;
   //delay_ms(500);
   printf ( lcd_putc,"cono");
     
   }while(input(pin_B3)==0);
}

if(input(pin_B2)==1)
{

   do
   {
   lcd_gotoxy(2,2);
   b=b+3;
   delay_ms(500);
   printf ( lcd_putc,b);
   }while(input(pin_B3)==0);
}


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #4 en: 08 de Abril de 2013, 12:54:42 »
Detenete a analizar el código un instante.

Recorrelo por cada rama, viendo qué sucede cuando se cumple una estructura de control de flujo(if, while, for, etc).

¿Qué comportamiento estás buscando con los botones? ¿que al mantener un botón haga algo en la pantalla y al presionar el otro botón haga otra cosa distinta?
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #5 en: 08 de Abril de 2013, 13:02:15 »
Detenete a analizar el código un instante.

Recorrelo por cada rama, viendo qué sucede cuando se cumple una estructura de control de flujo(if, while, for, etc).

¿Qué comportamiento estás buscando con los botones? ¿que al mantener un botón haga algo en la pantalla y al presionar el otro botón haga otra cosa distinta?


Un menu, que al pulsar el boton 1 me haga la primera sentencia do while y salga de ella si es precionado el boton 3, luego precionar el boton 2  y empiece con ese do while he igualmente este salga al precionar el boton 3.

Creo que para que funcione falta algo un while creo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #6 en: 08 de Abril de 2013, 13:09:59 »
Mostra el esquema de conexión que estás usando. El error está ahí seguramente.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #7 en: 08 de Abril de 2013, 13:14:45 »
Mostra el esquema de conexión que estás usando. El error está ahí seguramente.

No, ya que si ves arriba en el ultimo codigo que deje, coloco una linea de prueba que le mando al lcd que es "hola2" esta se muestra corectamente en la pantalla ademas los puertos b estan seteados para que sean entrada solamente, lo que yo creo que esta pasando es que el programa empieza, ejecuta las lineas de codigo evaluando cada if y alli termina, no hace mas nada, no vuelve al inicio, por eso fue que utilice los obsoletos goto como explique arriba en el primer comentario para que volviera al inicio o donde yo quisiera.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #8 en: 08 de Abril de 2013, 13:15:24 »
No olvides que el código que revisa el estado de los pulsadores debe ser llamado siempre, no sólo una vez. Encerra el código dentro de un while(1){...}
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #9 en: 08 de Abril de 2013, 13:17:03 »
Código: C
  1. lcd_putc("hola2");
  2. delay_ms(500);
  3.  
  4. while(1){
  5.   if(input(pin_B1)==1)
  6.   {
  7.   lcd_putc("\f");
  8.      do
  9.      {
  10.      //a=a+1;
  11.      //delay_ms(500);
  12.      printf ( lcd_putc,"cono");
  13.      
  14.      }while(input(pin_B3)==0);
  15.   }
  16.  
  17.   if(input(pin_B2)==1)
  18.   {
  19.  
  20.      do
  21.      {
  22.      lcd_gotoxy(2,2);
  23.      b=b+3;
  24.      delay_ms(500);
  25.      printf ( lcd_putc,b);
  26.      }while(input(pin_B3)==0);
  27.   }
  28. }
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #10 en: 08 de Abril de 2013, 13:20:19 »



ok, eso era lo que preguntaba, todo el codigo debe esta dentro de un while, de manera que mientras que este encendido o el pic reciba voltaje este codigo se repita o sea evaluado nuevamente, ¿Dime si estoy en lo correcto? de esa manera que dejaste si deberia de funciona

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #11 en: 08 de Abril de 2013, 13:24:59 »
Siempre el procesador del uC debe ser atrapado por código controlado por ti, caso contrario se pierde el control y probablemente termine en comportamiento indeseado, resets, e incluso daños al hardware (dependiendo de los componentes con los que interactúe). Lo usual es atraparlo mediante un bucle infinito en el main, pero no es la única manera de hacerlo. Lo importante es que te asegures que el código quede siempre bajo tu control. Algunas pocas aplicaciones pueden requerir que el código no quede atrapado, y sólo duerman esperando un reset o power cycle por parte del usuario.
 

« Última modificación: 08 de Abril de 2013, 13:27:33 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado josefe

  • PIC12
  • **
  • Mensajes: 68
    • mi blog http://freespacejd.blogspot.com
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #12 en: 08 de Abril de 2013, 13:34:16 »
Siempre el procesador del uC debe ser atrapado por código controlado por ti, caso contrario se pierde el control y probablemente termine en comportamiento indeseado, resets, e incluso daños al hardware (dependiendo de los componentes con los que interactúe). Lo usual es atraparlo mediante un bucle infinito en el main, pero no es la única manera de hacerlo. Lo importante es que te asegures que el código quede siempre bajo tu control. Algunas pocas aplicaciones pueden requerir que el código no quede atrapado, y sólo duerman esperando un reset o power cycle por parte del usuario.
 




OK, El codigo lo probe y quedo funcionando bien, solo algunos detallitos como el delay que habia q cambiarlo de lugar y le agregue limpiar el lcd.

Asi quedo el do while del if, esto para el primer if.  quedo bien, claro que esto es algo basico, lo mejor seria usar un switch y funciones a mi parecer pero utilizando el principio que dijiste anteriormente.

Código: [Seleccionar]
do
   {
   a=a+1;
 
  lcd_putc("\f");
  printf(lcd_putc,"valor = %u\r",a);
   delay_ms(500);
    }while(input(pin_B3)==0);

Gracias de antemano por la ayuda.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda goto funciones ciclos en pic c ccs
« Respuesta #13 en: 08 de Abril de 2013, 13:35:48 »
Si, y ojo que en hardware real no se va a comportar tan idealmente. Vas a tener que solventar los rebotes mecánicos de los pulsadores.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything