Autor Tema: Como realizar comparación entre datos de variables.  (Leído 3833 veces)

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

Desconectado aldodavilam

  • PIC10
  • *
  • Mensajes: 12
Como realizar comparación entre datos de variables.
« en: 20 de Mayo de 2018, 03:01:35 »
Muy buenos amigos, soy nuevo en el foro,  de igual manera aprendiendo sobre ensamblador..
Quiero resolver un problema que  no entiendo como hacer, el cual comento a continuación..

Quiero realizar un conteo con un botón, pero cuando ese conteo llegue a un cierto número Active una salida y al alcanzar otro valor la desactive.

Como una especie de if...
Contador= 4 (write  high RA0)
If
Contador=8[ write low RA0)

ALGO asi. Espero que me puedan ayudar,  estoy comenzando a prender eso..

Muchas gracias de antemano.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como realizar comparación entre datos de variables.
« Respuesta #1 en: 20 de Mayo de 2018, 11:57:54 »
Lo podes hacer de todas las formas posibles que se te ocurran, sumando, restando, haciendo una AND, usando una XOR, etc. Las mas simples son XOR y restando. supongamos que tenes el registro CONTADOR donde tenes tu dato.

Código: ASM
  1. ;Restando:
  2.   MOVF CONTADOR, W
  3.   SUBLW d'4'
  4.   BTFSS STATUS, Z  ; Si Z es 1, son iguales
  5.  
  6. ;XOR:
  7.   MOVF CONTADOR, W
  8.   XORLW d'4'
  9.   BTFSS STATUS, Z  ; Si Z es 1, son iguales

Para entenderlo mejor, explico cada una, la resta es simple, 4 - 4 = 0, y cuando es 0 se activa la bandera Z (zero)
La XOR la podes pensar a nivel bits. Y tendrias, voy a dar 2 ejemplos:

Para contador = 3
Contador: 0000 0011
ValorXOR: 0000 0100
--------------------------
Resultado: 0000 0111

La tabla de XOR la podes resumir que si haces la XOR con el valor d'4' le vas a invertir el bit solo a aquel que posea un 1, en nuestro caso d'4' posee un 1 en el tercer bit. Por lo tanto queda de esa forma, y no se cumple que se hace cero. Pero cuando son iguales:

Para contador = 4
Contador: 0000 0100
ValorXOR: 0000 0100
--------------------------
Resultado: 0000 0000

Le invierte el unico 1 que poseia, entonces el resultado si es 0, y podes determinar que son iguales gracias a la bandera Z.


--------------------------------------

¿ Que ventajas tiene uno del otro ?
La XOR te permite verificar una igualdad en este caso. Ya que va a modificar la bandera Z nomas.
La resta, por su parte, permite determinar otras cosas ademas, como que si es mayor uno de otro, o si es menor tambien. Ya que al realizar la resta se activa el bit del Carry segun los valores. Sea la resta que uses SUBWF, SUBLW, solo tenes que recordar que puede cambiar el orden de los operandos en cada una de esas.

Ya tu codigo quedaria:

Código: ASM
  1. MOVF CONTADOR, W
  2.   XORLW d'4'
  3.   BTFSC STATUS, Z  ; Si Contador es igual a 4 , activa la salida
  4.   BSF  PORTA, 0
  5.   MOVF CONTADOR, W
  6.   XORLW d'8'
  7.   BTFSC STATUS, Z  ; Si Contador es igual a 8, desactiva la salida
  8.   BCF  PORTA, 0

Desconectado aldodavilam

  • PIC10
  • *
  • Mensajes: 12
Re:Como realizar comparación entre datos de variables.
« Respuesta #2 en: 20 de Mayo de 2018, 13:40:39 »
Hola buenos dias, amigo @KILLERJC.. te agradezco muchisimo por responderme rapido. Probare el metodo de la resta que mencionaste. Pues estoy comenzando en PICm y pues es algo que realmente me interesa.
La idea es pasar de unos programas sencillos que esta en lenguaje C a pasarlo a ensamblador, pongo el ejemplo.

int contador=0;
....
while(1){
   if (input(PIN_A0)==0{
      while (input(PIN_A0)==0){
         delay_ms(200);
         ++contador;
         output_c(contador);
         
         if (contador==4){
            output_bit(PIN_D0,1)
         }
         if (contador==8){
            output_bit(PIN_D0,0)
         }
         if (contador==12){
            output_bit(PIN_D1,1)
         }
         if (contador==16){
            output_bit(PIN_D1,0)
         }
         
      }
   }
}

Practicamente la funcion que tengo que hacer es que haga los mismo, pero en assembly..

Muchas Gracias siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como realizar comparación entre datos de variables.
« Respuesta #3 en: 20 de Mayo de 2018, 15:09:32 »
el while(1) es un loop infinito, que nunca va a salir entonces:


Código: ASM
  1. LOOP:
  2.        ;Aca lo de adentro del while
  3.        GOTO LOOP


los if como en este caso que es un bit (el bit del puerto) lo que tenes que revisar con un BTFSS o BTFSC. Siendo la siguiente condicion cuando se cumpla o no.
Ejemplo:

Código: ASM
  1. BTFSS PORTA,0
  2. GOTO PINenCERO
  3. GOTO PINenUNO

Aca yo puse GOTO para que sea mas simple de ver, pero es lo que vas a hacer si fuera un if..else (aunque te podes ahorrar el segundo GOTO)
El otro while es un poco mas de ingenio

Código: ASM
  1. MYWHILE:
  2.          BTFSS PORTA,0
  3.          GOTO MYWHILE  ; Mientras sea 0 vuelva a preguntar..

Tambien lo podes ver en otros codigos como:

Código: ASM
  1. BTFSS PORTA,0
  2.          GOTO $-1

Esto es por si lo ves, el operador $ indica la posicion del GOTO, y el -1 hace que salte a la direccion del BTFSS, ambos codigos ocupan el mismo tamaño en el micro y las mismas instrucciones, pero es mas legible el anterior.

el ouput_c es mover el valor de contador a W y luego al PORTC. Y lo de los if ya te lo conteste.

Desconectado aldodavilam

  • PIC10
  • *
  • Mensajes: 12
Re:Como realizar comparación entre datos de variables.
« Respuesta #4 en: 20 de Mayo de 2018, 15:26:55 »
Ya con eso tengo que hacerlo, cuando lo haya concluido exitosamente y este funcional, se lo comparto amigo @KILLERJC, Se lo agradezco mucho enserio que sí, echo esto cerrare el tema.
Muchas gracias.
Saludos desde el Perú..

Desconectado aldodavilam

  • PIC10
  • *
  • Mensajes: 12
Re:Como realizar comparación entre datos de variables.
« Respuesta #5 en: 26 de Mayo de 2018, 12:30:31 »

Mucha gracias amigo, ya lo resolvi, hasta ahorita tuve tiempo de hacerlo.. Te doy la gracias.. Y tambien gracias a este post que fue de mucha ayuda http://www.todopic.com.ar/foros/index.php?Topic=41758  que tambien quiso hacer lo mismo..

gracias por la ayuda