TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Marioguillote en 08 de Octubre de 2007, 23:16:53

Título: Seleccionar una opción entre varias
Publicado por: Marioguillote en 08 de Octubre de 2007, 23:16:53
Hola a todos !

Estoy tratando de terminar un trabajo, pero ya la cabeza (léase los conocimientos) no me dán más.
No es que esté trabado, ni que me esté costando de más .... no.
No sé hacer lo que debiera hacer en ASM, motivo por el cuál les pido si alguien fuese tan amable de ayudarme con algo de código.

Tal vez sea "muy fácil" o "muy sencillo y elemental" pero la cabeza no me dá más.
 
El planteamiento del problema es el siguiente:

Tengo un programa ya "casi" listo en ASM que está estructurado de la siguiente manera:

Inicio correcto
Primera parte del programa
OPCIÓN
Segunda parte del programa
Loop al inicio y funcionamiento indefinido.

El "casi", lo forma la OPCIÓN.
Cuando el programa llega a esa parte, "debiera leer" un pulsador ubicado en RA4 para ser exacto, y a través de él, ir seleccionando entre OPCIÖN  1, OPCIÓN 2, OPCIÓN 3 ....... hasta OPCIÓN 6.

La selección de OPCIÓN, puede estar en cualquier parte del programa, en la primera, en la segunda .... en cualquier lado.

Al iniciar el programa, debiera encaramarse el mismo en la secuencia:

Inicio correcto
Primera parte del programa
OPCIÓN 1
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con OPCIÓN 1.

Si en algún momento se pulsara RA4, debiera el programa, pasar a trabajar con OPCIÓN 2, quedando funcionando de ésta forma :

Inicio correcto
Primera parte del programa
OPCIÓN 2
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con OPCIÓN 2.

Naturalmente, luego de llegar a OPCIÓN 6, pulsando RA4 pasar a OPCIÓN 1.

Eso es lo que "no sé hacer", el mecanismo de elección y trabajo con la porción de programa seleccionada.

Yo coloco en el programa, cualquiera de las 6 opciones y el programa funciona perfecto, pero con ésa sóla opción.

Podría armar todo en 6 programas individuales y con las instrucciones BTFSS y BTFSC armar una situación para que "salte" a otro segmento de programa y quede en un lazo de subprograma completo con la opción, pero esos 6 "subprogramas" no alcanzan a entrar en la memoria disponible y tampoco sería una salida muy elegante que digamos ....   :(

Me doy cuenta que debiera crear un registro de nombre OPCIÓN, que debo ir incrementando  (INCF) de a una unidad cada vez que se pulse RA4, y de ésa forma indicarle al programa por que número de OPCIÓN debe pasar en cada vuelta del loop, ........ "pero no sé armarla a ésa idea" !

En éste momento el programa está armado así:

Inicio correcto
Primera parte del programa
ESPACIO PARA LA OPCIÓN
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con la OPCIÓN seleccionada.

OPCIÓN 1
OPCIÓN 2
OPCIÓN 3
OPCIÓN 4
OPCIÓN 5
OPCIÓN 6

Cualquiera de las opciones que coloque en espacio destinado a ellas, hace que el programa funcione perfectamente.

Cómo llegué a armar el resto del programa? Con un programa que tenía, de manera más elemental, y repitiendo los subprogramas, que al ser más elementales, entraban todos en un 16F84A.

Si alguien pudiera ayudarme se lo voy a agradecer.
Espero haber sido claro con lo que estoy necesitando.

Saludos a todos.
Mario
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 08 de Octubre de 2007, 23:21:51
HOLA MARIO!!!!  :-/

Bueno pos si me toca transnochar, Lo hacemos pero esto lo sacamos hoy  :-/

Tienes una pantalla LCD????, Estas simulando en Proteus??? Pasame el archivo y le hacemos juntos!!

METETE AL MSN SI QUIERES  8)
Título: Re: Seleccionar una opción entre varias
Publicado por: Marioguillote en 08 de Octubre de 2007, 23:38:41
Hola Ernesto !!!  :)

Que pobre lo mío ... no tengo MSN  :(

Respecto a la simulación no. Es un programa que no podría simularse en Proteus, requiere de manejos de los tiempos en forma muy estricta en el lazo principal y trabaja con un PIC a 20 Mhz.

Al momento de pulsar para seleccionar otra opción, todo se "resincronizaría" en menos de 100 milisegundos por lo que allí no hay problema de extensión de código.

Respecto a colgar el código es imposible por lo extenso del mismo ...  :(

De todas formas te agradeceré mucho cualquier ayuda que puedas darme.

Saludos y Gracias por ser tan atento siempre.
Mario
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 08 de Octubre de 2007, 23:41:55
Cual PIC USAS???


Tu lo que necesitas es:

con un pulsador pasar de OPCION en OPCION desde la 1 hasta la 6 y luego empezar nuevamente y ya???

Lo de la simulacion, seria solo para esto del Menu,, ya andando tu le metes las funciones que ya tienes para que haga lo que debe hacer.

... Mas rapido mas rapido... Es que soy un poco Hiperactivo cuando me propongo algo...  :D
Título: Re: Seleccionar una opción entre varias
Publicado por: Marioguillote en 08 de Octubre de 2007, 23:53:10
... Mas rapido mas rapido... Es que soy un poco Hiperactivo cuando me propongo algo...  :D

 :D  :D  :D

La idea es tal cómo la planteo en el post

Inicio correcto
Primera parte del programa
OPCIÓN 1
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con OPCIÓN 1.

Accióno pulsador  conectado en RA4 ....

Inicio correcto
Primera parte del programa
OPCIÓN 2
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con OPCIÓN 2.

Accióno pulsador  conectado en RA4 ....

Inicio correcto
Primera parte del programa
OPCIÓN 3
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con OPCIÓN 3 .......

y así hasta la opción 6 para volver a iniciar por la opción 1 nuevamente.

Tal cómo si viéramos fotos una a una, observándo cada una el tiempo que quiéramos.
Cuando queremos ver otra .... pulsamos para cambiar.

Espero se entienda.

Uso un 16F628A @ 20Mhz.

No necesitamos menú.
Sólo es un pulsador, que vá transformando el programa original en otro y en otro hasta en 6 opciones.

Espero no enredar mucho la explicación.
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 08 de Octubre de 2007, 23:58:15
YA ENTENDI LO QUE QUIERES!!!!

OK OK, otra pregunta, puedes pasar el pulsador de RA4 a RB0???
Título: Re: Seleccionar una opción entre varias
Publicado por: Marioguillote en 09 de Octubre de 2007, 00:01:03
RA3  :)
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 00:03:34
Mira, lo que pasa es que para poder hacer 2 cosas al tiempo y con los tiempos tan preciso que necesitas, creo que debemos meterle la interrupcion por cambio en RB0.

En el momento que se presiona el pulsador...PLASH  nos vamos para el cambio de OPCIOn para el siguiente arranque.
Mientras no se presiona, pos no se pierde tiempo preguntando.. Claro que si no usas un TIMER podemos usarlo para hacer preguntas periodicas por el pulsador.

SALUDOS!!!
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 00:06:40
No puedes meter RA3 como salida para hacer el trabajo que esta haciendo RB0???

Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 00:07:55
Cuando dices INICIO CORRECTO

Te refieres a que el PIC se "resetea" o que seguido a pulsar la tecla RA4, te regresas a Inicializar una LCD por decir algo..
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 00:18:21
Código: [Seleccionar]
RESTART CALL INICIO_CORRECTO
CALL PRIMERA_PARTE

PREGUNTAS
;Preguntamos si la variable OPCIOn es 0
MOVLW 0X00
SUBWF OPCION,W
BTFSC STATS,Z
GOTO OPCION_0

;Preguntamos si la variable OPCIOn es 1
MOVLW 0X01
SUBWF OPCION,W
BTFSC STATS,Z
GOTO OPCION_1

;Preguntamos si la variable OPCIOn es 2
MOVLW 0X02
SUBWF OPCION,W
BTFSC STATS,Z
GOTO OPCION_2

;Preguntamos si la variable OPCIOn es 3
MOVLW 0X03
SUBWF OPCION,W
BTFSC STATS,Z
GOTO OPCION_3

;Preguntamos si la variable OPCIOn es 4
MOVLW 0X04
SUBWF OPCION,W
BTFSC STATS,Z
GOTO OPCION_4

;Preguntamos si la variable OPCIOn es 5
MOVLW 0X05
SUBWF OPCION,W
BTFSC STATS,Z
GOTO OPCION_5

;Preguntamos si la variable OPCIOn es 6
MOVLW 0X06
SUBWF OPCION,W
BTFSC STATS,Z
GOTO OPCION_6

OPCION1 ;HACES TODO LO QUE DEBAS HACER
GOTO PREGUNTAR_PULSADOR

OPCION2 ;HACES TODO LO QUE DEBAS HACER
GOTO PREGUNTAR_PULSADOR

OPCION3 ;HACES TODO LO QUE DEBAS HACER
GOTO PREGUNTAR_PULSADOR

OPCION4 ;HACES TODO LO QUE DEBAS HACER
GOTO PREGUNTAR_PULSADOR

OPCION5 ;HACES TODO LO QUE DEBAS HACER
GOTO PREGUNTAR_PULSADOR

OPCION6 ;HACES TODO LO QUE DEBAS HACER
GOTO PREGUNTAR_PULSADOR



PREGUNTAR_PULSADOR
BTFSC PORTA,3
GOTO RESTART         ;SI NO SE HA PRESIONADO EL PULSADOR, ARRANCA EL CICLO DESDE CERO
PRESIONADO INCF OPCION,F ;INCREMENTAMOS LA VARIABLE OPCION
MOVLW 0X07   ;PREGUNTAMOS SI OPCION LLEGO A 7
SUBWF OPCION,W
BTFSS STATUS,Z
GOTO RESTART ;SI NO LLEGO A CERO, POS VAMOS A RESTAR DE UNA
CLRF OPCION ;SI LLEGO A 7 DEBEMOS PASAR A 0 NUEVAMENTE
GOTO RESTART
Título: Re: Seleccionar una opción entre varias
Publicado por: Marioguillote en 09 de Octubre de 2007, 00:20:57
RB0 ya está ocupada por otras partes del diseño  :(

Tenemos RA3 "dedicada" a conectarle el pulsador. Yo había puesto RA4 por ejemplificarlo en algo genérico, pero lo "real" es que vá conectado a RA3 el pulsador.

Respecto al tema de interrogar por el pulsador todo el tiempo no hay problemas.
Dentro del lazo :

Inicio correcto
Primera parte del programa
OPCIÓN 2
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con OPCIÓN 2.

por ejemplificar alguno; tengo muchos tiempos "muertos" ú ocupados por muchos NOPs para  que los tiempos del programa se acomoden correctamente.

Por ejemplo, al final de la primera parte del programa tenemos espacio como para colocar unas 100 instrucciones.
Ése espacio está ocupado con un loop para generar un retardo de tiempo, así que imagínate que hay espacio para meter bastante código allí.
Hasta sería un buen lugar meterlo allí.....

Inicio correcto
Primera parte del programa
SELECTOR DE OPCIONES
OPCIÓN ELEJIDA
Segunda parte del programa
Loop al inicio y funcionamiento indefinido con OPCIÓN ELEJIDA.

Gracias por la paciencia Ernesto ! :)

Antes de postear veo que has puesto ya un poco de código ...
Qué velocidad hombre !!!  :shock:
Analizo eso que me has dejado, trato de hacer algo (me peleo con el MPLAB) y vuelvo con comentarios.
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 00:24:12
Ya le arregle unas cositas Como:

LE cambie la pregunta del pulsador para RA3

En las preguntas siempre comparaba si opcion es igual a 4, ya pregunta si es 0,1,2,3,4,5,6

Espero si te sirve, si no me avisas y miramos que mas hace falta..  :P
Título: Re: Seleccionar una opción entre varias
Publicado por: Marioguillote en 09 de Octubre de 2007, 00:38:14
Creo que ya estoy rumbeao'  :shock:

En la parte final voy a cambiar los "GOTO RESTART" por "GOTO Segunda Parte del Programa" y creo (por lo poco que entiendo de ASM) que debiera funcionar.

Alcanzo a entender cómo incrementas la variable, tambien cuando la restas con los números fijos y controlas si devuelve "Zero" ....

Pruebo, experimento.
Si las neuronas me ayudan más tarde retorno con comentarios, sinó será mañana amigo. (Ya son las 00:36 por aquí)

Gracias por ahora.
Dejáme golpearme e intentarlo.

Un abrazo
Mario
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 00:44:29
Como asi?? Me vas a dejar asi??  :(

Tonses hasta maña o que??   :D :D

SALUDOS AMIGO!!!

PD: Dime si quieres que te explique y lo hago.. No hay problema por eso..  :)
Título: Re: Seleccionar una opción entre varias
Publicado por: Marioguillote en 09 de Octubre de 2007, 00:55:17
Como asi?? Me vas a dejar asi??  :(

 :D  :D

Estoy tratando de insertar y acomodar el código dentro del programa ...

Es que cuando se llega a viejo, se es muy lento para estas cosas ....  :D  :D
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 00:58:12
Aa pero si te sirvio eso??
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 01:13:42
Es que cuando se llega a viejo, se es muy lento para estas cosas ....  :D  :D

:D  :D.. o no nolo creo amigo, hay veces en las que no se ve ni LUZ.. Se desespera uno y no va mas.. En veces me voy a dormir y en el sueño profundo se me ocurre como solucionarlo y al otro dia termino..Otras ustedes amigos del foro me ayudan con creces.. ... Es poco lo que uno puede hacer por ayudar, con toda la ayuda que uno recibe..




Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 01:27:02
Lo que si es cierto es que cuando uno se casa, el tiempo ya no es de uno solo.  :D :D :D :D

Ya me llamo mi esposa,, Me voy, no sea que sospeche de ese nombre Mario. Tal vez crea sea Mariana o algo asi.. juajuajua :D :D :D

CHAO AMIGO; ME VOY A DORMIR; espero que puedas dar con la solucion a tu problema..

SALUDOS!!!!
Ernesto.
Título: Re: Seleccionar una opción entre varias
Publicado por: PICpegaso en 09 de Octubre de 2007, 01:42:42
Bueno amigos pues no se, pero algo asi es lo que quiere mario, ¿?
si es asi, entonce ernesto esta en la ONDA,  :lol:, sino pues dinos un poco mas, y con el mayor gusto te ayudo yo tambien,
Saludos
Título: Re: Seleccionar una opción entre varias
Publicado por: maunix en 09 de Octubre de 2007, 08:09:25
Mario, si entendí bien lo que necesitas es lo que se suele llamar "computed goto" o un goto que depende del valor de una variable.

Te dejo un código que te puede servir


INICIO:
      ...
      ...
SELECCION:
              movlw         high(OPCIONES)
              movwf         PCLATH
              movlw         low(OPCIONES)
              addwf         opcion,w
              btfsc         STATUS,C
              incf          PCLATH,f

OPCIONES:
              movwf         PCL
              goto          MENU1       ;
              goto          MENU2       ;
              goto          MENU3       ;
              goto          MENU4       ;
              goto          MENU5       ;
              goto          MENU6       ;
              goto          MENU7       ;


El código de esta lista de opciones puede estar en cualquier lado, a mitad de una página, sobre los límites, donde querramos ya que si nos fijamos se trabaja también sobre el PCLATH. 

Ahora bien, con las opciones de menu el tema es diferente ya que si menu 7 está en una página diferente el PCLATH no contendrá el valor adecuado.

Para ellos sugiero primero colocar todo este menú de opciones en una misma página y hacer un goto a una ubicación que a su vez haga otro goto a la página donde deba realmente ubicarse el mismo.

Para ser mas claro


MENU7:
      pagesel   MENU7REAL
      goto      MENU7REAL


;Pagina 3
MENU7REAL:
      ...
      ...
      pagesel INICIO
      goto INICIO



Espero te sirva
Título: Re: Seleccionar una opción entre varias
Publicado por: Marioguillote en 09 de Octubre de 2007, 16:25:24
 :-/ Sí señores !!!  :-/

Exactamente cómo lo has dicho y dibujado PICpegaso, Ernesto está en la onda y como decimos en Argentina : "Se la sabe lunga"

Desde ya te agradezco el ofrecimiento de ayuda a tí y a Maunix, de quién no ensayé el código propuesto, ya que el código de Ernesto me orientó perfectamente para adaptarlo al programa y todo funcionó a las mil maravillas.
Lo único que le agregué fué un retardo al pulsador para optimizar todo y .... SIIIIIIIÍ    :-/  10 PUNTOS Ernesto !!!

En el momento de tomar la decisión de opción, le coloqué las preguntas de qué valor posee la variable OPCIÓN y que haga el GOTO a la OPCIÓN correcta en cada bucle del lazo.
Aprovechando que la Segunda Parte del programa es pequeña (pero importante), armé la estructura según éste ejemplo:

- OPCIÓN_2
- Hace lo que debe hacer la Opción
- Consulta el estado del pulsador y en virtud de ello decide si cierra el bucle o si incrementa el contador de opciones pasando a otra OPCIÓN.

Ésa organización, le agrega muy poco a cada OPCIÓN, por lo que decidí hacerla así, utilizando tu ayuda y aprovechando el haber razonado y comprendido tu ejemplo.

Gracias amigote por la ayuda y la orientación, me han sido muy útiles y he podido avanzar en el programa que creo que hoy mismo termino.

Gracias a los tres por haberse hecho presentes y por la ayuda brindada.

Un abrazo.
Mario
Título: Re: Seleccionar una opción entre varias
Publicado por: PICpegaso en 09 de Octubre de 2007, 16:35:31
Gracias a los tres por haberse hecho presentes y por la ayuda brindada.
Me alegra mario, para servirte en lo poco o mucho que se pueda :)
Título: Re: Seleccionar una opción entre varias
Publicado por: LABmouse en 09 de Octubre de 2007, 22:03:05
FELICIDADES AMIGO!!!!!!!!!  :-/ :-/ :-/ :-/ :-/ :-/

Me alegra mucho que te sirviera ese ejemplo.   :P

La opcion que maneja maunix es mucho mas rapida que la mia, ya que manipulado el contador de programa, te vas derechito a donde necesitas sin necesidad de pregunta tras pregunta.. Si señor!!! Un crack maunix  8)

SALUDOS!!!!