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

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

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Subrutinas con parámetros
« Respuesta #15 en: 04 de Mayo de 2007, 14:36:02 »
Hay una opción que creo debe funcionar y es usando direccionamiento indirecto, aca un ejemplo prendiendo el bit cero del puerto B y el bit 1 del puerto a:

Código: ASM
  1. ;declarar las variables:
  2. ;bit
  3. ;RotaBit
  4. ;Banderas
  5.  
  6. #define EstadoBit       Banderas,0
  7. ;***************************
  8.         movlw   0x06           ;Puerto B
  9.         movwf   FSR
  10.         bsf        EstadoBit    ;Para prender
  11.         movlw   .1               ;bit 0
  12.         call       Led
  13.         movlw   0X05           ;Puerto A
  14.         movwf   FSR
  15.         bcf        EstadoBit    ;Para apagar
  16.         movlw   .2               ;bit 1
  17.         call       Led
  18.         ....
  19.         ....
  20.  
  21. Led      movwf       bit
  22.            clrf           RotaBit
  23.            bsf           STATUS,C
  24. Rota     rlf             RotaBit,f
  25.            decfsz       bit,f
  26.            goto          Rota
  27.            btfss          EstadoBit
  28.            goto          Apaga
  29. Prende  movfw        RotaBit
  30.            iorwf          INDF
  31.            return
  32. Apaga   comf          RotaBit,f
  33.            movfw        RotaBit
  34.            andwf        INDF
  35.            return

La dirección del puerto se carga en el FSR y el bit a prender o apagar en el registro 'bit', el problema es que en este caso los bits se cuentan desde uno y no desde cero (para el bit cero se debe cargar un 1... para el bit 7 se debe cargar un 8), si se desea prender o apagar el bit se pone en 1 o 0 el EstadoBit.

saludos
Pereira - Colombia

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #16 en: 04 de Mayo de 2007, 15:10:43 »
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

dhmejia... no entiendo tu aclaración... en mi post estoy claramente diciendo que eso así no funciona.

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

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #17 en: 04 de Mayo de 2007, 15:24:21 »
Mady, tu código así como está no funciona por lo que expliqué anteriormente.

No puedes pasar como parámetro un número de puerto (al menos no de esa forma) y menos un número de pin o bit.

Repasemos.


puerto = 0x20
pin = 0x21
PUERTAA = 0x05
PUERTAB = 0x06


He puesto como comentarios la explicación de qué hace el código.
Código: ASM
  1. movlw   PUERTAB             ; Cargas 0x06 en WREG
  2.       movwf   puerto              ; Pones 0x06 en la posición de memoria 0x20
  3.       movlw   .3                  ; Cargas 3 en WREG
  4.       movwf   pin                 ; Mueves 3 a la posición de memoria 0x21

Y esto, aún más erróneo
Código: ASM
  1. bsf   puerto,pin
Acá estas seteando el bit "pin" de la posición de memoria 0x20. el bit 0x21.  Como pin solo puede tomar valores de 0 a 7, es probable que el assember trunque el valor de 0x21 y te quede solo 0x01

Con lo cual estas haciendo

   bsf 0x20,0x01

osea encender el bit 1, del registro de memoria 0x20.


Te sugiero leas el set de instrucciones y cómo funcionan.  Definir constantes con EQU y usarlas como a uno le parezca no es lo que el PIC va a interpretar.

Recuerda que el pic hace caso a las instrucciones no a tus intenciones  :)

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

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #18 en: 04 de Mayo de 2007, 15:33:39 »
Hay una opción que creo debe funcionar y es usando direccionamiento indirecto, aca un ejemplo prendiendo el bit cero del puerto B y el bit 1 del puerto a:

...

La dirección del puerto se carga en el FSR y el bit a prender o apagar en el registro 'bit', el problema es que en este caso los bits se cuentan desde uno y no desde cero (para el bit cero se debe cargar un 1... para el bit 7 se debe cargar un 8), si se desea prender o apagar el bit se pone en 1 o 0 el EstadoBit.

Ahí estamos de acuerdo  :)

Con direccionamiento indirecto se puede pasar como parámetro el número de puerto más no el número de pin/bit el cual deberá ser calculado y luego aplicarse una OR (para set) o AND (para clear).

No le indiqué ese paso a Mady, no por omisión sino porque me parece que debe conocer otras cosas antes, ya que el direccionamiento indirecto cuesta manejarlo si no se manejan otros conceptos antes como por ej, distinguir entre las definición de puerto o de un registro.
- 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 dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: Subrutinas con parámetros
« Respuesta #19 en: 04 de Mayo de 2007, 18:16:17 »
dhmejia... no entiendo tu aclaración... en mi post estoy claramente diciendo que eso así no funciona.

Maunix, solo estaba confirmando lo que ya habías dicho porque Mady seguía intentando con el código de Nichita después de la explicación que habías dado del por que no funcionaba.

De pronto no fui claro, pero estaba reafirmando lo que ya habías dicho.

saludos.
Pereira - Colombia

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #20 en: 04 de Mayo de 2007, 18:53:27 »
dhmejia... no entiendo tu aclaración... en mi post estoy claramente diciendo que eso así no funciona.

Maunix, solo estaba confirmando lo que ya habías dicho porque Mady seguía intentando con el código de Nichita después de la explicación que habías dado del por que no funcionaba.

De pronto no fui claro, pero estaba reafirmando lo que ya habías dicho.

saludos.

Ok, asunto aclarado y sin rencores   :) :)
- 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 #21 en: 05 de Mayo de 2007, 15:30:30 »
Realmente creo que lo del direccionamiento indirecto lo dejaré para más adelante. Aunque cojo la idea, creo que aún es pronto. GRacias igualmente por las aportaciones, espero usarlas en un futuro muy lejano.
Ah, ya me ha quedado claro porque no funcioba mi código.

Gracias

Desconectado Nichita

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 86
Re: Subrutinas con parámetros
« Respuesta #22 en: 05 de Mayo de 2007, 19:41:49 »
Hola, maunix tienes razón las instrucciones bsf, btfss, etc. toman la dirección de la variable y no su contenido. Bueno entonces creo que lo mejor sería hacerlo con una macro como sugería manuelroin24.

Mady, aunque maunix decia que ésta se copia una y otra vez y te sugeria que hagas las rutinas que necesites para acceder a los puertos para no complicarte tanto, ya que recien empezabas con los PICs, es precisamente esto lo que hace la macro, se copia el codigo cuantas veces lo llames (es decir la cantidad de rutinas que necesites y con los valores del puerto al que vas acceder) pero lo hace de forma automatica y claro con ciertas ventajas, que nos otorga ésta poderosa herramienta del assembler, con respecto a las subrutinas.

Lo que he hecho es trasladar todo lo anterior a una macro y quedaría así:

#define PUERTOA 0x05
#define PUERTOB 0x06   ; segun los puertos que disponga tu PIC y a los que vayas a acceder
..
..
#define PUERTOE 0x09

mi_rutina macro puerto
                     
bcf puerto, 1    ;como se asigno el puerto A y pin 1 entonces: pone en bajo RA1       
bsf puerto, 3    ;pone en alto RA3       
btfsc puerto,5   ;testea el estado de RA5
...
...
endm

; en la rutina principal invocamos a la macro
main
    mi_rutina PUERTOA, 1  ;asignamos el puerto A y el pin 1
    ...
    ...
   goto main

Y de la misma manera para especificar que PIN vamos a acceder podemos crear la macro así:

#define PUERTOA 0x05
....
#define PIN0 0x00
#define PIN1 0x01
#define PIN2 0x02
#define PIN3 0x03
#define PIN4 0x04
#define PIN5 0x05
#define PIN6 0x06
#define PIN7 0x07


mi_rutina macro puerto, pin

  bcf puerto, pin ;pone en bajo el pin 4 del puerto B (segun lo asignado en la invocacion de la macro)

endm

main
    mi_rutina PUERTOB, PIN4 ;invocamos a la macro
    ...
   goto main

Otra forma tb sería con direccionamiento indirecto, pero para hacer que se pueda elegir tb el pin creo que se complicaria mas.

espero te sirva,

Saludos

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Subrutinas con parámetros
« Respuesta #23 en: 07 de Mayo de 2007, 08:23:16 »
Creo que luego de todo el post, lo que queda claro es que tal vez, por ser novata, le convenga escribir las instrucciones y listo.

Hacer uso de un macro que ejecute varias instrucciones sobre un puerto, solo nos ahorra escribir ese código una y otra vez, pero no nos permite lograr lo que era el pedido original, ya que sería MUY RARO que tengamos conectados en cada pin de cada puerto, exactamente lo mismo como para que se justifique usar un macro de esa forma.

Por eso, creo que es más práctico escribir directamente la instrucción 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 #24 en: 07 de Mayo de 2007, 10:52:47 »
En realidad no se trata tampoco de una macro compleja es mas bien una bien simple y creo que es la mejor solución a lo que quería ya que hacer lo mismo sin utilizar una macro ahi si se hacía más complejo, pero en realidad esa complejidad dependería de que exactamente es lo que quiere hacer dentro de su subrutina, tal vez no necesita especificar el pin que va acceder, con lo cual todo quedaría solucionado con direccionamiento indirecto. También no es necesario que tengamos cada pin del puerto conectado de igual forma, se puede especificar mas parametros para la macro y asi acceder de forma independiente los puertos y pines, pero como decía es cuestión de saber que es lo que exactamente quiere hacer dentro de su subrutina, no les parece?.

Saludos


 

anything