Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

12/11/2010 #1


Podrian decirme porque no me acepta la sentencia?
Hola. Tengo un problema con un código de menús.
Puedo hacer que pase de rutina en rutina oprimiendo un pulsador, pero no que regrese al anterior.
En el único que funcionó es en el primer menú que pude pasar directamente al último. (el cinco)

Acá dejo un pedazo del código para que vean lo que quiero:

Código PHP:
void menu_uno(void)
{
   
lcd_putc("\f");
   
lcd_gotoxy(1,1);
   
lcd_putc("menu uno");
   
lcd_gotoxy(1,2);
   
lcd_putc("_");  
  while(
true)
  {
output_high(PIN_A0); 
delay_ms(300); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(300); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(300); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(300); 
output_low(PIN_A3);
 
    if (!
t_up){delay_ms(200); 
    
menu_dos();
    }
    if (!
t_down){ delay_ms(200); 
    
menu_cinco();
    }
   
intf=0;
   
enable_interrupts(GLOBAL);
   
enable_interrupts(INT_EXT);
   
    
}
}
////////////////////////////////////////////////////////////////////////////////
//    Submenu 2
//
///////////////////////////////////////////////////////////////////////////////
void menu_dos(void)
{
  
   
lcd_putc("\f");
   
lcd_gotoxy(1,1);
   
lcd_putc("menu dos");
   
   while(
TRUE){  
 
  
output_high(PIN_A0);
delay_ms(100); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(100); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(100); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(100); 
output_low(PIN_A3);
 

if (!
t_up)delay_ms(200); 
    
menu_tres();
    
// if (!t_down) delay_ms(200); 
 
   //menu_uno();

   
intf=0;
   
enable_interrupts(GLOBAL);
   
enable_interrupts(INT_EXT);
  
}

Al compilar me tira "recursion not permitted (menu_uno)
Obviamente sacando las //.
Muchas gracias por su ayuda.
12/11/2010 #2

Avatar de Eduardo

marcelo2112 dijo: Ver Mensaje
....Al compilar me tira "recursion not permitted (menu_uno). Obviamente sacando las //.
Porque no podes llamar de vuelta a la rutina que hizo el llamado --> En lugar de llamar a menu_uno tenes que poner un return.
12/11/2010 #3


Gracias por tu ayuda.
El problema con return es que me queda en el lcd menu dos aunque con la rutina del menu uno; y si selecciono directamente en menu dos y presiono t_down, no va al menu uno sino a la seleccion de los menus.
No hay otra forma?
12/11/2010 #4

Avatar de Eduardo

marcelo2112 dijo: Ver Mensaje
Gracias por tu ayuda.
El problema con return es que me queda en el lcd menu dos aunque con la rutina del menu uno; y si selecciono directamente en menu dos y presiono t_down, no va al menu uno sino a la seleccion de los menus.
No hay otra forma?
En lo que escribiste estas llamando a las subrutinas como si fuera un goto (error de concepto grosso).

Una forma de manejar los menues puede ser asi:
Código:
void main(){
  
  int k = 1 ;
  ............
  
    while(TRUE){           
        
        ...........         
        
        delay_ms(200) ;
        switch(k){
            case 1: 
                k = menu_uno() ;
                break ;
            case 2: 
                k = menu_dos() ;
                break ;
            case 3: 
                k = menu_tres() ;
                break ;
            case 4: 
                k = menu_cuatro() ;
                break ;
            case 5: 
                k = menu_cinco() ;
                break ;
            default:
                .......... // no good    
        }

        intf=0;
        enable_interrupts(GLOBAL);
        enable_interrupts(INT_EXT);   

        ...........         
    }


.........................................

int menu_uno(void){
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc("menu uno");
    lcd_gotoxy(1,2);
    lcd_putc("_");
    while(true)
    {
        output_high(PIN_A0);
        delay_ms(300);
        output_low(PIN_A0);
        output_high(PIN_A1);
        delay_ms(300);
        output_low(PIN_A1);
        output_high(PIN_A2);
        delay_ms(300);
        output_low(PIN_A2);
        output_high(PIN_A3);
        delay_ms(300);
        output_low(PIN_A3);
        
        if (!t_up)   return 2 ;  //menu dos

        if (!t_down) return 5 ; //menu cinco
   
    }
}
/////////////////////
// Submenu 2
//
/////////////////////
int menu_dos(void)
{
    
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc("menu dos");
    
    while(TRUE){
    
        output_high(PIN_A0);
        delay_ms(100);
        output_low(PIN_A0);
        output_high(PIN_A1);
        delay_ms(100);
        output_low(PIN_A1);
        output_high(PIN_A2);
        delay_ms(100);
        output_low(PIN_A2);
        output_high(PIN_A3);
        delay_ms(100);
        output_low(PIN_A3);
                     
        if(!t_up)     return 3 ;  //menu tres

        if (!t_down)  return 1 ;  //menu uno
        
    }
}
El menu siguiente va a parar a la variable k, el switch llama a quien corresponde y nos queda un stack ebrio de gozo.


Ojo! Esto es un ejemplo de como manejar los menues, pero te moví instrucciones de lugar que ni se como las estas usando.
12/11/2010 #5


Creo que implemento algo mal, no me funciona, al presionar el pulsador me sale al "menu".
Dejo el código completo:
Código PHP:
#use delay(clock=4000000) // Frecuencia máxima de trabajo.
// Definición de pines utilizados.
#byte pb =0xF81
#bit t_ok =pb.0 // RB0, pin21 (Tecla OK/MENU).
#bit t_up =pb.1 // RB1, pin22 (Tecla UP).
#bit t_down =pb.2 // RB2, pin23 (Tecla DOWN).
//#INT_EXT 
//#int_rb 
#byte intcon =0xFF2
#bit intf =intcon.1
#include <LCD2.c>
#include <menu_lcd3.h>
 
 
 
void main()
{
set_tris_a(0b0000000);
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
output_low(PIN_A4);
output_low(PIN_A5);
output_low(PIN_A6);
 
 
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
 
lcd_init();
intf=0;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(
true)
{
 
 
lcd_gotoxy(2,1);
printf(lcd_putc,"PRESIONE MENU");
 
switch(
k){
case 
1
menu_uno() ;
break ;
case 
2
menu_dos() ;
break ;
case 
3
menu_tres() ;
break ;
case 
4
menu_cuatro() ;
break ;
case 
5
menu_cinco() ;
break ;
default:
// .......... // no good 
}
 
}
}
 
 
MENU LCD3
 
int menu_uno
(void);
int menu_dos(void);
int menu_tres(void);
int menu_cuatro(void);
int menu_cinco(void);
void induc(void);
void piezo(void);
void menu_uno1(void);
void menu_dos1(void);
void menu_tres1(void);
void menu_cuatro1(void);
void menu_cinco1(void);
 
static 
unsigned int8 testeado;
int16 i,y// Variables utiizadas.
int k ;
 
#INT_EXT
void menu()
{
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
output_low(PIN_A4);
output_low(PIN_A5);
output_low(PIN_A6);
lcd_putc("\f");
 
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
delay_ms(300);
testeado=1;
 
for(
i=0;i!=255;i++) // 5 segundos para pulsar alguna tecla.
{
delay_ms(20);
 
lcd_gotoxy(1,1);
lcd_putc("1 induc-2 piezo");
lcd_gotoxy(4,2);
printf(lcd_putc,"sistema:%U\n\r",testeado);
if (!
t_ok){delay_ms(300); break;}
else if (!
t_up){i=0delay_ms(300); testeado++; if(testeado>2){testeado=2;};}
else if (!
t_down){i=0delay_ms(300); testeado--; if(testeado==255){testeado=0;};}
}
if(
testeado==0// si la opcion seleccionada es la 0, salimos del menú
{
 
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
lcd_putc("\f");
break;
}
else if(
testeado==1){induc(); lcd_putc("\f");}
else if(
testeado==2){piezo(); lcd_putc("\f");}
}
 
 
void induc(void)
{
 
disable_interrupts(GLOBAL);
disable_interrupts(INT_EXT);
delay_ms(300);
testeado=1;
for(
y=0y!=1y++) {
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("1-menu uno");
delay_ms(500);
lcd_gotoxy(1,2);
lcd_putc("2-menu dos");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);//************* 
lcd_putc("3-menu tres");
delay_ms(500);
lcd_gotoxy(1,2);//*-************** 
lcd_putc("4-menu cuatro");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);//****************
lcd_putc("5-menu cinco");
delay_ms(500);
lcd_putc("\f");
}
 
 
 
while(
true
{
delay_ms(20);
 
lcd_gotoxy(4,1);
lcd_putc("seleccione");
lcd_gotoxy(5,2);
printf(lcd_putc,"OPCION:%U\n\r",testeado);
if (!
t_ok){delay_ms(300); break;}
else if (!
t_up){i=0delay_ms(200); testeado++; if(testeado>5){testeado=0;};}
else if (!
t_down){i=0delay_ms(200); testeado--; ; if(testeado==255){testeado=5;};}
 
}
if(
testeado==0// si la opcion seleccionada es la 0, salimos del menú
{
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
lcd_putc("\f");
 
break;
}
else if(
testeado==1){menu_uno(); lcd_putc("\f");}
else if(
testeado==2){menu_dos(); lcd_putc("\f");}
else if(
testeado==3){menu_tres(); lcd_putc("\f");}
else if(
testeado==4){menu_cuatro(); lcd_putc("\f");}
else if(
testeado==5){menu_cinco(); lcd_putc("\f");}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 1
//
///////////////////////////////////////////////////////////////////////////////
int menu_uno(void)
{
// restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu uno");
lcd_gotoxy(1,2);
lcd_putc(""); 
while(
true)
{
output_high(PIN_A0); 
delay_ms(300); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(300); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(300); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(300); 
output_low(PIN_A3);
 
 
if (!
t_up) return //
if (!t_down) return //
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
 
 
}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 2
//
///////////////////////////////////////////////////////////////////////////////
int menu_dos(void)
{
// restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu dos");
 
while(
TRUE){ 
 
output_high(PIN_A0);
delay_ms(100); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(100); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(100); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(100); 
output_low(PIN_A3);
if (!
t_up) return //
if (!t_down) return //
 
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
 
}
}
////////////////////////////////////////////////////////////////////////////////
// Submenu 3
//
///////////////////////////////////////////////////////////////////////////////
int menu_tres(void)
{
//restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu tres");
 
 
 
while(
TRUE){ 
 
output_high(PIN_A0); 
delay_ms(50); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(50); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(50); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(50); 
output_low(PIN_A3); 
if (!
t_up) return //
if (!t_down) return //
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); 
}}
 
///////////////////////////////////////////////////////////////////////////////////
int menu_cuatro(void)
{
//restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu cuatro");
 
 
 
while(
TRUE){ 
 
output_high(PIN_A0); 
delay_ms(50); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(50); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(50); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(50); 
output_low(PIN_A3); 
if (!
t_up) return //
if (!t_down) return //
 
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); 
}}
///////////////////////////////////////////////////////////////////////////////////
int menu_cinco(void)
{
// restart_wdt();
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("menu cinco");
 
 
 
while(
TRUE){ 
 
output_high(PIN_A0); 
delay_ms(50); 
output_low(PIN_A0); 
output_high(PIN_A1); 
delay_ms(50); 
output_low(PIN_A1); 
output_high(PIN_A2); 
delay_ms(50); 
output_low(PIN_A2); 
output_high(PIN_A3); 
delay_ms(50); 
output_low(PIN_A3); 
if (!
t_up) return //
if (!t_down) return //
 
 
intf=0;
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT); 
}} 
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.