Autor Tema: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA  (Leído 27911 veces)

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

Desconectado Rick_x

  • PIC10
  • *
  • Mensajes: 32
COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« en: 23 de Diciembre de 2009, 20:30:58 »
Estimado foreros como principiante que soy tengo la siguiente pregunta:

¿como volver al inicio de mi programa cuando estoy ejecutando una funcion, es decir que al presionar una tecla por ejemplo el "4" la funcion se deje de ejecutar y regrese al inicio del programa?

como lo hago, con que instrucción

MUCHISIMAS GRACIAS!!

acontinuacion el codigo de programa

include <16f877a.h>
#device adc=10
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#FUSES
#use delay(clock=4000000)
#include <lcd.c>
#include <kbd.c>

//****************** Declaracion de Funciones *******************

void Lectura(void);       // funcion que lee los puertos ADC
void OPCION_UNO(void);
void OPCION_DOS(void);

//****************  Programa Principal ***************************

void main()
{
//  Declaracion de variables
   long vol,cor;           
   char k;
   int x;

//  Configuraciones
   setup_adc_ports(AN0_AN1_VREF_VREF);   
   setup_adc(ADC_CLOCK_INTERNAL);

   lcd_init();
   kbd_init();

   port_b_pullups(TRUE);


   printf(lcd_putc, "\fPARA INICIAR\n1: Enter");

   while (TRUE)
   {

      k=kbd_getc();
      x=k-48;
      if (x==1)
         {
         printf(lcd_putc, "\f1:OPCION 1 \n2:OPCION 2");
         while(TRUE)
            {
            k=kbd_getc();
            x=k-48;   
            switch(x)
               {
               case 1: OPCION_UNO();
               case 2: OPCION_DOS();         
               }
            }
         }      
   }
}

//********************* Definicion de Funciones ***************************

void Lectura(void)
{
// FUNCION DE LECTURA DE PUERTOS ADC
}

//************************************************************************

void OPCION_UNO(void)
{
   int k,x;
   printf(lcd_putc, "\fADQUISICION");   
   while (TRUE)
   {
      k=kbd_getc();
      x=k-48;
      if (x=4)
      ??????            //<==== AQUI ESTA MI DUDA
   }
   
}

//************************************************************************

void OPCION_DOS(void)
{
   printf(lcd_putc, "\fTIEMPO REAL");
}

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #1 en: 23 de Diciembre de 2009, 21:25:26 »
Si lo que quieres es salir de la función lo puedes hacer con return.
Si lo que quieres es que tu micro comience desde cero como si lo acabaras de encender lo puedes hacer con reset_cpu();

Desconectado Rick_x

  • PIC10
  • *
  • Mensajes: 32
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #2 en: 23 de Diciembre de 2009, 22:14:21 »
Gracias Nocturno por indicarme usar la instruccion reset_cpu()
en caso tal que deseara desde dentro de una funcion volver a un punto del programa forzando el salto, como se ocupa goto en CCS?
como coloco etiquetas?? para volver a un punto determinado de programa?

otra pregunta ¿la instruccion return me permite volver al punto donde fue llamada mi funcion y devolver el valor de retorno, pero si no tiene valor de retorno la funcion, no me funciona?

muchas gracias por responder mis preguntas de novato
 

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #3 en: 23 de Diciembre de 2009, 22:33:49 »
en caso tal que deseara desde dentro de una funcion volver a un punto del programa forzando el salto, como se ocupa goto en CCS?
como coloco etiquetas?? para volver a un punto determinado de programa?

En lenguajes de alto nivel, como el C, una programacion decente jamás debería usar una instrucción goto. Deberías poder resolver los "saltos" con las estructuras de control de flujo disponibles.
Aún así, si elegís hacerlo, exíste la instrucción "goto" y las etiquetas, al igual que en asm se escriben como "etiqueta:"

Ejemplo:

Inicio:
     goto Inicio;

otra pregunta ¿la instruccion return me permite volver al punto donde fue llamada mi funcion y devolver el valor de retorno, pero si no tiene valor de retorno la funcion, no me funciona?

La instrucción return libera la pila("stack") en un nivel, haciendo que el microcontrolador continúe, luego del return, ejecutando desde donde habia quedado al momento de que ocurriese la llamada a la función, producida por una llamada explícita o bien una interrupción.

Si la función no devuelve nada("void"), entonces deberías utilizar sólo la palabra return sin devolver tipo alguno y listo.

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.

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #4 en: 23 de Diciembre de 2009, 23:16:40 »
En lenguajes de alto nivel, como el C, una programacion decente jamás debería usar una instrucción goto. Deberías poder resolver los "saltos" con las estructuras de control de flujo disponibles.
Aún así, si elegís hacerlo, exíste la instrucción "goto" y las etiquetas, al igual que en asm se escriben como "etiqueta:"

Los lenguajes de alto nivel por lo general son lenguajes que a la hora de compilar gastan mucha memoria, y ademas no realizan los "saltos" a como lo realizariamos como si trabajaramos en ASM, es decir, son simplemente compiladores, y como tales son estupidos.

A lo que me refiero es que es posible que en muchas ocaciones sea mucho mejor utilizar goto que continue o break, o cosas como esas, en otras ocaciones es imposible regrasar a una parte exacta del codigo ASM mediante estos saltos, por lo tanto es mejor utilizar el goto del ASM.

Las computadoras solo hacen lo que les ordenamos.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #5 en: 23 de Diciembre de 2009, 23:30:05 »
Yo no me acuerdo doooonde fue que vi algo relacionado a una demostración a la no necesidad de los GOTO en lenguajes de alto nivel.

El papel lo aguanta todo

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #6 en: 23 de Diciembre de 2009, 23:42:47 »
Rick en tu caso, podrias implementar el uso de banderas para volver a la bucle principal.

ejemplo:

Código: C
  1. ...
  2. void OPCION_UNO(void)
  3. {
  4.    int k,x;
  5.    printf(lcd_putc, "\fADQUISICION");  
  6.    while (TRUE)
  7.    {
  8.       k=kbd_getc();
  9.       x=k-48;
  10.       if (x=4)
  11.       bSalir=true;
  12.    }
  13.    
  14. }
  15. ...

y en las siguientes funciones, preguntas por bSalir antes de hacer cualquier cosa, si es true, no hará nada y lo que hará es saltar y saltar hasta que vuelva a While(1) ó hasta que bSalir<>true


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Rick_x

  • PIC10
  • *
  • Mensajes: 32
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #7 en: 23 de Diciembre de 2009, 23:50:33 »
basicamente lo que necesito es durante la ejecucion de una funcion de lectura de ADC interrumpirla cuando se presione una tecla de un teclado conectado al puerto_D y volver al inicio del programa. con la instruccion reset_cpu() lo logré.
pero aun me queda una duda, atraves de este teclado tengo dos teclas una que funcione como "aceptar" y otra como "volver" es decir, si presento un menu con dos opciones, ingreso a una de ellas y si luego quisiera volver al inicio del menu anterior.. como puedo hacer eso sin utilizar el goto... si me ayudan con el coodigo o algoritmo se los AGRADEZCO :-)

saludos  

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #8 en: 24 de Diciembre de 2009, 03:53:12 »
Aunque lo hayas logrado con el reset_cpu() no me parece el método más elegante para conseguir lo que estás buscando.

Yo creo que deberías implementar una máquina de estados y gestionar la opción del menú en la que te encuentras en cada momento con una estructura switch/case.

Un ejemplo simple que no funciona pero espero que ilustre la idea:


Código: C
  1. int MaquinaEstados=0;
  2. int tecla;
  3.  
  4. while (true)  {
  5.         tecla = EsperaTecla;
  6.   switch (MaquinaEstados) {
  7.                 case 1:
  8.                         if (tecla='1')
  9.                                 MaquinaEstados=3;
  10.                         else
  11.                                 MaquinaEstados=5;                      
  12.                         break;
  13.                 case 2:
  14.                         if (tecla='2')
  15.                                 MaquinaEstados=3;
  16.                         else if (tecla=='0')
  17.                                 MaquinaEstados=0;
  18.                         else
  19.                                 MaquinaEstados=2;
  20.                         break; 
  21.     otherwise:
  22.         MaquinaEstados=1;
  23.   }

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #9 en: 24 de Diciembre de 2009, 12:30:05 »
Citar
Los lenguajes de alto nivel por lo general son lenguajes que a la hora de compilar gastan mucha memoria, y ademas no realizan los "saltos" a como lo realizariamos como si trabajaramos en ASM, es decir, son simplemente compiladores, y como tales son estupidos.

Es una afirmacion bastante osada, me imagino que conoces tantisimos compiladores como para afirmar eso...

Saludos !

Desconectado ferna108

  • PIC10
  • *
  • Mensajes: 12
Re: COMO VOLVER DE UNA FUNCION AL INICIO DEL PROGRAMA
« Respuesta #10 en: 25 de Diciembre de 2009, 07:35:36 »
yo he utilizado el GOTO

lcd_gotoxy(4,2);
lcd_putc("ELECTRONICA");
inicio:                // etiqueta para comenzar otras vez una vez que apretemos tecla START

if(input(PIN_A4)&& (control ==0))//si pulso A4 y contadorpower =0 o sea OFF
         {
         control=0;
         goto inicio;
         }

y cuando quiero volver lo uso asi, no se si esto es lo que buscas.

un saludo