Autor Tema: ayuda comparar dos valores ensembler  (Leído 15728 veces)

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
ayuda comparar dos valores ensembler
« en: 07 de Mayo de 2006, 20:56:53 »
hola.me podria decir alguien como comparar dos valores entre dos registros
y de esa comparacion ,saber cual es mayor o menor.

no se si habia que hacerla con un and o xor

                                   movlw   0xc0
         xorwf   ANALOG,w
         btfsc   STATUS,2
         goto   valor1

en estas instrucciones comparamos el valor contenido en el registro ANALOG con el acumulador.
y podriamos saber si es igual .pero como saber si es mayor o menor.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: ayuda comparar dos valores ensembler
« Respuesta #1 en: 07 de Mayo de 2006, 22:50:32 »
Hola, te paso unas rutinas en asm, como macros para comparar valores, tanto para registros como para literales... espero te sirvan.

;Compare Jump Above.   Si [var1] > [var2] => [var3]  /Compara y Va si Mayor
cjal    macro   var1,var2,var3 
   movlw   var2^0FFh
   addwf   var1,w
   btfsc   CARRY
   goto    var3
   endm
cja     macro   var1,var2,var3 
   movf    var1,w
   subwf   var2,w
   btfss   CARRY
   goto    var3
   endm

;Compare Jump Above or Equal.   Si [var1] >= [var2] => [var3]
cjael   macro   var1,var2,var3 
   movlw   var2
   subwf   var1,w
   btfsc   CARRY
   goto    var3
   endm
cjae    macro   var1,var2,var3 
   movf    var2,w
   subwf   var1,w
   btfsc   CARRY
   goto    var3
   endm

;Compare Jump Below.   Si [var1] < [var2] => [var3]   /Comp y Va si Menor
cjbl    macro   var1,var2,var3 
   movlw   var2
   subwf   var1,w
   btfss   CARRY
   goto    var3
   endm
cjb     macro   var1,var2,var3 
   movf    var2,w
   subwf   var1,w
   btfss   CARRY
   goto    var3
   endm

;Compare Jump Below or Equal            [var1] =< [var2] => [var3]
cjbel   macro   var1,var2,var3 
   movlw   var2^0FFh
   addwf   var1,0
   btfss   CARRY
   goto    var3
   endm
cjbe    macro   var1,var2,var3
   movf    var1,0
   subwf   var2,0
   btfsc   CARRY
   goto    var3
   endm

Saludos.
Alejandro.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ayuda comparar dos valores ensembler
« Respuesta #2 en: 08 de Mayo de 2006, 01:16:50 »
                                   movlw   0xc0
         xorwf   ANALOG,w
         btfsc   STATUS,2
         goto   valor1

Hola.
El XOR solo te podra decir si los valores son iguales o no entre si.

Para hacer la comparación que necesitas, lo mas fácil y práctico es restar un valor al otro, y checkear los bits Z(zero) y C(carry) del registro STATUS.

Entonces podrias hacer asi:

Código: ASM
  1. movlw   0xc0
  2.         subwf   ANALOG,w
  3.         btfss   STATUS,C
  4.         goto    ANALOG_ES_MENOR_AL_LITERAL
  5.        
  6.         btfss   STATUS,Z
  7.         goto    ANALOG_ES_MAYOR_AL_LITERAL
  8.        
  9.         goto    ANALOG_ES_IGUAL_AL_LITERAL

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 groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: ayuda comparar dos valores ensembler
« Respuesta #3 en: 08 de Mayo de 2006, 04:31:38 »
gracias me habeis ahorrado un monton de tiempo perdido,estoy haciendo un proyecto para
la correccion de los valores erroneos ,de un caudalimetro de aire.si me funciona
ya lo subire.a lo mejor resulta util. :lol:

lo que pasa que en las pruevas que estoy haciendo con el conversor analogico del 16f876.
me esta pasando algo muy raro,le estoy haciendo las pruevas en el trainer.y es que cuando
regulo el valor analogico con el potenciometro ,con  un asm simple para visualizar el dato
en los led .no tengo ningun problema,pero si lo hago con el programa que he hecho los
led se buelven locos,variandome los valores unos datos por encima y debajo.como si tubiera alguna interferencia
pero si le toco los pins al 16f876 con los dedos el valor se para en el correcto o almenos se para.

nota:solo le pasa en algunos valores no en todos.a lo mejor no he hecho algo bien

sera eso del ruido de conmutacion? 
tendre que utilizar la instruccion sleep y alguna interrupcion para minimizarlo?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
ayuda comparar dos valores ensembler
« Respuesta #4 en: 08 de Mayo de 2006, 18:23:16 »
FEME   MOVF   VALOR2,0
   SUBWF   VALOR1,0
   BTFSS   STATUS,0
   GOTO   No_positivo
   MOVLW   UNIDAD
eeee          goto           eeee
no_positivo movwf       unidad
               COMF   UNIDAD,1
   INCF   UNIDAD,1
2222         goto     2222



si la operacion es negativa el valor2 es > que valor1
entonces la bandera de carry no se activa.
si la operacion es positiva el carri se activa se coloca en 1. entonces el programa brinca a unidad.
el valor positivo es almacenado en unidad.
ejem:

valor2 :5
valor1:4

la operacion da como resulatdo -1
el carri no se activa.
el programa sigue con goto No_ positivo
si quieres visualizar el -1
tienes que complementar la unidad y sumarle 1.

Desconectado aamoros79

  • PIC10
  • *
  • Mensajes: 46
Re: ayuda comparar dos valores ensembler
« Respuesta #5 en: 20 de Junio de 2006, 07:22:47 »

lo que pasa que en las pruevas que estoy haciendo con el conversor analogico del 16f876.
me esta pasando algo muy raro,le estoy haciendo las pruevas en el trainer.y es que cuando
regulo el valor analogico con el potenciometro ,con  un asm simple para visualizar el dato
en los led .no tengo ningun problema,pero si lo hago con el programa que he hecho los
led se buelven locos,variandome los valores unos datos por encima y debajo.como si tubiera alguna interferencia
pero si le toco los pins al 16f876 con los dedos el valor se para en el correcto o almenos se para.
a mi me paso algo parecido, prueba a resoldar las patas del zocalo, yo tuve que hacerlo y a partir de ahi me fue de maravilla