Autor Tema: Comparar 2 valores con un margen de error (assembler)  (Leído 234 veces)

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

Desconectado JereDutra

  • PIC10
  • *
  • Mensajes: 3
Comparar 2 valores con un margen de error (assembler)
« en: 05 de Febrero de 2021, 23:53:54 »
Buenas gente, soy nuevo en todo esto de la programación por las dudas.
Mi duda es la siguiente. Estoy usando un Pic16f690 y mi intención es comparar 2 valores analógicos, hasta ahí bien, después de ésta comparación, dependiendo de si son iguales o no, se debería activar una alarma. Y acá es cuando entra mi problema, necesito tener un margen de error.
Espero haber sido claro y que me puedan ayudar, muchas gracias.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 507
Re:Comparar 2 valores con un margen de error (assembler)
« Respuesta #1 en: 06 de Febrero de 2021, 07:35:04 »
 Entiendo que lo que quieres es por ejemplo esto:

   Quiero activar la alarma cuando el valor sea 100.
   
   Pero cuando está por ejemplo fluctuando al 92, a veces da un pico de 102 y vuelve a seguir fluctuando al 92. Eso significaría que el valor en verdad sigue siendo 92, ese pico te activaría la alarma y quieres evitarlo.

  Si es así se me ocurren varias opciones:

  1- Usando los comparadores analógicos del pic, estabilizar el resultado de la comparación ponderando varios resultados consecutivos y tenerlo en cuenta solamente cuando sea el mismo durante un número “n” de veces consecutivas.  Esto eliminaría que la alarma se dispare por culpa de ese pico.

  2- Usando dos entradas analógicas convencionales ,  hacer algo parecido pero en este caso ponderas cada tensión por separado estabilizando ambas, las comparas por software y actúas con la alarma si procede.

  De este último modo además puedes establecer que % de error quieres dar.

 Por ejemplo, en el caso del 92, imagínate que quiero permitir un error máximo del 5%.

  El 5% de 92 seria 4,6. Por lo tanto voy a ir ponderando x veces, las que quieras, cuantas más, más afinado será el resultado aunque más tiempo tardarás en obtenerlo, todos los valores que NO me cambien en más de 4,6 unidades.  No se si me entiendes.

  Ejemplo: La media actual de la ponderación es 92, me llega un 94, como de 94 a 92 hay una diferencia de 2, esta dentro de rango de error permitido, por lo tanto lo pondero y actualizo la media. Pero de repente me llega un 98, “es más de 4,6 de diferencia”, lo descarto y no se actualiza la media con ese valor.

  Y poco más se me ocurre.







 

 
« Última modificación: 06 de Febrero de 2021, 07:44:52 por remi04 »

Desconectado JereDutra

  • PIC10
  • *
  • Mensajes: 3
Re:Comparar 2 valores con un margen de error (assembler)
« Respuesta #2 en: 08 de Febrero de 2021, 22:38:30 »
En realidad es todo lo contrario, lo explico resumido, yo chequeo algo y me da un valor A, después vuelvo a chequear lo mismo y me da un valor B. Los comparo y si los valores son iguales está bien, pero necesito un margen de error para disparar la alarma. Porque se puede dar que el valor varíe muy poquito y no es necesario que dispare la alarma.

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8030
Re:Comparar 2 valores con un margen de error (assembler)
« Respuesta #3 en: 08 de Febrero de 2021, 23:52:24 »
Resta...


Eso te va a dar la diferencia.
Si uno es mayor que otro entonces vas a tener la bandera de carry para fijarte, y vas a poder sacarle el complemento. en caso que restes por ejemplo 45 -50... Esto te daria -5 y sacando el complemento a 2 quedas con +5.

Si la resta era 50-45, entonces no necesitas sacarle ningun complemento y avanzas al proximo paso.

Luego restas nuevamente con tu valor de "margen de error", y ahi si es menor el valor que obtuviste antes, entonces actuas como desees.
Supongamos que tu margen de error era de 10, entonces vas a hacer 10 - 5... Observando el bit de carry vas a poder observar si mayor o menor que tu valor de margen de error.
« Última modificación: 08 de Febrero de 2021, 23:55:12 por KILLERJC »

Desconectado JereDutra

  • PIC10
  • *
  • Mensajes: 3
Re:Comparar 2 valores con un margen de error (assembler)
« Respuesta #4 en: 11 de Febrero de 2021, 17:58:09 »
Esto te daria -5 y sacando el complemento a 2 quedas con +5.
Si la resta era 50-45, entonces no necesitas sacarle ningun complemento y avanzas al proximo paso.

Qué sería eso de sacar el complemento?

Conectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8030
Re:Comparar 2 valores con un margen de error (assembler)
« Respuesta #5 en: 11 de Febrero de 2021, 21:42:25 »
El problema es como representas un numero negativo... por ejemplo cuando restas

45 = 0x2D = 0010 1101
50 = 0x32 = 0011 0010

Al restar  45-50 = -5 esto te queda en binario/hexa:

0xFB = 1111 1011

Gracias al bit de Carry, del status podemos saber que cuando hacemos un SUBxx el C se pone a 0 cuando ocurre le underflow como ves... entonces sabes que es un número negativo. Solo habria que encontrar el numero entero positivo ( 5 ). Y para esto aplicamos el "complemento a 2" de un numero binario.

Primero invertirlo ( COMF )

0x04 = 0000 0100

Luego sumarle 1 ( INCF )

0x05 = 0000 0101

Ese es todo el procedimiento que deberías hacer....
Supongamos que tenes dos registros (tus dos valores analogicos), llamados VARIABLE_1 y VARIABLE_2, y vamos a suponer que tu "margen" de seguridad sea de 10 decimal (0xA en hexa ), el siguiente código funcionaria:

Solo algunas consideraciones, utilizo VARIABLE_1 como registro de trabajo temporal para almacenar los calculos. Sino vas a tener que hacerlo en otro registro.

Código: ASM
  1.     MOVF VARIABLE_2
  2.     SUBWF VARIABLE_1, F   ; Resto VARIABLE_1 - VARIABLE_2
  3.     BTFSC STATUS,C             ; Si C = 1 es positivo o cero, necesito saber cuando es negativo para sacarle el complemento es decir cuando C=0
  4.     GOTO  CHECK_MARGEN
  5.     COMF VARIABLE_1, F  ; Invierto
  6.     INCF VARIABLE_1, F   ; Incrementó en 1
  7. CHECK_MARGEN:
  8.     MOVLW 0xA         ; Este es el margen, es decir los 0xA o 10 decimal
  9.     SUBWF VARIABLE_1, W  ; diferencia - 10    ....
  10.     BTFSS STATUS, C ; Si C=1 entonces la  diferencia es mas grande que el margen de seguridad
  11.     GOTO DIFERENCIA_PEQUEÑA
  12.     GOTO CUMPLE_CON_EL_MARGEN



 

anything