Autor Tema: CALL vs RETURN  (Leído 9846 veces)

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

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: CALL vs RETURN
« Respuesta #15 en: 23 de Octubre de 2006, 19:18:45 »
brunof muchas gracias por lo recomendado
al estoy atento a sus explicaciones
retlw al ser pusado un pulsador cualquira me da a entender que yo puedo preguntar en ese retardo por tres pulasores
retlw  .1  para   ra0
retlw  .2   para ra1
retlw   .3    para ra2


UNO_SEG 
   movlw     .14       
          movwf     PDel0   
PLoopx    movlw     .72   
           movwf     PDel1   
PLoopy     movlw     .247     
           movwf     PDel2 
PLoopz     clrwdt             
   btfsc     porta,0
   retlw      .1
           btfsc     porta,2
   retlw      .2

   btfsc     porta,3
   retlw      .3

   decfsz    PDel2, 1 
           goto      PLoopz   
           decfsz    PDel1,  1
          goto      PLoopy   
          decfsz    PDel0,  1
           goto      PLoopx   
PDelL1     goto PDelLx       
PDelLx     clrwdt             
        return             



al ser puldada cualquiera de esos pulsadores el programas vuelve con el retlw cargago con x# y lo comparo para mandar el progarama segun el numero cargado en retlw


movwf  fag
movlw .1
xorwf flag,0
btfsc  status,2
goto    prog1
movlw  .2
xorwf  flag,0
btfsc  status,2
goto   prog2
movlw  .3
xorwf  flag,0
btfsc  status,2
goto   prog3
movlw  .4
xorwf  flag,0
btfsc  status,2
goto   prog3
goto   siga

muchas gracias


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CALL vs RETURN
« Respuesta #16 en: 24 de Octubre de 2006, 01:18:01 »
Hola microcom.

Ahora me agregaste más pulsadores. Así no vale. :D
Lamentablemente ese algorítmo no va a funcionar como queres. Fijate que estas poniendo 3 condiciones dentro de la demora. Para que transcurra el segundo entero de demora necesitarias tener mantenidos los 3 pulsadores simultáneamente sin soltar ninguno.

Fijate siguiendo la lógica del código que si al menos un pulsador no está presionado el programa sale del retardo ignorando el resto de los pulsadores.

Una cosa más. En el ejemplo que yo te pase, el retardo se mantenía en 1 segundo aprox. Ojo con eso. Mira que acá agregaste más lineas de las que tenía calculada la rutina de demora original. Tenes que recalcularla si necesitás mucha precisión.



Yo lo haría así:


Código: ASM
  1. movlw   b'00001111'     ;indiquemos los bits a revisar del PUERTOA!(RA0,RA1,RA2,RA3)
  2.         call    UNO_SEG
  3.  
  4.         btfsc  Mascara,0        ;Pulsador RA0 mantenido durante 1 seg?
  5.         goto    prog1           ;Si. Saltar a prog1
  6.        
  7.         btfsc  Mascara,1        ;Pulsador RA1 mantenido durante 1 seg?
  8.         goto   prog2            ;Si. Saltar a prog2
  9.  
  10.         btfsc  Mascara,2        ;Pulsador RA2 mantenido durante 1 seg?
  11.         goto   prog3            ;Si. Saltar a prog3
  12.  
  13.         btfsc  Mascara,3        ;Pulsador RA3 mantenido durante 1 seg?
  14.         goto   prog3            ;Si. Saltar a prog3
  15.  
  16.         goto   siga
  17.  
  18. UNO_SEG  
  19.         movwf   Mascara         ;Volquemos los bits a revisar del PUERTOA en una variable
  20.         movlw     .14      
  21.         movwf     PDel0    
  22. PLoopx  movlw     .72    
  23.         movwf     PDel1  
  24. PLoopy  movlw     .247    
  25.         movwf     PDel2  
  26.  
  27. PLoopz  comf    PORTA,W         ;invertir bits del registro PORTA y guardarlos en W
  28.         andwf   Mascara,F       ;Multiplicacion de los bits de ambos registros
  29.         btfsc   STATUS,Z        ;Revisar si no hay ningun pulsador presionado.
  30.         return                  ;Nada presionado. Volver.
  31.  
  32.         decfsz  PDel2, 1  
  33.         goto    PLoopz  
  34.         decfsz  PDel1,  1
  35.         goto    PLoopy  
  36.         decfsz  PDel0,  1
  37.         goto    PLoopx    
  38. PDelL1  goto    PDelLx        
  39. PDelLx  clrwdt            
  40.         return

Si hay instrucciones a mi parecer útiles en la programación, son las de comparación lógica. Siempre me ha facinado emplearlas y combinarlas entre sí para obtener resultados asombrosos.

El potencial de las instrucciones AND, IOR y XOR usados correctamente es enorme.

Y parece poco código, pero esa es la magia de estas instrucciones.

Te explíco el funcionamiento.

Primero se carga W poniendo en 1 todos los bits análogos a los del PUERTOA de los cuales se desea saber si se mantiene 1 seg presionado el pulsador.
El resto se pone en 0.

Ahora llama a la subrutina UNO_SEG y vuelco ese valor de W en la variable Mascara.

Dentro del retardo UNO_SEG lo primero que hago es complementar el registro PORTA.
Esto invierte todos los bits del PUERTOA. Los 1 valdrán ahora 0 y los 0 valdrán 1.
Guardo el resultado de dicho complemento en W para compararlo con la variable Mascara.
Haciendo una AND entre W y Mascara, obtienes el resultado de una multiplicación bit a bit.
Por lo tanto, lo que hago allí es:
Si bit de Mascara Y bit Puerto A AMBOS en alto ENTONCES: bit de Mascara en alto. Sino: bit de Mascara en bajo.

Lo importante de la AND, en este caso, es que comence controlando una de las variables a multiplicar: Mascara.
Si durante el retardo se suelta un pulsador, ese bit de Mascara pasará a valer 0( recordemos que 0 * X = siempre 0) y ese bit de Mascara no hay manera que vuelva a valer 1 dentro de la subrutina UNO_SEG.

Si se ha mantenido durante el segundo un pulsador(o más de uno) en PORTA sin soltarlo, ese bit de mascara saldra del retardo valiendo 1.

El btfsc STATUS,Z hace que si no hay ningun pulsador presionado entre los seleccionados, salga de la subrutina antes de esperar el segundo completo.

Saludos.












« Última modificación: 24 de Octubre de 2006, 01:22:59 por BrunoF »
"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 BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CALL vs RETURN
« Respuesta #17 en: 24 de Octubre de 2006, 01:24:02 »
PD: Seguimos con la misma logica. Cuando se presiona un pusador, ese bit del Puerto A se pone en 0.
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 microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: CALL vs RETURN
« Respuesta #18 en: 24 de Octubre de 2006, 16:29:23 »
buena caballero y yo que me encontraba 0.00001% de estas instrucciones y ejemplos que me estas indicando estan callendo en el punto.

ademas siempre tengo la costumbre de colocar una resistencia a tierra y preguntar por unos pero eso no es un inconveniente en esto..

bueno ahi biene la pregunta si yo pregunto por unos o sea coloco una resistencis a tierra y conecto el pulsador a vcc. entonces cogeria

clrf    mascara
movf   porta,0
andwf mascara,1
btfss   status,2
return
sigue el retardo

ahi se eliminaria le complemento de comf  porta ya que no seria necesario.


como el puerto esta a tierra y al hacer AND con mascara que tambien es 0
se me activa el bit 2 de status lo cual no hay ningun pulsador presionado y el progarama sigue su retardo normal hasta que se acabe.
siguen rotando los leds con 5seg de retardo y sigo preguntado.

al salir del retardo por un pulsador
btfsc   mascara,0
goto    primer
btfsc   mascara,1
goto    segundo
btfsc   mascara,2
goto    tercer
 
caballero digame como boy .

el retardo sigue si no pulso ningun pulsador ya aqui no se toma en cuenta el tiempo pulsado en el pulsador si no que se debe atender el pulsador inmediatamente sin esperar nada.

con el programa que usted me corrigio en el otro link que el problema era del direccines generales del pic 16f873A.

tengo un retardo de 5seg y como la pregunta de los pulsadores la tengo es fuera de retardo tengo que demorar un largo rato presionando culaquier pulsador para que sea atendido.

y con esta explicacion ya se como es atendido inmediatemente sin alterar el stack de la pila y reducindo el programa.

caballero si no es un  inconveniente de seguirle preguntando de esto ya que me quedan mas dudas.

gracias y saludos

« Última modificación: 24 de Octubre de 2006, 16:44:57 por microcom »

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: CALL vs RETURN
« Respuesta #19 en: 24 de Octubre de 2006, 17:06:52 »
hola microcom, estaba siguiendo tu post, jejeje me perdi no se donde, me puedes mandar tu programa final (bueno el q tienes hasta ahora) para revisarlo, tambien quiero colaborar, es una epidemia creo  :mrgreen:
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: CALL vs RETURN
« Respuesta #20 en: 24 de Octubre de 2006, 17:30:44 »
hola micro_cadaver  no es un programa en si sino que son situaciones que estava tomando como herradas.

1) despues de un call  se bebe terminar la seccion con un return o retlw nada de goto ya que la pila se carga con cada call que hagas y se esta no es basiada el programas se vuelve loco despues de no se si  8call.
2)yo incluia dentro de un retardo un goto y nunca terminaba con un return y como no hacia eso sino 3veces el programa no presentaba problemas y que despues de 9veces de hacer eso ahi venia el problema.

3) lo demas es saber como incluir una pregunta dentrto de un call sin alterar el stack.
como se observa en los ejemplos que hacer brunof.

4) gracias micro_Cadaver  por el espirutu colabarador y ademas el interes de ayudar es siempre grande  y seo es lo que admiro de los colegas del  foro.

5) el programa se hace mas elegante con una buena utlizacion de instrucciones de AND; XOR: IOR y ademas se economizan espacios y lineas.

5) saludos y gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: CALL vs RETURN
« Respuesta #21 en: 24 de Octubre de 2006, 22:14:38 »
microcom me pone muy contento que hayas entendido el tema.

Son cosas que parecen simples pero no lo son tanto cuando uno comienza, cuesta acostumbrarse a esta forma de pensar así que bienvenido sea que lo hayas comprendido.   :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CALL vs RETURN
« Respuesta #22 en: 25 de Octubre de 2006, 00:09:22 »
buena caballero y yo que me encontraba 0.00001% de estas instrucciones y ejemplos que me estas indicando estan callendo en el punto.

ademas siempre tengo la costumbre de colocar una resistencia a tierra y preguntar por unos pero eso no es un inconveniente en esto..

bueno ahi biene la pregunta si yo pregunto por unos o sea coloco una resistencis a tierra y conecto el pulsador a vcc. entonces cogeria

clrf    mascara
movf   porta,0
andwf mascara,1
btfss   status,2
return
sigue el retardo

ahi se eliminaria le complemento de comf  porta ya que no seria necesario.


como el puerto esta a tierra y al hacer AND con mascara que tambien es 0
se me activa el bit 2 de status lo cual no hay ningun pulsador presionado y el progarama sigue su retardo normal hasta que se acabe.
siguen rotando los leds con 5seg de retardo y sigo preguntado.

al salir del retardo por un pulsador
btfsc   mascara,0
goto    primer
btfsc   mascara,1
goto    segundo
btfsc   mascara,2
goto    tercer
 
caballero digame como boy .

el retardo sigue si no pulso ningun pulsador ya aqui no se toma en cuenta el tiempo pulsado en el pulsador si no que se debe atender el pulsador inmediatamente sin esperar nada.

con el programa que usted me corrigio en el otro link que el problema era del direccines generales del pic 16f873A.

tengo un retardo de 5seg y como la pregunta de los pulsadores la tengo es fuera de retardo tengo que demorar un largo rato presionando culaquier pulsador para que sea atendido.

y con esta explicacion ya se como es atendido inmediatemente sin alterar el stack de la pila y reducindo el programa.

caballero si no es un  inconveniente de seguirle preguntando de esto ya que me quedan mas dudas.

gracias y saludos



No tengo problemas en responderte todas las preguntas que te surjan u ocurran. Sera un placer responderlas.

Con respecto a esto:


clrf    mascara
movf   porta,0
andwf mascara,1
btfss   status,2
return
sigue el retardo

No va a funcionar.
Fijate que tenes pones  a Mascara en todos ceros.
Entonces veamos que sucede que no funcionará:

clrf Mascara

Entonces Mascara = b'00000000'

movf PORTA,w     

Entonces W = b'XXXXXXXX'

andwf Mascara,1

la AND es una multiplicacion bit a bit:

Hagamosla:

Mascara = b'00000000'
W =          b'XXXXXXX'

Resultado: b'00000000'
Entonces Mascara = b'00000000'

Recorda que 0 * X = siempre 0. Ahi se hacen 8 multiplicaciones entre los bit analogos de Mascara y W.

Ese algoritmo tengas presionado o no los pulsadores, va a ejecutar el segundo entero de demora.
Mascara siempre valdra 0x00, por lo que tambien saldra de la subrutina valiendo 0x00.

Cuando salga valiendo 0x00, obviamente no va a ejecutar nunca ninguna rutina.

Entonces, veamos como hacer para que funcione con pulsadores como los tienes configurados tu( 0= no presionado, 1= presionado)

Ejemplo: si PORTA,0 es mantenido durante el segundo entero, deberia salir el bit Mascara,0 en alto para poder desviar el programa hacia primer.

Tengamos en cuenta un factor que tal vez no habias percatado:

Tenes conectados 4 pulsadores solamente en el puerto A. ¡Ojo! hay que tener en cuenta los otros 4 bits del puerto A tambien, ya que sino pueden "ensuciar" la variable Mascara, y que no pueda salir de la subrutina antes de tiempo si no hay pulsadores presionados.
Recorda que cuando lees un puerto como el Puerto A, esten configurados como entradas o salidas sus pines, te va a leer los valores de los pines igualmente.

Vamos a ver entonces...

Primero, deberiamos lograr descartar esos bits del puertoA que no estan conectados a pulsadores, o bien conectados a ellos pero que no nos interesan si se pulsan o no.

Para esto entonces podriamos optar por dos opciones. Definimos los bits a ignorar del puertoA como 0 y los que queremos revisar como 1 o viceversa.
El binario no nos deja muchas otras posibilidades, ¿eh?:D

Lo mas simple es definir los bits a revisar en alto, y el resto en bajo, entonces hacemos:

   movlw   b'00001111'   ;indiquemos con altos los bits a revisar del PUERTOA!(RA0,RA1,RA2,RA3)
   call   UNO_SEG


Sigamos. Entonces, la idea es esta. Todo bit que yo cargue alli con un alto, deberia salir alto transcurrido el segundo(o antes si se sueltan todos).

Entonces necesito solo 1 cosa. Una instruccion que me cambie el valor de ese bit de Mascara si se solto el pulsador antes de completarse el segundo de demora: Necesito que esa instruccion mantenga ese valor cambiado, independientemente de lo que pase luego dentro de la demora con el pulsador ese.

Entonces, si tengo un 1 inicialmente indicando que voy a revisar ese pulsador, necesito algo que me cambie el valor de ese bit si el pulsador deja de presionarse antes del segundo.

La funcion es otra vez, la AND.

Llevemoslo a la practica.

ingresa Mascara cargada con un bit en ALTO(1).

luego leemos el puertoA y lo guardamos en W.Hacemos una AND entre W y Mascara

1
AND
X

Da como resultado 1 si X= 1. Si X= 0 el resultado sera 0.
¿Por que? Para que una multiplicacion binaria de como resultado 1 ambos bits de las variables a comparar deben valer 1. Facil.
Entonces, si se suelta en algun momento el pulsador la AND hace esto:
1
AND
0

Da como resultado 0. Esto provoca que Mascara ahora tenga ese bit en BAJO.
NO HAY NADA QUE PUEDA HACER QUE ESE BIT DE MASCARA VUELVA A VALER UN ALTO NUEVAMENTE dentro de la subrutina. ¿Por que?
Porque ahora ese bit de Mascara vale cero, y al hacer todas las AND posteriores dentro del retardo pasara esto:

0
AND
X

Siempre devuelve 0.

¿Para que nos ha servido?

Nos ha servido para indicar que el pulsador se solto antes de tiempo. Hemos afectado a ese bit de Mascara de manera que no pueda volver a valer un ALTO.

¿Cómo saber cuando se han soltado todos los pulsadores a revisar?

Si te fijas, veras que la funcion AND puede poner bits en BAJO, pero jamas en ALTO si una de los dos bits a comparar esta en BAJO. Esta es la propiedad caracteristica de esta instruccion.

Entonces, significa que si Mascara = 0x00 querra decir que no hay pulsadores presionados, y haremos entonces que salga de la subrutina de demora antes de completar el segundo.


El código:

Código: ASM
  1. movlw   b'00001111'     ;definimos como 1 los bits a revisar del PUERTOA!(RA0,RA1,RA2,RA3)El resto en 0
  2.         call    UNO_SEG
  3.  
  4.         btfsc  Mascara,0        ;Pulsador RA0 mantenido durante 1 seg?
  5.         goto    prog1           ;Si. Saltar a prog1
  6.        
  7.         btfsc  Mascara,1        ;Pulsador RA1 mantenido durante 1 seg?
  8.         goto   prog2            ;Si. Saltar a prog2
  9.  
  10.         btfsc  Mascara,2        ;Pulsador RA2 mantenido durante 1 seg?
  11.         goto   prog3            ;Si. Saltar a prog3
  12.  
  13.         btfsc  Mascara,3        ;Pulsador RA3 mantenido durante 1 seg?
  14.         goto   prog3            ;Si. Saltar a prog3
  15.  
  16.         goto   siga
  17.  
  18. UNO_SEG  
  19.         movwf   Mascara         ;Volquemos los bits a revisar del PUERTOA en una variable
  20.         movlw     .14      
  21.         movwf     PDel0    
  22. PLoopx  movlw     .72    
  23.         movwf     PDel1  
  24. PLoopy  movlw     .247    
  25.         movwf     PDel2  
  26.  
  27. PLoopz  movf    PORTA,W         ;copiar el valor del puertoA en W      
  28.         andwf   Mascara,F       ;Inclusión de bits entre Mascara y el PUERTOA
  29.         btfsc   STATUS,Z        ;¿Mascara= 0?
  30.         return                  ;Si. Volver
  31.  
  32.         decfsz  PDel2, 1        ;No. continuar revisando
  33.         goto    PLoopz  
  34.         decfsz  PDel1,  1
  35.         goto    PLoopy  
  36.         decfsz  PDel0,  1
  37.         goto    PLoopx    
  38. PDelL1  goto    PDelLx        
  39. PDelLx  clrwdt            
  40.         return



Te recomiendo que si sabes usar el MPLAB SIM, simules esto(no lo he hecho yo) para comprender como funciona.
Sino, agarra papel y lapiz y simula el programa y fijate que Mascara no varia si un pulsador en PORTA se mantiene presionado, y lo que sucede en Mascara cuando se suelta.

Saludos
« Última modificación: 25 de Octubre de 2006, 00:27:09 por BrunoF »
"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 microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: CALL vs RETURN
« Respuesta #23 en: 25 de Octubre de 2006, 17:20:56 »
brunof la verdad me confundi con la and del programa que escribi apenas leo su comentario me doy cuenta de error y ademas no se que me pasó.

muy buena aplicacion de que si transcurriendo  el segundo yo suelto el puldador el programa se quedaria en donde esta y no se iría a otra parte.

bueno no si me entiendas esta pregunta.
mira que para que el programa se desvie para otra rutina debo esperar 1 seg.
 
¡si es para 5seg debe esperar 5seg.¡

si yo presiono algun pulsador transcurriendo esos 5seg y necesito que no me espere terminar esos 5seg sino que vuelva a preguntar  por los bits  de mascara para ver para que subrutina cojer.

quedarias asi solamete hay que cambiar
btfsc  status,2
return

por
btfss  status,2   ; esta seria la instruccion a colocar.
return

puesto que si no hay ningun pulsador  00001111 AND 00000000= 0  ; Z= 1 entonces se ejecutarian los 5seg y volveria con return al final
pero si presiono algun pulsador Z es  cero ya que  1 AND 1 haria  que el programa return y asi volveria a preguntar que bits de mascara esta activo. lo cual combiaria la rutina.


                movlw   b'00001111'   
   call   UNO_SEG    
                btfsc  Mascara,0   ;Pulsador RA0 mantenido durante 1 seg?    
                goto    prog1
   
   btfsc  Mascara,1   ;Pulsador RA1 mantenido durante 1 seg?
   goto   prog2      ;Si. Saltar a prog2

   btfsc  Mascara,2   ;Pulsador RA2 mantenido durante 1 seg?
   goto   prog3      ;Si. Saltar a prog3

   btfsc  Mascara,3   ;Pulsador RA3 mantenido durante 1 seg?
   goto   prog3      ;Si. Saltar a prog3

   goto   siga

UNO_SEG 
   movwf   Mascara      ;Volquemos los bits a revisar del PUERTOA en una variable
   movlw     .14       
   movwf     PDel0   
PLoopx   movlw     .72   
   movwf     PDel1   
PLoopy   movlw     .247     
   movwf     PDel2 

PLoopz   movf   PORTA,W      ;copiar el valor del puertoA en W   
   andwf   Mascara,F   ;Inclusión de bits entre Mascara y el PUERTOA
   btfss   STATUS,Z   ;¿Mascara= 0?
   return         ;Si. Volver

   decfsz   PDel2, 1     ;No. continuar revisando
   goto   PLoopz   
   decfsz   PDel1,  1
   goto   PLoopy   
   decfsz   PDel0,  1
   goto   PLoopx   
PDelL1   goto   PDelLx       
PDelLx   clrwdt             
   return


viejo brunoF yo creo que usted ha sido muy paciente con este tema y le doy las gracias por ello. yo creo que con esta ultima pregunta es la vencida.

le agradesco la colaboracion y estoy en deuda.

saludos y gracias .



Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: CALL vs RETURN
« Respuesta #24 en: 26 de Octubre de 2006, 16:31:19 »
Muchachos:
Pido perdon por no leer completo el hilo.
Lo que quiero decirles es que cuando hacen un GoTo dentro de un Call estan haciendo una llamada recursiva.
El PIC no admite recursividad. En ninguno de los lenguajes de programacion...

Para leer los pulsadores si no quieren utilizar las interrupciones del PortB lo mejor que pueden hacer es una temporizacion por interrupcion (igual van a utilizarlas), pueden hacerla cada 5 milisegundos y dentro de la interrupcion levantan el estado del port y hacen un and con la mascara de los pulsadores, segun cual este activo graban ese estado en un bit que usaran luego como bandera (flag) para ver que se pulso.

Cuando termina la interrupcion, que sera muy rapida su ejecucion, siguen con lo que estaban haciendo, teniendo en cuenta consultar los flags de cada interruptor o pulsador.
El antirrebote pueden hacerlo consultando el estado y comparando con el estado anterior o temporizando o ambos en conjunto.

La ventaja es que luego ya tienen un timer de uso general incluido, que les permite hacer diferentes temporizaciones, por ser multiplo directo de cualquier tiempo necesario.

Ejemplo:
Cuento 40 interrupciones y tengo 200 milisegundos (40x5=200)

Pierdanle el miedo a las interrupciones, una vez que las utilizen bien veran la programacion de otra manera !!! :-/ :-/
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: CALL vs RETURN
« Respuesta #25 en: 26 de Octubre de 2006, 17:56:31 »
Lo que quiero decirles es que cuando hacen un GoTo dentro de un Call estan haciendo una llamada recursiva.
El PIC no admite recursividad. En ninguno de los lenguajes de programacion...

MGLSoft ¿podrías explicar mejor tu punto?  realmente no estoy de acuerdo con lo que dices.

Un goto, dentro de un call constituye un "bucle", o una "bifurcación", pero no recursividad.

Recursividad sería que hagamos un call y dentro de ese call, volvamos a llamar de nuevo a la misma subritina.

Ej:

Código: ASM
  1. call   MIRUTINA
  2.  
  3.  
  4. MIRUTINA:
  5.         movlw  .20
  6.         call     MIRUTINA

El ejemplo es burdo, pero eso en mi opinión eso sería recursividad.   No es imposible, y se podría aplicar en ensamblador, usando un stack por software y acotando la cantidad de calls anidados.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: CALL vs RETURN
« Respuesta #26 en: 26 de Octubre de 2006, 18:11:58 »
tenia ganas de preguntar  pero me di la tarea de esperar que  opinan manos expertas en el  asunto .

Lo que quiero decirles es que cuando hacen un GoTo dentro de un Call estan haciendo una llamada recursiva.?
El PIC no admite recursividad. En ninguno de los lenguajes de programacion?

saludos y gracias

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: CALL vs RETURN
« Respuesta #27 en: 26 de Octubre de 2006, 19:02:52 »
tenia ganas de preguntar  pero me di la tarea de esperar que  opinan manos expertas en el  asunto .

Lo que quiero decirles es que cuando hacen un GoTo dentro de un Call estan haciendo una llamada recursiva.?
El PIC no admite recursividad. En ninguno de los lenguajes de programacion?

saludos y gracias


microcom, no entiendo cuál es tu pregunta puntual.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: CALL vs RETURN
« Respuesta #28 en: 26 de Octubre de 2006, 22:07:20 »
Marcos, realmente no entendi lo que quisiste decir. Igualmente aca no hay recursividad alguna...

A ver si entendi microcom. No queres usar Interrupciones. Entonces, la idea es hacerlo dentro de un loop principal del programa.
Si o si debe hacerse un retardo de 1 segundo, excepto si se presiona un pulsador. SI esto sucede, debe salir de la subrutina y desviar el codigo hacia otro lado.

Aca va el codigo si esto es lo que queres hacer:


Código: ASM
  1. movlw   b'00001111'     ;indiquemos los bits a revisar del PUERTOA!(RA0,RA1,RA2,RA3)
  2.         call    UNO_SEG
  3.         movwf   Mascara         ;Volcar W en Mascara
  4.         movf    Mascara,F       ;Afectar flag Z
  5.         btfss   STATUS,Z        ;Se presiono algo?
  6.         call    Antirebote      ;Si. Demora.
  7.  
  8.         btfsc  Mascara,0        ;Pulsador RA0 presionado?
  9.         goto    prog1           ;Si. Saltar a prog1
  10.        
  11.         btfsc  Mascara,1        ;Pulsador RA1 presionado?
  12.         goto   prog2            ;Si. Saltar a prog2
  13.  
  14.         btfsc  Mascara,2        ;Pulsador RA2 presionado?
  15.         goto   prog3            ;Si. Saltar a prog3
  16.  
  17.         btfsc  Mascara,3        ;Pulsador RA3 presionado?
  18.         goto   prog3            ;Si. Saltar a prog3
  19.  
  20.         goto   siga
  21.  
  22. UNO_SEG  
  23.         movwf   Mascara         ;Volquemos los bits a revisar del PUERTOA en una variable
  24.         movlw     .14      
  25.         movwf     PDel0    
  26. PLoopx  movlw     .72    
  27.         movwf     PDel1  
  28. PLoopy  movlw     .247    
  29.         movwf     PDel2  
  30.  
  31. PLoopz  movf    PORTA,W         ;Copiar bits del registro PORTA y guardarlos en W
  32.         andwf   Mascara,W       ;Multiplicacion de los bits de ambos registros, GUARDAR RESULTADO EN W.
  33.         btfss   STATUS,Z        ;Revisar si no hay ningun pulsador presionado.
  34.         return                  ;Hay algo presionado. Volver con W indicando el pulsador/es presionado/s
  35.  
  36.         decfsz  PDel2, 1  
  37.         goto    PLoopz  
  38.         decfsz  PDel1,  1
  39.         goto    PLoopy  
  40.         decfsz  PDel0,  1
  41.         goto    PLoopx    
  42. PDelL1  goto    PDelLx        
  43. PDelLx  clrwdt            
  44.         retlw   .0              ;Indicar que nada ha sido presionado durante la demora


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 microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: CALL vs RETURN
« Respuesta #29 en: 27 de Octubre de 2006, 16:53:48 »
gracias BRUNOF;y demas colegas
por sacarme e dudas.

saludos ya entendi lo necesario para ejecutar los programas.

gracias por las atenciones prestadas y demas..............
 MAUNIX el problema ya está concluido.
gracias
saludos.