TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: josefe en 08 de Abril de 2013, 11:38:30

Título: ayuda goto funciones ciclos en pic c ccs
Publicado por: josefe 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.
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: planeta9999 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.


Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: josefe 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.
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: josefe 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);
}

Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: BrunoF 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?
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: josefe 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.
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: BrunoF en 08 de Abril de 2013, 13:09:59
Mostra el esquema de conexión que estás usando. El error está ahí seguramente.
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: josefe 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.
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: BrunoF 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){...}
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: BrunoF 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. }
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: josefe 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
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: BrunoF 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.
 

Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: josefe 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.
Título: Re: ayuda goto funciones ciclos en pic c ccs
Publicado por: BrunoF 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.