TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: deibbe en 13 de Septiembre de 2011, 23:27:44

Título: devoler a una rutina
Publicado por: deibbe en 13 de Septiembre de 2011, 23:27:44
saludos a todos.

tengo una gran duda y es como hago para devolverme a la rutina principal estando en una subrutina, es que creo que es con un return pero primero no estoy seguro porque ya lo probe y no me salio o no c si es que no lo supe utilizar, en si es que tengo un teclado y una lcd y ps hay un menu de de 3 opciones pero si yo me voy a la primera opcion como hago pa salirme de esa primera opcion y volver al menu principal

muchas gracias si me pueden colaborar.
Título: Re: devoler a una rutina
Publicado por: rivale en 14 de Septiembre de 2011, 00:55:05
en que c programas?
una funcion si es del tipo void no necesitas ponerle nada, al finalizar regresa a la instruccion desde donde la llamaste
Título: Re: devoler a una rutina
Publicado por: deibbe en 14 de Septiembre de 2011, 02:29:20
yo programo en pic c compiler

si pero es que no necesito eso porque precisamente en una de las opciones del menu es que voy a variar un potenciometro con ADC, osea cuando este en esa opcion y quiera salirme de ella, yo puedo decir que cuando pulse una tecla  me puedo salir, osea digamos con # me salgo al menu principal,  entonces esa subrutina se acaba cuando yo pulse # y hay si me voy al menu principal, la subrutina no se acaba cuando se termine la funcion que se este ejecutando en la subrutina si no cuando yo le diga, ese es mi problema.

muchas gracias si me podeis ayudar.
Título: Re: devoler a una rutina
Publicado por: rivale en 14 de Septiembre de 2011, 08:45:56
si la funcion en la que estas la llamaste desde el main basta con que pongas un "return" y te regresara al main
Título: Re: devoler a una rutina
Publicado por: MerLiNz en 14 de Septiembre de 2011, 10:03:35
sin tu codigo es dificil saberlo
Título: Re: devoler a una rutina
Publicado por: Suky en 14 de Septiembre de 2011, 11:22:04
yo programo en pic c compiler

si pero es que no necesito eso porque precisamente en una de las opciones del menu es que voy a variar un potenciometro con ADC, osea cuando este en esa opcion y quiera salirme de ella, yo puedo decir que cuando pulse una tecla  me puedo salir, osea digamos con # me salgo al menu principal,  entonces esa subrutina se acaba cuando yo pulse # y hay si me voy al menu principal, la subrutina no se acaba cuando se termine la funcion que se este ejecutando en la subrutina si no cuando yo le diga, ese es mi problema.

muchas gracias si me podeis ayudar.

 :z)  :mrgreen:
Título: Re: devoler a una rutina
Publicado por: jhozate en 14 de Septiembre de 2011, 12:25:43
yo programo en pic c compiler

si pero es que no necesito eso porque precisamente en una de las opciones del menu es que voy a variar un potenciometro con ADC, osea cuando este en esa opcion y quiera salirme de ella, yo puedo decir que cuando pulse una tecla  me puedo salir, osea digamos con # me salgo al menu principal,  entonces esa subrutina se acaba cuando yo pulse # y hay si me voy al menu principal, la subrutina no se acaba cuando se termine la funcion que se este ejecutando en la subrutina si no cuando yo le diga, ese es mi problema.

muchas gracias si me podeis ayudar.

 :z)  :mrgreen:
si entendí bien...si es el caso de un menu, obviamente tendras la tecla pulsada en alguna variable, para seguir la secuencia yo uso otra variable "apuntador" que es la que indica para que parte del menu quiero ir, entonces te quedas en el menu mientras la tecla pulsada sea distinta de '#' y si es numeral entonces modificas el apuntador para donde quieres ir
Título: Re: devoler a una rutina
Publicado por: deibbe en 14 de Septiembre de 2011, 13:37:52
#include <16f877a.h>
#device adc=10
#fuses xt,nowdt,nobrownout
#use delay (clock=4000000)
#include <lcd.c>
#include "kbd_lib.c"

char a='7',b='8',c='1',d='2';
char y=1;
signed char x=1;
char t;
int16 q;
int16 p;

void control_temperatura(){
lcd_putc("\f control de \n\ temperatura");
delay_ms(2000);

for (;;){
 
   set_adc_channel(1);
   delay_us(20);
   p= read_adc();
   p=p/2.02666666667;
   printf(lcd_putc, "\f temperatura = \n %4ld C", p );
   delay_ms(150);
   }

lcd_putc(" \f ");

}

void clave(){

lcd_putc("\f alarma \n\ ingrese clave ");
t=0;
while (t==0){t=kbd_getc();}
lcd_putc(" \f ");

while (true){
t=0;
while (t==0){t=kbd_getc();}

      if(t==0){}
      else if(t=='1'){ lcd_putc(t);}
      else if(t=='2'){ lcd_putc(t);}
      else if(t=='3'){ lcd_putc(t);}
      else if(t=='4'){ lcd_putc(t);}
      else if(t=='5'){ lcd_putc(t);}
      else if(t=='6'){ lcd_putc(t);}
      else if(t=='7'){ lcd_putc(t);}
      else if(t=='8'){ lcd_putc(t);}
      else if(t=='9'){ lcd_putc(t);}
      else if(t=='0'){ lcd_putc(t);}
      else if(t=='B'){ lcd_putc(t);}
      else if(t=='A'){ return (-2);}
}
}

void main() {

setup_adc_ports(AN0_AN1_AN3);
setup_ADC(adc_clock_internal);

lcd_init();

while(t==0){
t= kbd_getc();
lcd_gotoxy(x,y);
lcd_putc(" escoja alguna opcion: 1, 2, 3 ");
delay_ms(150);
x--;
if(x==-30){x=17;}
}

if (t=='1')
control_temperatura();

else
if (t=='2'){

lcd_putc("\f control de \n\ set point ");
delay_ms(2000);

for (;;){

   set_adc_channel(0);
   delay_us(20);
   q= read_adc();
   if (q>150){
   clave();
   }

   else

   printf(lcd_putc, "\fADC = %4ld C", q );
   delay_ms(150);

}

}

}



gracias por el interes, miren hay esta mi codigo, no lo e completado me faltan alguna cosas, y pues si se fijan en la parte de la subrutina clave pulso cualquier tecla y ps hay si puedo empezar a digitar la clave, y como ven si le doy la opcin A coloque el return pero necesito que ese return me lleve al menu principal pero no me lleva al menu principal me lleva a la parte donde se visualiza la frase alarma ingrese clave. ps si lo quieren revisar aqui les dejo la libreria kbd_lib.c, y de nuevo muchas gracias por el interes espero me puedan ayudar.

// char kbd_getc()   Devuelve el código ASCII de la tecla pulsada.
//         Si no se pulsó ninguna, devuelve 0.

// Conexiones del teclado.
/*
            RB0 RB1 RB2 RB3
             ^   ^   ^   ^
             |   |   |   |
           |---|---|---|---|
  RB4 ---> | 1 | 2 | 3 | F |
           |---|---|---|---|
  RB5 ---> | 4 | 5 | 6 | E |
           |---|---|---|---|
  RB6 ---> | 7 | 8 | 9 | D |
           |---|---|---|---|
  RB7 ---> | A | 0 | B | C |
           |---|---|---|---|
*/

// Caracteres ASCII asociados a cada tecla:
char const KEYS[4][4] = {{'1','2','3','F'},
                         {'4','5','6','E'},
                         {'7','8','9','D'},
                         {'A','0','B','C'}};

#byte kbd_port_b = 6

char kbd_getc(){
char tecla=0;
int f,c,t,i,j;
port_b_pullups(true);
set_tris_b(0b00001111); // RB7-RB4 salidas, RB3-RB0 entradas
for(f=0x10, i=0; i<4; f<<=1, i++){
    for(c=0x01, j=0; j<4; c<<=1, j++){
      kbd_port_b = ~f;
      delay_cycles(1);
      t = kbd_port_b & 0x0F;
      t = ~(t | 0xF0);
      if(t == c){
        delay_ms(20);
        tecla=KEYS[j];
        while(t==c){
          restart_wdt();
          t = kbd_port_b & 0x0F;
          t = ~(t | 0xF0);
        }
        break;
      }
    }
    if(tecla)
      break;
  }

  port_b_pullups(false);
  return tecla;
}
Título: Re: devoler a una rutina
Publicado por: deibbe en 14 de Septiembre de 2011, 13:39:06
que pena el -2 que esta en el return no va hay, es solamente return;
Título: Re: devoler a una rutina
Publicado por: MGLSOFT en 14 de Septiembre de 2011, 15:12:41
No se entiende que quieres hacer.
Tendras un diagrama de flujo de lo que necesita hacer tu programa??
O mejor dicho, un diagrama de flujo de lo que intentas que haga tu programa ??