TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
21 de Abril de 2014, 04:11:00

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
342574 Mensajes en 38354 Temas por 39705 Usuarios
Último usuario: javier54
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje C para microcontroladores PIC (Moderadores: Modulay, pikman, pocher, vszener, Suky)
| | |-+  Menu con Submenus?
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] 2 3 4 Marcar como favorito Imprimir
Autor Tema: Menu con Submenus?  (Leído 6904 veces)
gauchosuizo
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Suiza Suiza

Mensajes: 457



« : 25 de Agosto de 2004, 01:47:00 »

hola amigos

tengo una pregunta: quiero hacer un Menu con diversos Submenus para un 18F252 que debe ser mostrado en un LCD. Tambien tiene que tener la posibilidad de elegir los numeros de 0 a 9. Por lo que he leido por ahi, se podria utilizar un maquina de estado (statemachine). Puede explicarme alguien como se hace una maquina de estado en un PIC?, quizas algun ejemplo?

Gracias por toda la informacion que se pueda juntar de antemano.
En línea

Saludos desde Suiza, Pablo.
MGLSOFT
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7390


MGLSOFT


« Respuesta #1 : 25 de Agosto de 2004, 07:09:00 »

Yo me anoto con las respuestas, me interesa el tema....
En línea

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.
gauchosuizo
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Suiza Suiza

Mensajes: 457



« Respuesta #2 : 25 de Agosto de 2004, 09:32:00 »

hola

por lo que estuve averiguando, existen dos tipos basicos de programacion para teclados con Menus y Submenus:
1) con el tipico Switch()
2) con pointer to functions(punteros de/para funciones)
El 1) no es dificil, pero cuando existe un Menu muy grande necesita mucha memoria.
El 2) es mas dificil de programar(por los punteros), pero el codigo es mas elegante.

A mi personalmente me interesaria hacer un Menu con la opcion No 2. El problema es que casi no tengo experiencia en la programacion.

Seria lindo que alguien pueda ayudar.
En línea

Saludos desde Suiza, Pablo.
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #3 : 25 de Agosto de 2004, 09:47:00 »

Si quieres usar CCS tendrás q optar por la opción primera,ya que éste no admite punteros a funciones.
Si explicas más o menos como van a ser concretamente esos menús se puede ir construyendo código.
Saludos
En línea
MGLSOFT
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7390


MGLSOFT


« Respuesta #4 : 25 de Agosto de 2004, 09:51:00 »

Yo creo que se puede utilizar una funcion que pase parametros a otra funcion.
No es lo mismo pero igual es elegante...
En línea

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #5 : 25 de Agosto de 2004, 10:05:00 »

Eso sí,pero siempre que los parámetros sean sólo de entrada.
Se me ocurre que quizá pueda implementarse con un procedimiento recursivo que gestionaría el solito todo el menú completo incluídos todos los submenús.
Un procedimiento recursivo es el que dentro de su implementación contiene una o varias llamadas a sí mismo
En línea
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #6 : 25 de Agosto de 2004, 10:52:00 »

Olviden la recursividad...
CCS tampoco admite llamadas recursivas
En línea
gauchosuizo
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Suiza Suiza

Mensajes: 457



« Respuesta #7 : 26 de Agosto de 2004, 02:26:00 »

hola gente

ante todo gracias por las respuestas. Bueno yo quiero hacer un menu como el que sigue:

- Range -->Auto/Manuell
- Fine Adjust --> 0...100%
- Integration Time --> 0...60s
- Limit --> 0...100%(Standard 50%)
- Compensation --> 0...100%
- 0/4...20mA --> 0...20/4...20mA
- Sensitivity --> ??
- Self Calibration --> Start

Yo pienso que se tiene que utilizar el switch-case statement para realizar el menu. En cuanto tenga algo lo posteo.
Lo que hay que pensar tambien es en no hacer un programa que se coma toda la memoria.

Mas infos: Tengo un teclado de cuatro teclas conectado al puerto B 4...7. He pensado utilizar una intrrupcion para detectar cuando se ha apretado una tecla. Despues va al programa principal y controla cual tecla ha sido apretada. Ahi mismo hago por soft un antirebote para las teclas y despues le asigno la funcion del menu. Que opinan de esto?

 
En línea

Saludos desde Suiza, Pablo.
oshow
PIC18
****
Desconectado Desconectado

Mensajes: 321


« Respuesta #8 : 26 de Agosto de 2004, 04:36:00 »

Yo hice uno hace tiempo con interrupciones, lo que pasa es que ahora no se si lo tengo, no se si lo habré perdido en algún formateo....

Consistía en lo siguiente:

4 pulsadores en RB4/7 una tecla era la de menú, otra era flecha arriba otra flecha abajo y por último la tecla de acepatción o enter.

Al menú solo se podía entrar con la tecla menú, al entrar mostraba en el lcd 2 opciones (submenús) que podían ser seleccionadas mediante las flechas, y con el menú aceptar se accedía al submenú seleccionado, si se pulsaba la tecla menú se retrocedía al menú anterior y así sucesivamente.

Creo que en el ejemplo que hice con proteus, hice algo parecido...

Saludos.

En línea
gauchosuizo
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Suiza Suiza

Mensajes: 457



« Respuesta #9 : 26 de Agosto de 2004, 05:59:00 »

hola oshow

exactamente como lo hicistes vos, lo quiero hacer yo. Yo tambien tengo 4 Teclas: Enter, Up, Down y Menu.
La interrupcion del puerto B la uso para saber si se ha apretado una tecla, si es asi, en la subroutine de la interrupcion pongo un Flag = true, que despues lo chequeo en el bucle principal y veo cual es la tecla que se ha apretado.

Si tienes ese ejemplo que has dicho, no estaria nada mal echarle un vistazo.
En línea

Saludos desde Suiza, Pablo.
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #10 : 26 de Agosto de 2004, 06:29:00 »

Para el manejo de los datos,una forma muy práctica puede ser usando esta estructura:
Codigo:

///////////////////////////////////// PREPROCESADO ///////////////////////////////////

#include <16F84.h>
#use delay(clock=10000000)
#fuses HS,NOWDT,NOPUT
#define use_portb_lcd TRUE
#include "lcd.c"

//////////////////////////////////////// TIPOS ///////////////////////////////////////

typedef enum Trango {manual,automatico};

typedef struct Tconfiguracion {
                    Trango rango;
                    int ajuste_fino;
                    int t_integracion;
                    int limite;
                    int compensacion;
                    int amperaje;
                    int sensibilidad;
                    boolean autocalibracion;
                    };

/////////////////////////////////////// GLOBALES /////////////////////////////////////

struct Tconfiguracion configuracion;

////////////////////////////////////// PRINCIPAL /////////////////////////////////////

void main()
   {
   lcd_init();
   configuracion.rango = manual;
   configuracion.ajuste_fino = 0;
   configuracion.autocalibracion = TRUE;
   // etc...
   for(;Wink {}
   }


En línea
gauchosuizo
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Suiza Suiza

Mensajes: 457



« Respuesta #11 : 26 de Agosto de 2004, 07:23:00 »

hola

antes de empezar con el menu se me ha presentado otro problema: como hago para identificar que tecla se esta apretando? Como yo tengo las teclas a la entrada del puerto B4...7 uso la interrupcion para saber si se apreto una tecla y pongo un flag. En el bucle principal controlo el bucle. Si este esta puesto, quiero eliminar los posibles rebotes de las teclas y clasificarlas. Como puedo hacer estas dos cosas de una manera sencilla?

Gracias
En línea

Saludos desde Suiza, Pablo.
J1M
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1962



WWW
« Respuesta #12 : 26 de Agosto de 2004, 07:25:00 »

Algo parecido estoy tratando de hacer yo, pero la cosa no sale

La unica diferencia es que quiero usar 3 botones, flecha arriba, abajo, ok/menu, para este ultimo se distingue entre pulsacion larga y corta, a ver si encuentro el ejemplo que tenia yo.....

lo mismo de aqui sacas alguna idea:
http://www.vermontficks.org/datalogc.htm

aqui tb están construyendo algo muy interesante solo que eso... estan haciendolo :p
http://users.skynet.be/bk317494/012/012.htm

Salu2
En línea

Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #13 : 26 de Agosto de 2004, 08:36:00 »

Para evitarte los rebotes,en tu rutina de interrupción puedes llamar a una rutina que tuviese esta forma:

Codigo:

// Estamos suponiendo que loa pulsadores van a ser activos a nivel alto.
void antirebote()
   {
   delay_ms(30);
   while(PORTB != 0) {}  // No progresamos hasta que ningún pulsador esté activo
   delay_ms(30);
   }




En línea
oshow
PIC18
****
Desconectado Desconectado

Mensajes: 321


« Respuesta #14 : 26 de Agosto de 2004, 08:38:00 »

Pues no sabéis cuanto lo siento, pero he estado buscando el programa con los menús y no lo he encontrado, pero mira a ver el ejemplo que hice con proteus:

http://www.telecable.es/personales/trelles2/esquemas_proteus/ejemplo_a_enviar.rar

Creo recordar que aquí usé algo parecido, a lo mejor os puede servir de ayuda.


Saludos.
En línea
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #15 : 26 de Agosto de 2004, 10:42:00 »

Llevo un buen rato construyendo un menú basado en tu propósito,gaucho,y opino que sería mejor optar por hacer uso únicamente de la interrupción por RB0,que podría ir conectado a la tecla menú (para salir y entrar en el menú y no mantener al micro siempre pendiente de si se pulsó alguna tecla).La rutina de interrupción por RB0 gestionaría de una vez absolutamente todos los eventos,pulsaciones,cambios de parámetros,que se produjeran mientras estuviéramos dentro del menú...Y terminaría de ejecutarse en el momento en que saliésemos de él para que el micro pueda seguir con sus otras cositas...
Ya que para retroceder dentro del menú y tb para salir del mismo tendríamos que hacer uso de la tecla que provoca la interrupción mientras estamos dentro de la rutina que la atiende,hay que asegurarse de bajar el flag correspondiente antes de salir.Haciéndolo así resultaria viable ¿no? ¿qué opinan?
Todo esto viene a que si cada cada paso que damos en el menú viene por una interrupción,resulta un tanto complicado el salvar los datos a no ser que estos sean globales,además de hacerse más complicada la implementación.
Como lo ven?
Saludos
En línea
MGLSOFT
Moderadores
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7390


MGLSOFT


« Respuesta #16 : 26 de Agosto de 2004, 13:46:00 »

Yo utilizaria la interrupcion solo para detectar que tecla fue pulsada, y salgo, porqu despues estaras dentro de la interrupcion durante cuanto tiempo (sin hacer otra cosa) !!
En línea

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.
gauchosuizo
Colaborador
PIC18
*****
Desconectado Desconectado

Sexo: Masculino
Suiza Suiza

Mensajes: 457



« Respuesta #17 : 26 de Agosto de 2004, 13:51:00 »

hola

Modulay creo que tu idea es muy buena. En pocas palabras en la rutina de la interrupcion RB0 se pondrian diversos Flags, los cuales controlarian el proceso del menu.
Mañana voy a cambiar el programa que hice hoy, que no funciono como yo queria por el problema del puerto B que puse en otro mensaje

@MGLSOFT
esa era mi idea, pero la idea de Modulay no esta mal, no?
Gracias por la vuestra ayuda.
En línea

Saludos desde Suiza, Pablo.
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #18 : 26 de Agosto de 2004, 14:02:00 »

Pues ahora estoy dudando.Se trataba de eso,MGL,esa era la idea.Dependerá de qué otras cosas tenga que hacer el micro,aparte de gestionar el menú.Se puede usar el timer para salir del menú tras un tiempo determinado en el caso de inactividad de los pulsadores.
Se que es un método un poco tosco,pero creo que puede ahorrar bastante código
En línea
Modulay
Moderador Local
DsPIC30
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 2652



« Respuesta #19 : 26 de Agosto de 2004, 14:22:00 »

Si sigues con el lcd en el puerto B lo tendrás complicado para solucionar el tema de las tensiones en las entradas donde tienes los pulsadores.
Con respecto al metodo para gestionar el menú,demasiado tiempo estará entretenido el pic usando sólo RB0 como fuente de interrupción,sip,mejor capturar tecla y salir.
Ya tengo casi terminado mi menú.Compilado para un F84 llena el 94% de la rom,y eso que no está acabado.
Eso sí,el manejo del lcd tiene la mitad de la culpa.
De todas formas,si vas a usar un 18F252 no hay problema.
Aparte,echo mano de la eeprom interna del pic para guardar la configuración de todos los parámetros del menú,con el fin de ahorrar ram y tb para poder recuperar los datos si se quita la alimentación.
En línea
TODOPIC
   

 En línea
Páginas: [1] 2 3 4 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.141 segundos con 24 consultas.