Autor Tema: Calcular el checksum (eeprom interna de un PIC)  (Leído 5745 veces)

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

Desconectado cammendoza15

  • PIC10
  • *
  • Mensajes: 7
Calcular el checksum (eeprom interna de un PIC)
« en: 24 de Octubre de 2014, 00:43:36 »
Hola amigos, me he tomado el atrevimiento de crear un nuevo tema en este foro, con el objetivo de pedirle a cualquiera que sepa calcular el checksum del código que se encuentra en la memoria eeprom interna de cualquier microcontrolador PIC.

:020000040000FA
:10420000FF00FF00FF00FF00FF00FF00FF00FF00B6
:10421000FF00FF00FF00FF00FF00FF00FF00FF00A6
:10422000FF00FF00FF00FF00FF005000FF00FF0045
:10423000FF00FF00FF00FF00FF00FF00FF00FF0086
:1042400086003700330042005600FF00500049004E
:1042500047001200AC00A6003400B2005300110069
:10426000FF00FF00FF00FF00FF00FF00FF00FF0056
:10427000FF003A00FF00FF00FF00FF00FF00FF000B
:10428000FF00FF00FF00FF00FF00FF00FF005100E4
:10429000FF00FF00FF00FF00FF00FF00FF00FF0026
:1042A0006D006900630072006F0063006F006E00B4
:1042B000740072006F006C00FF00B100010000008C
:1042C000FF00FF00FF00FF00FF00FF00FF00FF00F6
:1042D000FF00FF00FF00FF00FF00FF00FF00FF00E6
:1042E000FF00FF00FF00FF00FF00FF00FF00FF00D6
:1042F000FF00FF00FF00FF00FF00FF00FF00FF00C6
:00000001FF

Este es un código original extraído de un microcontrolador PIC 16F628a. Sobre el checksum he leído un poco sobre esto en algunos otros foros y páginas web en internet pero existe una variedad de explicaciones que solo enredan a la gente. De esto que he leído y he investigado, me he podido dar cuenta que el checksum es aquel número hexadecimal (0-255) que se encuentra en negrilla al final de cada línea del código anterior. Aunque ya lo sé porque el compilador me lo brinda, quisiera saber matemáticamente cómo se obtiene dicho Checksum para cada línea. Les agradezco su ayuda!, es una tarea de investigación de la escuela y pues también le pueda servir de ayuda a cualquier otro!.

Gracias!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Calcular el checksum (eeprom interna de un PIC)
« Respuesta #1 en: 24 de Octubre de 2014, 01:57:37 »
Que tal cammendoza15;

Es muy simple obtener ese checksum. Para obtenerlo simplemente sumas cada uno de los bytes en la linea y en el resultado final tomas los bytes menos significativos y luego le sacas el complemento a 2.

Tomemos la linea en la que el checksum es B6.

10+42+00+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00 = 0x84A. Tomas solamente los dos bytes menos significantes, esto es 4A, obtengamos su complemento a 2. Esto se logra primero invirtiendo el valor del 0x4A, que es 0XB5 y luego le sumas 1, eso te da 0xB6. Listo!!!!!!!!

Facil verdad.

Ojala te sirva.

Elreypic.

Desconectado cammendoza15

  • PIC10
  • *
  • Mensajes: 7
Re: Calcular el checksum (eeprom interna de un PIC)
« Respuesta #2 en: 24 de Octubre de 2014, 10:38:38 »
Que tal cammendoza15;

Es muy simple obtener ese checksum. Para obtenerlo simplemente sumas cada uno de los bytes en la linea y en el resultado final tomas los bytes menos significativos y luego le sacas el complemento a 2.

Tomemos la linea en la que el checksum es B6.

10+42+00+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00 = 0x84A. Tomas solamente los dos bytes menos significantes, esto es 4A, obtengamos su complemento a 2. Esto se logra primero invirtiendo el valor del 0x4A, que es 0XB5 y luego le sumas 1, eso te da 0xB6. Listo!!!!!!!!

Facil verdad.

Ojala te sirva.

Elreypic.

Hola elreypic2, hombre amigo muchísimas gracias; la verdad buscaba cómo hacer esto desde hace mas de 3 días y no encontraba una información precisa y fácil como la que me haz dado. Gracias de verdad!.

Tengo una última duda, he convertido cada valor hexadecimal a decimal de una línea. Para la línea 10+42+00+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00 todos los valores los he convertido a decimal y los he sumado, el resultado de esta suma = 2130 en decimal. Al convertir tal valor a hexadecimal me da = 0x0852, siendo los menos significativos 0x52, su complemento a dos es 0xAD + 0x01= 0xAE... Por lo cual no me ha dado el resultado...

Gracias amigo!

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Calcular el checksum (eeprom interna de un PIC)
« Respuesta #3 en: 24 de Octubre de 2014, 13:23:57 »
Citar
Tengo una última duda, he convertido cada valor hexadecimal a decimal de una línea. Para la línea 10+42+00+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00+FF+00 todos los valores los he convertido a decimal y los he sumado, el resultado de esta suma = 2130 en decimal. Al convertir tal valor a hexadecimal me da = 0x0852, siendo los menos significativos 0x52, su complemento a dos es 0xAD + 0x01= 0xAE... Por lo cual no me ha dado el resultado...

Tu resultado de 2130 decimal es erroneo, ya te muestro por que:

0x10 = 16 decimal
0x42 = 66 decimal
0xFF = 255 decimal
usando los valores en decimal obtenemos que:

16+66+0+0+255+0+255+0+255+0+255+0+255+0+255+0+255+255 = 2122
2122 decimal convertido a Hexadecimal es 0x84A. El resultado debe ser los mismo en cualquier sistema numerico.

16+66+8(255)=82+2040 = 2122.

No veo como es que obtienes el valor de 2130.

Saludos.

Elreypic.

Desconectado cammendoza15

  • PIC10
  • *
  • Mensajes: 7
Re: Calcular el checksum (eeprom interna de un PIC)
« Respuesta #4 en: 24 de Octubre de 2014, 15:42:46 »
Ya ví mi error, yo tomaba el valor 0xFF como 256!, ahora que veo es 255. Por esta razón era que no me daba el cálculo.

Hombre amigo estoy muy agradecido!..
 (((:-)))

Saludos!..

Desconectado ecutronicss

  • PIC10
  • *
  • Mensajes: 1
Re:Calcular el checksum (eeprom interna de un PIC)
« Respuesta #5 en: 12 de Junio de 2017, 18:31:32 »
QUE TAL BUEN DIA SALUDOS
SOY NUEVO EN EL TEMA DE CHECKSUM Y ME SURGE UNA DUDA
COMO SE CALCULA EL COMPLEMENTO (A 2)?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Calcular el checksum (eeprom interna de un PIC)
« Respuesta #6 en: 12 de Junio de 2017, 19:00:53 »
COMO SE CALCULA EL COMPLEMENTO (A 2)?

Negar y sumar 1.

0x2A = 00101010 = 42

Si quisiera sacar el complemento a 2 de ese numero lo haces primero negando y luego sumando 1

Original: 00101010
Negado: 11010101
+1       : 11010110 = 0xD6   <- Tu complemento a 2 esa aca



Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Calcular el checksum (eeprom interna de un PIC)
« Respuesta #7 en: 27 de Junio de 2017, 20:13:55 »
Amigos que utilidad tiene el sacar esos calculos de checksum.  :P 
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Calcular el checksum (eeprom interna de un PIC)
« Respuesta #8 en: 28 de Junio de 2017, 14:01:28 »
Amigos que utilidad tiene el sacar esos calculos de checksum.  :P

Comprobar si existe algun cambio en un dato. Ejemplo tengo 3 datos:

0x59
0x10
0x22

Si los sumo me da:

Suma = 0x8B

Puedo quedarme con este valor o usar el complemento a 2, que seria:

Complemento a 2 de la suma = 0x75

Guardo cualquiera de esos valores lo cual conforma mi cuarto dato o checksum. Para confirmar que esta todo bien procedo de la siguiente forma:

En caso de usar solo la suma:
Sumo los 3 bytes y reviso si me da igual a 0x8B. ¿No es igual? Entonces algun byte cambio cuando no lo deberia hacer.

CORRECTO: 0x59 + 0x10 + 0x22 = 0x8B
INCORRECTO (Cambia el segundo) : 0x59 + 0x20  + 0x22 = 0x9B  distinto de nuestro checksum que es 0x8B, lo cual sabemos que hay un error.

En caso de usar el complemento a 2 de la suma:
Sumo los 3 bytes + el checksum, si es 0 esta todo bien, si es otro numero hay algun error.

CORRECTO:  0x59 + 0x10 + 0x22 + 0x75 = 0x00
INCORRECTO: 0x59 + 0x20 + 0x22 + 0x75 = 0x10 Nuevamente el error en el segundo byte igual que en el caso anterior


Resumen
Como ves la funcionalidad es la misma, un CHECKSUM como su nombre lo indica es una SUMA de COMPROBACIÓN para saber que es correcto lo enviado o almacenado o si sufrio una alteracion imprevista.
Una cosa a notar es que el CHECKSUM te permite discriminar si existio algun error, cambio de bits o no, pero no determinar donde ocurrio el error, por lo cual cuando se trata de un envio de datos que se envia con su checksum, si no coinciden entonces tendras que retransmitir todos los datos de nuevo. O en el caso de una EEPROM, si cambio un dato sea la causa que sea, el CHECKSUM te va a indicar que todo es invalido. Siempre consideramos que ante un cambio hecho por el programa del microcontrolado este va a actualizar correctamente el CHECKSUM, por lo cual siempre se considera en caso de que exista algun cambio de forma externa.
« Última modificación: 28 de Junio de 2017, 14:06:01 por KILLERJC »