Autor Tema: pasar variable como argumento  (Leído 3092 veces)

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

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
pasar variable como argumento
« en: 25 de Octubre de 2008, 02:05:02 »
Hola todos..
Trato de hacer una subrutina para ahorrar código, pero no me deja pasarle una variable como argumento para BSF.. por ejemplo

movlw 6
movwf n
bsf porta,n

Hay alguna manera de hacer esto?

Saludos.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: pasar variable como argumento
« Respuesta #1 en: 25 de Octubre de 2008, 03:29:57 »
la más visual pero no la mas corta es con un salto

Código: ASM
  1. movlw 6
  2.                 movwf n
  3.                 bcf status,c    ;pone a cero el carry
  4.                 rlf n,w         ;rota a la izquierda 1 vez el registro n y lo guarda en w (lo multiplica por 2)
  5.                 addwf pcl,f     ;se lo suma al program counter
  6.  
  7.                 bsf porta,0     ;0
  8.                 goto salir
  9.  
  10.                 bsf porta,1     ;1
  11.                 goto salir
  12.  
  13.                 bsf porta,2
  14.                 goto salir
  15.                
  16.                 bsf porta,3
  17.                 goto salir
  18.                
  19.                 bsf porta,4
  20.                 goto salir
  21.                
  22.                 bsf porta,5
  23.                 goto salir
  24.                
  25.                 bsf porta,6
  26.                 goto salir
  27.                
  28.                 bsf porta,7     ;7
  29.  
  30. salir

otra forma...
Código: ASM
  1. movlw 6         ;le cargo el valor en w
  2.                 clrf  temp      ;pone a cero un registro temporal
  3.                 bsf   temp,7    ;pone a 1 el último bit
  4.                 bcf   status,c  ;pone a cero carry
  5.                 addwf pcl,f     ;suma w al program counter
  6.                 rrf   temp,f    ;va rotando el bit que estaba a 1
  7.                 rrf   temp,f
  8.                 rrf   temp,f
  9.                 rrf   temp,f
  10.                 rrf   temp,f
  11.                 rrf   temp,f
  12.                 rrf   temp,f
  13.                 movf  temp,w
  14.                 iorwf porta,f   ;or inclusiva con el registro

esto es para un micro de gama baja o media, ya para un 18f se puede simplificar un poco más
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: pasar variable como argumento
« Respuesta #2 en: 25 de Octubre de 2008, 04:00:57 »
Ahora lo mismo pero con un bucle...
Código: ASM
  1. movlw 6         ;le carga un literal en w
  2.                 movwf n         ;lo guarda en el registro n
  3.                 incf  n,f       ;incrementa n
  4.                 clrf  temp      ;pone a cero un registro temporal
  5.                 bsf   status,c  ;pone a uno carry
  6. bucle           rlf   temp,f    ;va rotando a la izquierda el 1
  7.                 decfsz n,f      ;decrementa n si vale cero salta una línea
  8.                 goto   bucle    ;sino vuelve a repetir el paso
  9.                 movf  temp,w    ;guarda temp en w
  10.                 iorwf porta,f   ;or inclusiva de w con el registro porta
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: pasar variable como argumento
« Respuesta #3 en: 25 de Octubre de 2008, 04:38:34 »
Flacoclau... gracias por tu rápida respuesta...
Estaba mirando los dos primeros ejemplos y no los veía claros, este último lo veo más factible para mi caso, el tema está en el iorwf, creo que eso me puede servir, aunque la rutina de que se trata es un tanto delicada, ya que genera una portadora a una frecuencia determinada y cualquier añadido me chafa la frecuencia... este es el código:
Código: [Seleccionar]

movf med,W
pulsod:
bsf porta,6 ;enciende led dcha..... AQUI QUIERO LA VARIABLE
addwf pcl,F
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
btfss porta,4 ;lee A,4
incf det,F

bcf porta,6 ;apaga led dcha.... AQUI QUIERO LA VARIABLE
addwf pcl,F
nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz pul,F
goto pulsod


Esto está dentro de un bucle que va decrementando "med", de manera que cada vez tengo una ráfaga de pulsos de frecuencia un poco menor, esto se tiene que repetir con 3 leds distintos, osea tengo esta rutina repetida 3 veces, por eso trato de simplificar, pero claro... ya estoy usando W y PCL para dar un salto de longitud variable... y si meto más instrucciones en la rutina la frecuencia se va al traste...

No lo veo facil.... de todas formas gracias por la ayuda... aunque lo que no entiendo es porqué pones a 0 o a 1 el carry...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: pasar variable como argumento
« Respuesta #4 en: 25 de Octubre de 2008, 12:22:57 »
El iorwf te puede servir siempre y cuando tengas en cuenta que el registro al cual le harás el iorwf esté limpio o bien hacerlo sobre un registrto temporal y ese registro temporal sacarlo por el puerto.

El iorwf te generará el 1 pero no el 0.

Con el iorwf podrías tranquilamente ya tener un largo igual para la rutina, ahora bien si lo que haces antes o después no lo tiene entonces estas frente a otro problema.

Para solucionarlo, debes tener presente que la "perfección" de la frecuencia no existe, ni siquiera con cristales muy precisos, siempre hay un error.  Llevado eso a lo que quieres hacer lo puedes solucionar o acotar al error usando un micro que vaya más rápido y así minimizar las diferencias de bucle de ejecución.

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 arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: pasar variable como argumento
« Respuesta #5 en: 26 de Octubre de 2008, 20:54:17 »
Gracias Maunix.
Pues si... el problema basicamente viene de que stoy usando oscilador interno a 4 Mhz, entonces estoy muy justo de ciclos, podría añadir algunas instrucciones  manteniendo el nº de ciclos, pero me quedaría sin NOPs suficientes para barrer todas las frecuencias que quiero.

Con un reloj externo solucionaría el problema, pero pierdo dos pines, entonces tendría que cambiar el circuito... precisamente los leds los tego en RA6  RA7, pines para el oscilador externo. Quizás me replantee todo con cristal externo,... me ahorraría algun problema.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: pasar variable como argumento
« Respuesta #6 en: 03 de Noviembre de 2008, 22:15:19 »
Gracias Maunix.
Pues si... el problema basicamente viene de que stoy usando oscilador interno a 4 Mhz, entonces estoy muy justo de ciclos, podría añadir algunas instrucciones  manteniendo el nº de ciclos, pero me quedaría sin NOPs suficientes para barrer todas las frecuencias que quiero.

Con un reloj externo solucionaría el problema, pero pierdo dos pines, entonces tendría que cambiar el circuito... precisamente los leds los tego en RA6  RA7, pines para el oscilador externo. Quizás me replantee todo con cristal externo,... me ahorraría algun problema.

¿De cual pic estamos hablando?
- 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 arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: pasar variable como argumento
« Respuesta #7 en: 04 de Noviembre de 2008, 18:00:39 »
Pues de un 16F627A... porqué?

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: pasar variable como argumento
« Respuesta #8 en: 04 de Noviembre de 2008, 18:35:13 »
Hola.

¿Podrías explicar por qué necesitás una función de ese tipo? Por ahí podría existir otra variante que se comporte similar sin tener que recurrir a este tipo.

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 arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: pasar variable como argumento
« Respuesta #9 en: 04 de Noviembre de 2008, 20:04:55 »
Hola Bruno...
Se trata de medir distancias con IR; la rutina manda una serie de ráfagas de pulsos a los leds IR, cada ráfaga va aumentando la duración de los pulsos, de manera que la frecuencia va disminuyendo, como el receptor IR es de 38 KHz la sensiblidad es proporcional a la frecuencia, cuanto más se acerque la frecuencia a los 38 KHz, mayor alcance tiene.

La parte que puse en el anterior post es la correspondiente a un pulso, la variable "med" va disminuyendo de 9 a 0 en un bucle, para cada uno de estos valores se emite una ráfaga de "pul" pulsos (otro bucle), con med=9 la sensiblidad es mínima, ya que se salta 9 NOPs, el pulso es muy corto y por tanto la frecuencia muy alta, cuando detecta algo incrementa el contador "det", al final de cada ráfaga si el contador "det" es mayor que determinado valor es que ha dtectado algo en firme, sale de la rutina y el valor de "med" nos dá la distancia relativa del objeto.

Esto se hace con tres leds, uno a cada lado y otro al centro, entonces estaba intentando no repetir tres veces el mismo código, aunque tampoco es crítico el tema, por ahora no tengo problemas de espacio de memoria ni nada... (aunque nunca se sabe), solo quería saber si había manera de pasar una variable a una orden como argumento.