Autor Tema: Comparar cadena de datos  (Leído 2719 veces)

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

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Comparar cadena de datos
« en: 17 de Enero de 2012, 21:51:17 »
Hola tengo otro problema, tengo que conparar cadenas de datos y enviar según el dato un numero, les muestro la tabla a comparar:

 1  2  3  4 5   6    7   8  9  10 11  12

3C 3C 31 30 44  30  30  46 46  44 43  3E      0
3C 3C 31 30 44  30  31  46 46  36 36  3E      1
3C 3C 31 30 44  30  32  46 46  32 38  3E      2
3C 3C 31 30 44  30  33  46 46  39 32  3E      3
3C 3C 31 30 44  30  34  46 46  33 35  3E      4
3C 3C 31 30 44  30  35  46 46  38 46  3E      5
3C 3C 31 30 44  30  36  46 46  43 31  3E      6
3C 3C 31 30 44  30  37  46 46  37 42  3E      7
3C 3C 31 30 44  30  38  46 46  38 45  3E      8
3C 3C 31 30 44  30  39  46 46  33 34  3E      9
3C 3C 31 30 44  30  41  46 46  39 38  3E     10
3C 3C 31 30 44  30  42  46 46  44 36  3E     11
3C 3C 31 30 44  30  43  46 46  36 43  3E     12
3C 3C 31 30 44  30  44  46 46  43 42  3E     13
3C 3C 31 30 44  30  45  46 46  37 31  3E     14
3C 3C 31 30 44  30  46  46 46  33 46  3E     15

3C 3C 31 30 44  31  30  46 46  32 34  3E     16
3C 3C 31 30 44  31  31  46 46  39 45  3E     17
3C 3C 31 30 44  31  32  46 46  44 30  3E     18
3C 3C 31 30 44  31  33  46 46  36 41  3E     19
3C 3C 31 30 44  31  34  46 46  43 44  3E     20
3C 3C 31 30 44  31  35  46 46  37 37  3E     21
3C 3C 31 30 44  31  36  46 46  33 39  3E     22
3C 3C 31 30 44  31  37  46 46  38 33  3E     23
3C 3C 31 30 44  31  38  46 46  37 36  3E     24
3C 3C 31 30 44  31  39  46 46  43 43  3E     25
3C 3C 31 30 44  31  41  46 46  36 30  3E     26
3C 3C 31 30 44  31  42  46 46  32 45  3E     27
3C 3C 31 30 44  31  43  46 46  39 34  3E     28
3C 3C 31 30 44  31  44  46 46  33 33  3E     29
3C 3C 31 30 44  31  45  46 46  38 39  3E     30
3C 3C 31 30 44  31  46  46 46  43 37  3E     31

3C 3C 31 30 44  32  30  46 46  41 43  3E     32
3C 3C 31 30 44  32  31  46 46  31 36  3E     33
3C 3C 31 30 44  32  32  46 46  35 38  3E     34
3C 3C 31 30 44  32  33  46 46  45 32  3E     35
3C 3C 31 30 44  32  34  46 46  34 35  3E     36
3C 3C 31 30 44  32  35  46 46  46 46  3E     00

Como veran son casi iguales salvo por los algunos bits, la columna final es el dato a mostrar, mi pregunta es hay alguna forma de cargar todo el dato y compararlo con el resto ? yo lo estoy haciendo bite por bite asi:
Código: [Seleccionar]
    MOVF    DATO1_RX,W       ; con distribución Francesa. 
    SUBLW   0X3C             ;
    BTFSS   STATUS,Z         ; Salto si Z=1
    GOTO    REINICIA         ; Subrutina de clave incorrecta.
    MOVF    DATO2_RX,W
    SUBLW   0X3C             ;
    BTFSS   STATUS,Z         ; Salto si Z=1
    GOTO    REINICIA         ; Subrutina de clave incorrecta.
    MOVF    DATO3_RX,W
    SUBLW   0X31             ;
    BTFSS   STATUS,Z         ; Salto si Z=1
    GOTO    REINICIA         ; Subrutina de clave incorrecta.
    MOVF    DATO4_RX,W
    SUBLW   0X30             ; 
    BTFSS   STATUS,Z         ; Salto si Z=1
    GOTO    REINICIA         ; Subrutina de clave incorrecta.
    MOVF    DATO5_RX,W
    SUBLW   0X44             ; 
    BTFSS   STATUS,Z         ; Salto si Z=1
    GOTO    REINICIA         ; Subrutina de clave incorrecta.

Y es muy largo comparar los 37 datos uno por uno, si hay alguna forma mas rápida me la pueden enseñar.
Gracias

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comparar cadena de datos
« Respuesta #1 en: 17 de Enero de 2012, 22:37:25 »
puedes cargar todas las cadenas en la ram, y luego en la comparacion haces un bucle aumentando la direccion de memoria hasta el final.

Desconectado JBQ

  • PIC16
  • ***
  • Mensajes: 118
Re: Comparar cadena de datos
« Respuesta #2 en: 17 de Enero de 2012, 22:51:53 »
Yo tambié pase por ese problema y no le encontre otro método, por la naturaleza misma de las cadenas a rx. Quizás puedas en este caso inducir una función matematica con el total de los cadenas a comparar, ya que son pocas (a comparación de mi experiencia) y las tienes documentadas... saludos.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Comparar cadena de datos
« Respuesta #3 en: 18 de Enero de 2012, 01:22:02 »
el esta preguntando en asm, lo que has dicho no consume unos pocos ciclos, ya de por si una multiplicacion ocupa muchos ciclos

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Comparar cadena de datos
« Respuesta #4 en: 18 de Enero de 2012, 01:47:20 »
Convirtiendo a ASCII son cadenas de la forma

   <<10D00FFDC>
   <<10D01FF66>
   <<10D02FF28>
   <<10D03FF92>
   <<10D04FF35>

Puedes limitarte a sumar los primeros nueve caracteres ("<<10D00FF") a modo de checksum. Observa que esta suma siempre te dará 0x8A, de modo que si le sumas 0x76 resultara 0 y subirá el flag Z, con lo que validas el prefijo. Luego tienes que formar el hexadecimal: El noveno byte es el nible alto y el decimo es el nible bajo (son valores ASCII y debes convertirlos a decimales antes de realizar esta operación; por ejemplo, '0' sera 0 y 'A' sera 10), luego...

   rlf   nible_alto
   movwf nible_alto
   addwf nible_bajo
   ; ahora resultado en w

Para la primer fila, tendrás en el registro W el valor 0xDC, para la segunda 0x66, y así sucesivamente.
Por lo que nos indicas son 38 los valores posibles; puedes buscar en una tabla y retornar el índice.
No quieres compartir con nosotros el origen de estas cadenas, tal vez podamos encontrar alguna relación entre ellos.
@fabianjsm is on twitter

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Comparar cadena de datos
« Respuesta #5 en: 18 de Enero de 2012, 16:36:05 »
Mira los bytes que enumeraste 6 y 7, forman el valor que estas retornando, son 4 las columnas que cambian:

<<10D 00 FF DC>
<<10D 01 FF 66>
<<10D 02 FF 28>
<<10D 03 FF 92>
<<10D 04 FF 35>
<<10D 05 FF 8F>
@fabianjsm is on twitter

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comparar cadena de datos
« Respuesta #6 en: 18 de Enero de 2012, 21:50:43 »
Wauu! que despiole hice, en realidad por lo que veo me exprese mal, la tabla que puse al principio son comando seriales que me envía un dispositivo yo necesito revisar bite por bite para ver que no halla error en la transmición por ejemplo este:

3C 3C 31 30 44  30  30  46 46  44 43  3E

Que me equivale al "0", mi pregunta era si se puede ver de alguna manera tomar esta cadena de bite e ir comparándola con la que tengo almacenada y asi ver que numero es.
Mi rutina es :
Código: [Seleccionar]
    MOVF    DATO1_RX,W       ; con distribución Francesa. 
    SUBLW   0X3C             ;
    BTFSS   STATUS,Z         ; Salto si Z=1
    GOTO    REINICIA         ; Subrutina de clave incorrecta.
 

Pero me surge otra pregunta, explico un poco: mi programa principal llama a una rutina con el CALL  XXXX y esta es la que tiene todas las subrutinas que deberán comparar los 37 comandos distintos que me envia el equipo y dentro de estas estan otras subrrutinas que envían datos, acá viene la pregunta si yo tengo a la rutina primaria ejecutándose cuanto GOTO y CALL se pueden ejecutar? ya que son muchos.
Saludos y muchas gracias

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comparar cadena de datos
« Respuesta #7 en: 18 de Enero de 2012, 21:53:13 »
Me olvide los datos están en hexadecimal y los necesito asi.
Saludos

Desconectado rina

  • PIC10
  • *
  • Mensajes: 45
Re: Comparar cadena de datos
« Respuesta #8 en: 18 de Enero de 2012, 22:16:18 »
pues ami me parece que esa base de daros y los gosub ya suman tantos ciclos como acer una operacion.. y la operacio podria acerla quedandote con los bit que mas te interesen.
lo malo es el salto del a 8 cadena de 8bit que se sarlta 3a 3b,,, 3f, 40 y salta a 41

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Comparar cadena de datos
« Respuesta #9 en: 19 de Enero de 2012, 07:11:48 »
Hola macedo. La propuesta es que analices la cadena sin compararla con otra. Creo que coincidimos en esto los que intentamos ayudarte. Te evitaras un enorme trabajo en ensamblador (tal vez aceptable solo si es para aprender).

Código: DIV
  1. < <   1  0  D   0   0   F  F   D  C   >    ASCII
  2. 3C 3C 31 30 44  30  30  46 46  44 43  3E    Hex
  3. \____________/  \____/  \___/  \___/  \/
  4.     Prefijo      Dato0   0xFF  Dato1  3E    Campo

Los campos Prefijo, 0xFF y 0x3E son siempre los mismos. Dato0 es el numero que buscas. Por ejemplo 30 30 es el cero: 30 hexadecimal (48 decimal) es el cero en la tabla ASCII.
Si de todos modos optas por la comparación puedes utilizar tablas. Apuntas la cadena a comparar con FSR, comparas INDF con el dato de la tabla, incrementas FSR, comparas INDF... y así para los doce bytes de la primer cadena... si no coincide pasas a la segunda... es muy laborioso, pero con el buscador del foro encontraras bastante información.
@fabianjsm is on twitter

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comparar cadena de datos
« Respuesta #10 en: 19 de Enero de 2012, 12:34:04 »
Hola, gracias es lo mejor que puedo hacer no se me había ocurrido en separarlos por prefijo,dato, ff , dato0, me simplifica la búsqueda. Lo voy a probar y les cuento.
Saludos

Desconectado rina

  • PIC10
  • *
  • Mensajes: 45
Re: Comparar cadena de datos
« Respuesta #11 en: 19 de Enero de 2012, 14:57:56 »
no fastidies...  no pensaste en separarlo por zones toda la informacion..... (que bueno ami tampoco seme dio por ponertelo asi), jejeje

un saludo

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Comparar cadena de datos
« Respuesta #12 en: 19 de Enero de 2012, 16:09:09 »
Hola, gracias es lo mejor que puedo hacer no se me había ocurrido en separarlos por prefijo,dato, ff , dato0, me simplifica la búsqueda. Lo voy a probar y les cuento.
Saludos

Hola Macedo, a lo que te indica Fabian, yo realizaria una subrutina para comprobar "encabezamiento".. si está correcto, continuo con el dato0... una vez obtenido los 2 valores... los paso con una subrutina de ASCII a DECIMAL... y ese numero lo empleo para "saltar" en dos tablas... una con el primer dato de "dato1" y otra con el segundo... ya que veo, son correspondientes...  :mrgreen:

Ademas, en lugar de "restar" para comparar, me gusta más XORWF y verifico el bit de C

   MOVF   MEMORIA,W      ;
   XORWF   ENTRADA,W      
   BTFSC   STATUS,Z   ;SI LOS DATOS SON IGUALES,
   GOTO   datos_iguales   
Firmat - Santa Fe - Argentina

www.TodoPic.net

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

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comparar cadena de datos
« Respuesta #13 en: 19 de Enero de 2012, 16:53:01 »
Hola, el bit C es el de CARRY, o sea si la operación desborda solamente se activa o me equivoco? por ejemplo si lo hago con A>=B la operación da cero o un numero positivo pero no se desborda a menos que me de un numero negativo?
Estuve pensando lo del encabezamiento pero yo ya lo hago, es verificar bit por bit y continuar revisando hasta que uno de mal y mientras los reviso ver a que numero corresponde, es tedioso uno por uno  pero no se me ocurre otra cosa
Saludos

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Comparar cadena de datos
« Respuesta #14 en: 21 de Enero de 2012, 21:17:45 »
Hola, termine con las instrucciones, tenias razón todopic con XORWF me simplifico mas la cosa.
fabianjsm, tu forma de ver el código me ayudo, yo estaba utilizando el dato1 que son diferentes para todos y creo que es el CRC, pero al final lo hacia como dijiste separando lo que es común a todos y verificando el resto para que me de el número.
Gracias a todos por colaborar y voy a probar las demás opciones que me parecieron muy buenas.
Saludos


 

anything