Autor Tema: Problemas con INDF  (Leído 4494 veces)

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

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Problemas con INDF
« en: 04 de Noviembre de 2007, 11:13:44 »
Me estoy volviendo loco con el ensamblador... no se como podeis usarlo por aqui :-P

Bueno voy con la pregunta...


yo podria hacer esto??

btfss  INDF,CONTADOR2

tampoco me funciona poniendo

movfw   INDF
btfss      W,CONTADOR2

NO funciona bien, cuando ese bit en concreto es 1 no hace el salto y ejecuta la instrucción siguiente al btfss

Probando cosas me he dado cuenta de que parece que hace el bit test siempre sobre el bit 0 del registro en concreto....
sin embargo CONTADOR2 cada vez va avanzando de 0 a 7

Si pongo por ejemplo

btfss  INDF,1

hace lo que se espera de esta instruccion.


es que no puedo poner ahí una variable como  CONTADOR2??, estoy recorriendo los bits
de una variable en un bucle...

en todo caso habria otra alternativa?

1 saludo
« Última modificación: 04 de Noviembre de 2007, 11:28:48 por elmasvital »

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Problemas con INDF
« Respuesta #1 en: 04 de Noviembre de 2007, 12:07:17 »
has intentado haciendo asi:

primero en la cabezera del programa, antes del org y todo eso...

contador2       equ   0x01


luego en tu programa cuando pongas

              btfss   INDF,contador2
              goto   .........
              return ....

deberia funcionar pues ya has declarado que "contador2" es igual a poner "1"

saludos!  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

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

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problemas con INDF
« Respuesta #2 en: 04 de Noviembre de 2007, 13:49:21 »
ya claro pero es que CONTADOR2 no es una igualdad.. es una variable declarada como tal

mi pregunta es si esto se puede hacer...

Mi intención es crear un bucle que maneje varias variables, por eso el INDF y que vaya recorriendo todos sus bits y en cada caso si es 1 o 0 haga unas acciones correspondiente y siga con el siguiente bit

alguna idea de como hacerlo? pq ya asumo por mis pruebas que no puedo poner una variable en btfss INDF, XXXXX

« Última modificación: 04 de Noviembre de 2007, 14:05:07 por elmasvital »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con INDF
« Respuesta #3 en: 04 de Noviembre de 2007, 14:44:19 »
Hola elmasvital. Me parece que te entiendo cual es tu problema, pero no estoy seguro.

Veamos, tu quieres esto: Tenemos en una pocición de la RAM usada por el usuario supongamos 0x20 a la cual la podemos llamar como queramos de esta manera:

contador1   EQU    0X20    ;Notemos que es la misma instrcción dada por micro_cadaver con la diferencia de la pocición de
                                       ;memoria

contador1 está compuesto por 8 bit b'00000000'

Lo que queres hacer es que por ejemplo el bit 0 es 1 salte pero si es 0 valla a otra parte del programa:

       btfss    contador1,0    ;¿que valor tiene?
       goto     otra_terea    ;es 0 voy a otra tarea
       .....      ...........        ;es 1 realizo lo que quiero


si queremos saber el bit 5

      btfss     contador1,5     ;¿qué valor tiene?
      goto      otra_tarea_2   ;es 0 voy a otra tarea 2
      ......     .................      ;es 1 realizo lo que quiero

Notemos que para averiguar el valor del bit de una pocición de memoria, solo hay que indicarlo después de la coma


PD: No estoy tratando a nadie de tonto por explicar todo con lujo de detalle, no quiero omitir información para asegurarme que ese sea el problema y que además cualquier principiante lo pueda entender.

Nos vemos.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problemas con INDF
« Respuesta #4 en: 04 de Noviembre de 2007, 15:06:07 »
Gracias por ayudarme... aqui muestro el codigo de la rutina que estoy intentando implementar.

Estoy pensando por lo que me estais diciendo, contador1 y contador2 estan en 0x029 y 0x02A y por tanto btfss en verdad ve eso y no como yo esperaba lo que contienen esos registros... asi que no se como implementar este bucle... alguna ayuda?

Código: ASM
  1. ;***** Definiciones
  2.  
  3.         CBLOCK  0x21
  4.         CONFIG_SEM0
  5.         CONFIG_SEM1
  6.         CONFIG_SEM2
  7.         CONFIG_SEM3
  8.         CONFIG_SEM4
  9.         CONFIG_SEM5
  10.         CONFIG_SEM6
  11.         CONFIG_SEM7
  12.         ENDC           
  13.  
  14.         CBLOCK
  15.         CONTADOR1       ;contador proposito general
  16.         CONTADOR2
  17.         ENDC
  18.  
  19.  
  20. ;********************acualiza_sem*********************
  21. ACTUALIZA_SEM
  22. ;*****************************************************
  23.  
  24.  
  25.         SEL_PRIMER_SEM          ;Seleccionamos 1er sem
  26.         clrf    CONTADOR1               ;Contador1 se dedicará a APUNTAR variables CONFIG_SEMX
  27.         clrf    CONTADOR2               ;Contador2 marcará la luz a actualizar
  28.  
  29. R_SEMAFORO                              ;Refresco_Semaforo
  30.  
  31.         movfw   CONTADOR1                      
  32.         addlw   0x021                   ;Posicion de la primera variable, se le suma el contador       
  33.         movwf   FSR                     ;se pasa a FSR para direccionamiento indirecto
  34.  
  35. R_LUZ                                   ;Refresco_Luz
  36.                        
  37.         bcf     CLOCK_SEM               ;Ponemos a 0 el clock de semaforos
  38.         bsf     DATA_SEM                ;Ponemos a 1 DATA
  39.         btfss   INDF,CONTADOR2  ;Exepto si el dato debe ser 0
  40.         bcf     DATA_SEM
  41.         bsf     CLOCK_SEM               ;Ponemos a 1 el clock del semaforo
  42.        
  43.         ;Comprobamos si se terminó el bucle luz
  44.  
  45.         movlw   0x07                    ;Comprobamos si hemos llegado al final del bucle
  46.         xorwf   CONTADOR2,W
  47.         btfsc   STATUS,Z               
  48.         goto    R_LUZ_SALIR     ;Salimos del bucle si termino
  49.  
  50.         incf    CONTADOR2,F             ;Incrementamos contador
  51.         goto    R_LUZ           ;y volvemos a realizar el bucle.
  52.  
  53. R_LUZ_SALIR
  54.  
  55.         ;Comprobamos si terminó el bucle semaforo
  56.         movlw   0x07
  57.         xorwf   CONTADOR1,W
  58.         btfsc   STATUS,Z
  59.         goto    A_S_SALIR
  60.                
  61.         incf    CONTADOR1,F
  62.         SEL_SIGUI_SEM                   ;Seleccionamos el siguiente semaforo
  63.         clrf    CONTADOR2               ;Borramos contador2 de luces
  64.         goto R_SEMAFORO
  65.  
  66. A_S_SALIR              
  67.         return


Entonces mi duda seria... cómo se puede hacer un bucle que recorra cada uno de los 8 bits de un registro? No habria mas remedio que hacer esto?


btfss  INDF,0
btfss  INDF,1
btfss  INDF,2
btfss  INDF,3....




« Última modificación: 04 de Noviembre de 2007, 15:18:27 por elmasvital »

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problemas con INDF
« Respuesta #5 en: 04 de Noviembre de 2007, 15:25:19 »
Ya tengo la respuesta... :-P

vengo de C y la verdad es que me cuesta adaptarme a la forma de pensar de ensamblador...


1. Cargo el contenido de INDF en W
2. Voy desplazando los bits de W a la izquierda con RLF
3. Hago un btfss status,c


Gracias a los dos por ayudarme...

1 saludo

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Problemas con INDF
« Respuesta #6 en: 04 de Noviembre de 2007, 17:37:51 »
Hola elmasvital. Me alegro que lo hallas solucionado.

Coregirme si estoy equivocado:

Cuando nombramos una pocición de la RAM de esta manera:

contador1      EQU     0x20

Lo que hacemos es llamar la pocición de memoria 0x20 con el nombre contador1 y no que contador1 tenga el valor 0x20.

Es raro, porque en mis programa trabajo de esta manera y, por ejemplo, contador1 le pongo el valor que yo quiero desde 0x00 a 0xff

De escho en mi último programa utilizo una pocición de la RAM como registro Estado (indistintamente del registro Status) para llevar un control de que vengo activando y/o no.

Con el ejemplo que yo di, es la forma en que chequeo, el bit que quiero. Pero siempre lo hago de una vez y sigo con otra cosa, no tengo que chequear todos en la misma rutina o subrutina.

Espero no haberlos mareado.

Nos vemos.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Problemas con INDF
« Respuesta #7 en: 04 de Noviembre de 2007, 21:54:56 »
Hola Elmasvital, el problema es que el registro INDF no esta fisicamente implementado, por lo que no accederas realmewnte a el.
Si en cualquier instruccion se opera con este registro, en realidad se estará operando con la dirección  a la que apunta el contenido de FSR (File  Selec Register)

Bienvenido al ASM !!!  :D (y yo quiero aprender C!!!)  :D

La solucion que empleaste es correcta, pero por seguridad, antes de la rotación, yo borraria el CARRY  (bcf status,c)

Suerte!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Nichita

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 86
Re: Problemas con INDF
« Respuesta #8 en: 06 de Noviembre de 2007, 12:33:55 »
Lo que más bien pasa es que la instruccón btfss o btfsc opera con una constante como segundo argumento por eso es que le funcionaba:

btfss  INDF,0
btfss  INDF,1
btfss  INDF,2
btfss  INDF,3

ahora que ya cambió de método y lo hace con el carry:

btfss status,c

tenemos que c es una constante

Saludos
« Última modificación: 06 de Noviembre de 2007, 12:39:35 por Nichita »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas con INDF
« Respuesta #9 en: 06 de Noviembre de 2007, 15:11:46 »
Hola Jose.

tampoco me funciona poniendo

movfw   INDF
btfss      W,CONTADOR2

W tampoco es un registro físico. Es el acumulador y no se le puede aplicar ninguna instruccion que requiera de un registro como argumento(en el datasheet, bajo "Instruction Set Summary", en todas las funciones que lleven un registro("f") W no puede ser dicho registro.

Por ejemplo: NO funciona hacer:

 movf     W,x
 btfss      W,x
 rlf          W,x
 decf       W,x
 ...etc

Por otro lado, si queres rotar un registro mas de una vez, vas a necesitar de una variable auxiliar para contener el valor. Sino con el INDF recorda que estas trabajando directamente sobre la posicion de memoria que indica el registro FSR y vas a destruir los registros involucrados en el INDF al rotarlos.


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 elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problemas con INDF
« Respuesta #10 en: 06 de Noviembre de 2007, 15:44:25 »
Bruno no se si disentir contigo en el caso de btfss... con W e INDF se pueden hacer aunque no sean registros propiamente dicho... si pones btfss W,1 o btfss INDF,1 funciona perfectamente. Ahora el problema es que el segundo argumento es una constante... cosa que no vi reflejado claramente en ningun lado.... y si pones un registro pues ahí se hace la picha un lio

1 saludo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas con INDF
« Respuesta #11 en: 06 de Noviembre de 2007, 16:31:34 »
Bruno no se si disentir contigo en el caso de btfss... con W e INDF se pueden hacer aunque no sean registros propiamente dicho... si pones btfss W,1 o btfss INDF,1 funciona perfectamente.

si defines W como

W equ 0

Entonces el ensamblador lo toma como el registro 0, por eso no da error lo cual no significa que estés actuando sobre el WREG , eso es lo que bruno estaba tratando de exponer.

Ahora el problema es que el segundo argumento es una constante... cosa que no vi reflejado claramente en ningun lado.... y si pones un registro pues ahí se hace la picha un lio

No entendí lo que quieres significar pero no se puede pasar un bit como parámetro variable.  Tiene que ser fijo.  Si uno define un equ el compilador lo toma como constante y por eso algunas veces puede no dar error lo cual no significa que 'ensamble' lo que uno espera que esa instrucción haga.

Es por esta razón por la cual tampoco se puede pasar un número de pin como parámetro a una función, lo cual constituye una de las preguntas más frecuentes que he leído por aquí y allí en cuanto respecto a los Pics.

- 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: Problemas con INDF
« Respuesta #12 en: 06 de Noviembre de 2007, 17:08:41 »
Bueno, como te explicó Mauricio:

Yo me refería a que si ponés, por ejemplo, btfss W,1 en realidad el MPASM lo va a ensamblar como btfss 0,1. Entonces en realidad estás trabajando sobre el registro INDF.

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 elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: Problemas con INDF
« Respuesta #13 en: 06 de Noviembre de 2007, 18:00:21 »
Mil gracias por la aclaración... ahora no cabe ninguna duda :-)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Problemas con INDF
« Respuesta #14 en: 06 de Noviembre de 2007, 19:25:17 »
Mil gracias por la aclaración... ahora no cabe ninguna duda :-)

Y si todavía seguis con el assembly... es porque eres valiente!! (como nosotros)  :D :D :D
- 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)


 

anything