Autor Tema: Subrutinas con parámetros  (Leído 7500 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Mady

  • PIC10
  • *
  • Mensajes: 19
Subrutinas con parámetros
« en: 24 de Abril de 2007, 08:24:09 »
Necesito usar una misma subruitna para escanear distintos puertos de entrada, pero claro, cada vez debo indicarle un puerto distinto. ¿Hay algun camino para hacer esto, sin tener que reescribir la ruitna para cada puerto?


Gracias

Desconectado Nichita

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 86
Re: Subrutinas con parámetros
« Respuesta #1 en: 24 de Abril de 2007, 11:02:41 »
Lo que puedes hacer es que antes de llamar a tu subrutina cargas W o cualquier variable con un valor (que indique el puerto) y dentro de tu subrutina utilizas esa variable para direccionar que puerto es que vas acceder.

Saludos

Desconectado Mady

  • PIC10
  • *
  • Mensajes: 19
Re: Subrutinas con parámetros
« Respuesta #2 en: 26 de Abril de 2007, 16:36:14 »
Gracias, intentaré ese camino

Desconectado manuelroin24

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 665
Re: Subrutinas con parámetros
« Respuesta #3 en: 26 de Abril de 2007, 18:44:56 »
Podrias intentar crear una MACRO para atacar de manera más fácil el cambio de puertos
El conocimiento se consigue a base de esfuerzo...

Desconectado Mady

  • PIC10
  • *
  • Mensajes: 19
Re: Subrutinas con parámetros
« Respuesta #4 en: 29 de Abril de 2007, 14:55:46 »
He usado el siguiente código, pensando que la directiva  undefine me permitiria reasignar el puerto antes de entrar en la subrutina. Sin embargo, al ejecutar, las dos llamadas a la subrutina se ejecutan con la segunda asignación hecha para MIRA y BIT.

Adjunto trozo del código:

      #define   BIT   PUERTAB,0
      #define   MIRA   PUERTAA,0
      
      call   led
      

      #undefine   BIT
      #undefine   MIRA

      #define   BIT   PUERTAB,1
      #define   MIRA   PUERTAA,1
      
      call   led

led      clrf   PUERTAB
      btfss   MIRA
      bsf   BIT
      return
      
END         ; Fin del programa

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #5 en: 29 de Abril de 2007, 20:05:37 »
Mady, creo que estas errando el camino.  Según entendí quieres una función genérica a la cual le pases como parámetro el número de puerto y pin por el cual sacar el dato.

Tu lo que has hecho, es sencillamente definir constantes que luego 'dejas de definir', con lo cual no has hecho una función, simplemente dijiste al ensamblador que una cadena de texto antes valia  PUERTAB,0 y luego  PUERTAB,1.  Eso no es algo que se interpreta/modifica durante el tiempo de ejecución, sino que se modifica durante el ensamblado de tu código, lo cual quiere decir que quedará "fijo" y no cambiará el puerto de salida a medida que tu lo desees sino que será algo fijo.

Déjame decirte que es una de las preguntas muy frecuentes que se hacen y no es una tarea simple.  Debes de alguna forma, indicar que haga una elección de puerto manualmente, ya que no se puede pasar el puerto en sí como parámetro.

Lo que te sugirió Nichita es lo que se hace gralmente, se pasa como parámero un número (0,1,2..) que corresponderá a PORTA, PORTB, PORTC.. y luego dentro de la subrutina se elige el número de puerto.  Paso a continuar se elige el número de pin.

Podrias intentar crear una MACRO para atacar de manera más fácil el cambio de puertos

Manuel, esta opción si bien es cómoda, en realidad copia el código una y otra vez y no es lo que , según entiendo, es lo que quiere Mady.


- 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 Mady

  • PIC10
  • *
  • Mensajes: 19
Re: Subrutinas con parámetros
« Respuesta #6 en: 01 de Mayo de 2007, 14:21:46 »
Lo que me dice Nichita, no sé muy bien si es algo similar a lo que se hace con RETLW para trabajar con un display de 7 segmentos, por ejemplo. ¿Es eso?

Gracias

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #7 en: 01 de Mayo de 2007, 17:47:18 »
Lo que me dice Nichita, no sé muy bien si es algo similar a lo que se hace con RETLW para trabajar con un display de 7 segmentos, por ejemplo. ¿Es eso?

Mmm, no se cómo has hecho al analogia pero no , no sería exactamente eso.

La subrutina debe recibir el parámetro en alguna variable.  Es común que el parámetro se mande en WREG y la rutina sabe "ah, WREG = 2" entonces el dato lo saco por PORTB.  Si WREG=1, lo sacará por PORTA.

Eso depende la lógica de tu programa.

Te sugiero que si recién empiezas con esto de los pics, no te la hagas tan complicada de entrada, es decir, si tienes que sacar datos por el PORTA, PORTB y PORTC.  haz 3 rutinas diferentes y listo.

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 Nichita

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 86
Re: Subrutinas con parámetros
« Respuesta #8 en: 01 de Mayo de 2007, 18:20:06 »
A lo que me rereria era a esto:
creas una variable por ejm llamada PUERTO (que va tomar el valor del puerto que quieras acceder es decir 0x05 puerto A, 0x06 puerto B, etc. Entonces antes de llamar tu rutina asignas el valor apropiado a PUERTO. En tu subrutina utilizas esa variable como argumento de la instrucion btfss, btfsc, bcf o bsf segun lo que vayas hacer, quedaria mas o menos asi:

'PUERTO = 0x05 Indicamos que va trabajar con el puerto A
movlw 0x05
movwf PUERTO

call RUTINA 'llamas a tu rutina
..
..
end

RUTINA   'ejemplo
   
bcf PUERTO,1  'Pone en bajo RA1
bsf PUERTO,3  'pone en alto RA3
btfsc PUERTO,5 'testea el estado de RA5
..
return

Tb podrias crear otra variable para indicar el nro. de pin que vas acceder por ejm PIN.  Tu instruccion quedaria asi:

'PUERTO = 0x06 tomamos el puerto B
'PIN = 4

RUTINA
bcf PUERTO, PIN 'pone en bajo RB4
...
...
return

Espero haya aclarado tu duda
Saludos

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #9 en: 01 de Mayo de 2007, 20:08:05 »
Nichita, si PUERTO tomará valor durante el proceso de ensambaldo tu técnica funcionará.  Ahora si la variable PUERTO cambia durante la ejecución del programa, el programa no hará lo que tu esperas, ya que PUERTO será una dirección de memoria fija. 

No hay instrucciones en el assembler de los pic12F; 16F y 18F que permitan pasar el numero de puerto como parámetro.

Hacer lo siguiente

     movlw  0x05
     movwf   PUERTO
     bcf     PUERTO,5

     movlw  0x06
     movwf   PUERTO
     bcf     PUERTO,5


No significa que en el primer caso, se borrará PORTA<5> (direccion 0x05 en memoria) y en el segundo caso PORTB<5> (direccion 0x06 en memoria).

PUERTO tomará un valor al ensamblarse, el cual será 5, 6, 10, 20, lo que sea, y no cambiará.

« Última modificación: 01 de Mayo de 2007, 20:11:11 por maunix »
- 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 Mady

  • PIC10
  • *
  • Mensajes: 19
Re: Subrutinas con parámetros
« Respuesta #10 en: 03 de Mayo de 2007, 14:22:04 »
He intentado probar el siguiente código, y la verdad es que el simulador no ejecuta lo esperado, y además me sale el siguiente aviso:
CORE-E0002: Stack under flow error occurred from instruction at 0x000011

   puerto   equ   0x20
   pin   equ   0x21         
   
      movlw   PUERTAB
      movwf   puerto
      movlw   3
      movwf   pin
      
      call led
   
led   
      bsf   puerto,pin
      return
      
END         ; Fin del programa

El aviso que da no se muy bien lo que significa. CReo que ya que soy novata, crearé varias subrutinas. Pero si consigo hacerlo os lo comentaré.

Muchas gracias

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #11 en: 03 de Mayo de 2007, 14:55:28 »
CORE-E0002: Stack under flow error occurred from instruction at 0x000011
Significa que has hecho un RETURN sin un previo call, por lo tanto te está diciendo que el STACK o PILA de retorno de subrutinas tuvo un sobrevaciamiento.

Me tomé la libertad de ponerle un número a cada línea así explico mejor tu problema.
Código: ASM
  1. 1.              movlw   PUERTAB
  2. 2.              movwf   puerto
  3. 3.              movlw   3
  4. 4.              movwf   pin
  5.                
  6. 5.              call led
  7.        
  8. led    
  9. 6.              bsf     puerto,pin
  10. 7.              return
Tu programa ejecutará de 1 a 5, en forma lineal.

Luego está el call, con lo cual ejecutará 6 y 7.  Al ejecutar 7 (return) , se vuelve a la instrucción próxima siguiente de donde se lo llamo.  Es decir, debajo de "call led", osea en 6.

Se ejecuta nuevamente 6, y luego 7, por lo cual hay un RETURN al cual no le corresponde ningún CALL.

Se solucionaría si luego de 5. haces un bucle infinito. algo así como esto:

Código: ASM
  1. 1.              movlw   PUERTAB
  2. 2.              movwf   puerto
  3. 3.              movlw   3
  4. 4.              movwf   pin
  5.                
  6. 5.              call led
  7. 5.a   nada:
  8.                 nop
  9. 5.b            goto nada
  10. led    
  11. 6.              bsf     puerto,pin
  12. 7.              return

Espero se haya entendido.  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 Mady

  • PIC10
  • *
  • Mensajes: 19
Re: Subrutinas con parámetros
« Respuesta #12 en: 03 de Mayo de 2007, 16:25:08 »
Gracias MAunix, lo he entendido perfectamente.

Desconectado Mady

  • PIC10
  • *
  • Mensajes: 19
Re: Subrutinas con parámetros
« Respuesta #13 en: 03 de Mayo de 2007, 16:36:02 »
He entendido que lo dice Nichita es lo siguiente:

   W      EQU   0   ; Cuando el destino es W, d = 0
   F      EQU   1   ; Cuando el destino es el registro f, d = 1
   PUERTAA   EQU   0x05   ; La Puerta A (datos) ocupa la direcci¢n 5 del    
                  ; banco 0 y el registro de configuraci¢n la       
                  ; direcci¢n 5 del banco 1

   PUERTAB EQU   0x06   ; La misma etiqueta para el registro de datos y el    
                  ; de configuraci¢n de la Puerta B
   ESTADO   EQU   0x03    ; El registro Estado ocupa direcci¢n 3 de los dos   
                  ; bancos
;**************************************************************************************
;*                COMIENZO DEL PROGRAMA                      *
;**************************************************************************************

   ORG    0      ; El programa comienza en la direcci¢n 0 (Vector Reset)
   goto   inicio   ; Se salta a la etiqueta “inicio”
   ORG   5      ; Se asigna la direcci¢n 5 a la siguiente instrucci¢n


inicio   bsf   ESTADO,5   ; Pone a 1 el bit 5 de Estado. Acceso al banco 1.
   clrf   PUERTAB      ; Se configuran como salidas las l¡neas de la Puerta B
   movlw   0xff      ; El registro W se carga con unos
   movwf   PUERTAA      ; Se configuran como entradas las l¡neas de la Puerta A
        bcf     ESTADO,5    ; Pone a 0 el bit 5 de Estado. Acceso al banco 0.

   puerto   equ      0x20
   pin   equ      0x21         
   
      movlw   PUERTAB
      movwf   puerto
      movlw   .3
      movwf   pin
      
      call led
nada:   nop
      goto   nada

   
led   
      bsf   puerto,pin
      return
      
   END         ; Fin del programa

Sin embargo, sigue sin salir, no se pone a 1 PUERTAB;3

ESpero algún dia aportar  tambien soluciones, de momento estoy aprendiendo mucho gracias a vosotros


Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Subrutinas con parámetros
« Respuesta #14 en: 03 de Mayo de 2007, 18:39:03 »
Te falto leer bien lo que dice Maunix:

Nichita, si PUERTO tomará valor durante el proceso de ensambaldo tu técnica funcionará.  Ahora si la variable PUERTO cambia durante la ejecución del programa, el programa no hará lo que tu esperas, ya que PUERTO será una dirección de memoria fija. 

No hay instrucciones en el assembler de los pic12F; 16F y 18F que permitan pasar el numero de puerto como parámetro.

Hacer lo siguiente

     movlw  0x05
     movwf   PUERTO
     bcf     PUERTO,5

     movlw  0x06
     movwf   PUERTO
     bcf     PUERTO,5


No significa que en el primer caso, se borrará PORTA<5> (direccion 0x05 en memoria) y en el segundo caso PORTB<5> (direccion 0x06 en memoria).

PUERTO tomará un valor al ensamblarse, el cual será 5, 6, 10, 20, lo que sea, y no cambiará.

Hacerlo de esa forma no funciona,

saludos
Pereira - Colombia