Comparar dos registros Mplab

Hola compañeros, estoy realizando un proyecto en ensamblador con mplab y necesito hacer comparaciones entre dos registros, tambien necesito hacer comparaciones entre constantes y registros para las cuales no tengo ningun problema. Cuando realizo las comparaciones entre constantes y registros hago lo siguiente:

movlw b'11110000' ;muevo la constante a W
xorwf registro,w ;si son iguales status,z =1 si no, z=0
btfss status,z ; testeo z para ver su estado
goto diferente
goto igual

hasta aqui todo bien, pero cuando se necesito comparar registro con registro, esto no funcionaria ya que en el datasheet en la instruccion xorwf ó subwf tiene una restriccion que es: 0<=f<=127, lo que quiere decir que el registro no debe ser mayor a 127 y normalmente uso registros que se incrementan ó cambian a datos mayores a 127.

espero estar equivocado y que alguien me pueda ayudar. gracias de antemano. saludos.
 
Podes hacerlos siplemente restando los 2 registros, si Z=0 entonces son diferentes , si Z=1 entonces iguales, chauuuuuuu

de todas maneras en la pagina de Microchip hay notas de aplicacion para comparar 2 regs, y determinar si es igual, mayor o menor que, chauuuuuuuuuu
 
ok muchas gracias por responder, tambien con subwf tiene la misma restriccion donde 0<=f<=127, he buscado en microchip pero no he encontrado esas notas de aplicacion. alguna liga que me puedan pasar.

ya probé con subwf y xorwf pero me retorna datos erroneos.

muchas gracias.
 
Última edición:
ok en la pagina No. 165 seccion 15.0 INSTRUCTION SET SUMMARY. anexo un dato adjunto donde se muestra la restriccion.

saludos


igual para subwf adjunto su imgen
 

Adjuntos

  • xorwf register.rar
    7.6 KB · Visitas: 161
  • subwf register.rar
    6.2 KB · Visitas: 125
Última edición:
Lo que dice F es el índice del registro, no el valor del registro en sí.

Los registros son de 8 bits, por lo que pueden representar datos entre 0 y 255.

La resta anda bien con cualquier numero que entre ahí.
 
Hola:

Código:
[COLOR=#006600][COLOR=#006600];**********************************************************************
[COLOR=#006600];                      AqueronteBlog@gmail.com                        *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];   Este archivo es propiedad intelectual del blog Aqueronte,         *[/COLOR]
[COLOR=#006600];   cuya dirección web, es la siguiente:                              *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];                   http://unbarquero.blogspot.com/                   *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];   Se permite cualquier modificación del archivo siempre y cuando    *[/COLOR]
[COLOR=#006600];   se mantenga la autoría del autor.                                 *[/COLOR]
[COLOR=#006600];                                                                     *
;   El autor no se responsabiliza de las consecuencias que pueda      *
;   ocasionar éste código debido a un uso inadecuado del mismo.       *
[/COLOR][COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Filename:      Ejemplo2.asm                                      *[/COLOR]
[COLOR=#006600];    Date:          6-Octubre-08                                      *[/COLOR]
[COLOR=#006600];    File Version:  vs0.0                                             *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Author:        Manuel Caballero                                  *[/COLOR]
[COLOR=#006600];    Company:       Hades                                             *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Files Required: P16F628A.INC                                     *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];    Notes: Manejar instrucciones de operaciones.                     *[/COLOR]
[COLOR=#006600];                                                                     *[/COLOR]
[COLOR=#006600];**********************************************************************[/COLOR]

[COLOR=#000099]   list[/COLOR]      [COLOR=#330033]p=16F628A[/COLOR]             [COLOR=#006600]; Directiva para definir el procesador[/COLOR]
[COLOR=#000099]   #include[/COLOR] < [COLOR=#330033]p16F628A.inc[/COLOR] >   [COLOR=#006600]    ; Registros especificas del procesador[/COLOR]

[COLOR=#000099]   __CONFIG   [COLOR=#330033]_BOREN_OFF & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _INTOSC_OSC_NOCLKOUT[/COLOR][/COLOR]
[COLOR=#006600][/COLOR]
[COLOR=#006600]; _BOREN_OFF:               Reset por Brown-out DESACTIVADO.
; _CP_OFF:                  Protección de código DESACTIVADO.
; _DATA_CP_OFF:             Protección de datos DESACTIVADO.
; _PWRTE_ON:                Retraso al reset ACTIVADO.[/COLOR]
[COLOR=#006600][COLOR=#006600]; _WDT_OFF:                 Watchdog DESACTIVADO.
; _LVP_OFF:                 Programación en bajo voltaje DESACTIVADO.
; _MCLRE_ON:                Pin de reset externo ACTIVADO.
; _INTOSC_OSC_NOCLKOUT:     Oscilador interno sin salida CLK.[/COLOR][/COLOR]
[COLOR=#006600];***** DEFINICIÓN DE VARIABLES[/COLOR]
[COLOR=#000099][/COLOR]       [COLOR=#000099]CBLOCK[/COLOR]   [COLOR=#000066]0x20   [COLOR=#006600]; Inicio dirección memoria de datos del Banco 0[/COLOR][/COLOR]
  [COLOR=#330033]     Numero[/COLOR]
[COLOR=#000099]      ENDC[/COLOR]

[COLOR=#006600];**********************************************************************[/COLOR]
[COLOR=#000099]       ORG     0x000 [/COLOR]      [COLOR=#006600]; Inicio de código[/COLOR]
      [COLOR=#000099] bsf[/COLOR]     [COLOR=#663366]STATUS,RP0[/COLOR]  [COLOR=#006600]; Banco 1[/COLOR]
     [COLOR=#000099]  bsf [/COLOR]    [COLOR=#663366]PCON,OSCF[/COLOR]   [COLOR=#006600]; Oscilador interno a 4MHz[/COLOR]
     [COLOR=#000099]  bcf[/COLOR]     [COLOR=#663366]STATUS,RP0[/COLOR]  [COLOR=#006600]; Banco 0[/COLOR]
[COLOR=#006600]      [COLOR=#000066] goto[/COLOR]    [COLOR=#663366]Inicio[/COLOR]      ; Salta a programa principal

[/COLOR][COLOR=#006600][COLOR=#000099]       ORG     0x0004      [COLOR=#006600]; Vector de Interrupción[/COLOR][/COLOR][/COLOR][COLOR=#006600]; El vector de interrupción se encuentra en la dirección 0x0004
; En este ejemplo no se usará interrupciones.
[COLOR=#000099]        retfie[/COLOR]
[/COLOR]
[COLOR=#663366]Inicio[/COLOR]
[COLOR=#000066]      [COLOR=#000099] movlw   0x03[COLOR=#330033][/COLOR]       [COLOR=#006600]; 3 -> (W)[/COLOR][/COLOR] [COLOR=#000099]
       movwf   [COLOR=#330033]Numero[/COLOR]     [COLOR=#006600]; (W) -> Numero[/COLOR] [/COLOR]

[COLOR=#663366]Bucle_Dec[/COLOR]
[COLOR=#000099]       decfsz [COLOR=#663366]Numero,F[/COLOR]  [COLOR=#006600]; --Numero, Salta si Numero = 0[/COLOR]
       goto [COLOR=#663366]Bucle_Dec[/COLOR]   [COLOR=#006600]; Si Numero != 0 vuelve a Bucle_Dec[/COLOR]

       subwf [COLOR=#663366]Numero,F[/COLOR]   [COLOR=#006600]; Numero = Numero - W[/COLOR]

[COLOR=#663366]Bucle_Inc[/COLOR]
      incfsz [COLOR=#663366]Numero,F[/COLOR]  [COLOR=#006600]; ++Numero, Salta si Numero = 0[/COLOR]
       goto [COLOR=#663366]Bucle_Inc[/COLOR] [COLOR=#006600]  ; Si Numero != 0 vuelve a Bucle_Inc[/COLOR][/COLOR][COLOR=#000099]
[COLOR=#006600][/COLOR][/COLOR][COLOR=#330033][COLOR=#000099][/COLOR][/COLOR][COLOR=#000099]
       goto    [COLOR=#663366]Inicio[/COLOR][/COLOR][/COLOR]   [COLOR=#006600]; Vuelve a Inicio[/COLOR]

[COLOR=#000099]       END[/COLOR]              [COLOR=#006600]; directiva 'fin de programa'[/COLOR][/COLOR][/COLOR]

Para la realización de este programa, se ha empleado una variable definida en memoria RAM. Para tal propósito, se ha usado la instrucción:

cblock---endc

En este caso, el PIC 16F628A comienza la dirección de memoria de datos en la dirección 0x20, se declarará la variable Numero.

El propósito de este programa es familiarizarse con las instrucciones de programación en lenguaje ensamblador, donde se usará instrucciones que serán comunes en nuestros códigos.

En este programa se muestra como se utilizan las instrucciones de decremento e incremento con posibilidad de salto y también se muestra como usar la instrucción de resta entre un registro y W.


Para ver el resultado, compilamos el código y seleccionamos el MPLAB SIM para poder simularlo.

Abrimos la ventana de Watch y seleccionamos en la categoría de Symbol la variable definida como Numero, y el la categoría de SFR, el registro WREG.

Simulamos el código paso a paso.

Se puede apreciar como el valor de la constante se almacena en el registro de trabajo W, después se iniciará la variable Numero con el valor contenido en W, y a partir de ahí, el programa decrementa la variable Numero hasta que sea cero su valor, posteriormente, se incrementara dicha variable hasta que sea cero su valor.


http://unbarquero.blogspot.com/2008/10/mid-range-pic-ejemplo-2.html

http://unbarquero.blogspot.com/2008/07/subwf.html

Saludo.
 
He intentando comparar valores de distintas formas, para que salten a subrutinas como lo hace la instrucción if pero ninguna me ha funcionado:confused:;ninguno de los programas salta donde yo quiero, estoy usando el mplab, estos son los códigos que he usado:

Código:
programa1:
    movlw     04H
    movwf     cnt
    movlw     05H
    movwf     cn

    movf     cnt,w
    subwf     cn,W
    btfss     STATUS,C
    goto    carry_es0 
    goto     carry_es1
carry_es0
decf cnt
return

carry_es1
incf cnt
return

;**********************************************
programa2:

movlw 26h
movwf cnt

MOVLW 26H; carga el acumulador con el valor a comparar.
XORWf cnt,w ; compara el acumulador con NUMERO.
BTFSS STATUS, Z ; salta la instrucción siguiente si XOR = 0.
GOTO DISTINTO ; salta a DISTINTO si XOR no es 0.
GOTO IGUAL ; salta a IGUAL.

IGUAL:
decf cnt

DISTINTO:
incf cnt
 
Intenta revisando el estado del bit Z (zero) y recuerda declarar tus variables en la seccion de memoria adecuada (CBLOCK).

Código:
        MOVF	REGISTRO_A,W	;REGISTRO 'A' A COMPARAR, ES RESTADO DEL REGISTRO 'B',
	SUBWF	REGISTRO_B,0	;EL RESULTADO SE GUARDA EN W, PARA NO AFECTAR NINGUNO DE LOS REGISTROS
	BTFSS	STATUS,Z	;REVISAMOS EL ESTADO DEL BIT Z (ZERO), SI EL RESULTADO ES CERO
	GOTO	NO_IGUALES	;QUIERE DECIR QUE AMBOS REGISTROS SON IGUALES
IGUALES
	;PON TU RUTINA DE IGUALES
	;...
	;...
	;TERMINA TU RUTINA CON UN 'RETURN' PARA FINALIZAR ESTA RUTINA Y REGRESAR UN VALOR
	;O CON UN 'GOTO' PARA IR A OTRA RUTINA

NO_IGUALES
	;PON TU RUTINA DE NO IGUALES
	;...
	;...
	;TERMINA TU RUTINA CON UN 'RETURN' PARA FINALIZAR ESTA RUTINA Y REGRESAR UN VALOR
	;O CON UN 'GOTO' PARA IR A OTRA RUTINA
 
LOL amigos yo tambien tenia el mismo problema pero era porqué usaba MOVLW para cargar un registro en W y por esos no me lo leía bien, aqui dejo un codigo que si me funciono para comparar dos registros:

MOVF CONTAR1,W; MUEVO CONTAR1 A W
XORWF CONTAR2,0 ;USO XORWF PARA HACER UNA OPERACION XOR SOBRE CONTAR2 Y W
BTFSC STATUS,2 ; EL RESULTADO DEL XOR SE GUARDA EN Z QUE ES EL BIT 2 DE STATUS
GOTO IGUAL
GOTO DIFERENTE
 
Atrás
Arriba