Compilador de Núcleo Intel para micricontroladores

Estoy haciendo por mi cuenta un archivo checsum para archivos Intel en Hexadecimal, y tengo algún problema en hacer una suma al infinito para hacer el checsum, lo estoy haciendo con Delphi.

1 Respuesta

Respuesta
1

Yo no conozco Delphi, pero imagino que usas algún algoritmo o rutina para hacer ese Checksum y, más o menos, se podrá entender lo que quieres hacer. En todo caso creo que si alguien te puede ayudar necesitará el código que estás usando para poder ver si hay algo erróneo en él.

Estoy en ello es un algoritmo sencillo, pero al incluir la parte visual de etiquetas los edit para entrdas y salidas me complica la cuestión, cuando tenga algo presentable te lo envío

Pero aun queda mucho por hacer, gracias por tu interés

A ver si puedo hacer algo cuando tengas esbozada la parte algorítmica del algoritmo (quiero decir que seguramente sobre la parte visual a la que te refieres casi seguro que no podré aportar nada).

¡Gracias! la parte visual complica el algoritmo de entradas y salidas de datos

No se como se sube un programa para que tu lo veas, bueno en este caso es una pequeña rutina de suma al infinito ejemplo 2+56+87+49+255 = POR ningún sumando puede ser mayor a 255, bueno luego hay más cosas para terminar el fichero Intel con el cheksum. Gracias por tu interés un saludo

En primer lugar, para subir un "código fuente" a la página lo normal es utilizar la herramienta "snippet" (icono <>). Basta con pegar el código en la ventana que se abre.

No entiendo bien lo de "suma al infinito". La idea que yo tengo del checksum de un fichero es que consiste en la suma de todos los códigos de los octetos/bytes que lo componen. Si se quiere limitar el número de caracteres del checksum (bastante utilizado en protocolos de intercambio paquetes de datos) basta con quedarse con los últimos de esa suma.

Te sugiero que me pases algunos ejemplos (un par de ficheros con sus correspondientes ficheros de checksum)

La suma al infinito es una tendencia, quiere decir que la suma es tan larga como lo es es archivo en hexadecimal de Intel, con un compilador de asm 51 hice un programa lo más reducido posible y saque el algoritmo del Cheksum, aquí te paso un apunte, lo tengo en un archivo *.txt, ¿pero cómo dices que te lo paso?

El                                3E , es el cheksum , es decir verificado para convertir a binario

:04000000B29080FC3E
:00000001FF --
|
|
Cheksum

HEX DEC

B2 - 178
90 - 144
80 - 128
FC - 252
--------
3E


255 - 178 = 77
255 - 144 = 111 +
255 - 128 = 127
255 - 252 = 3
---------
318

Perdona por la indescripcion, ¿tu programas en assembler? Por que yo programo también en asembler, quizás tengas alguna rutina de los timer del núcleo 8051, buenos días.

He programado en el pasado en distintos ensambladores porque ya llevo unos años en el mundo. Pero hace tiempo que no lo hago. En todo caso no he programado en el ensamblador del 8051. He visto que en Internet hay bastante sobre ese ensamblador. Imagino que quieres usar un timer para medir un tiempo y, si no recuerdo mal lo que se hacía en estos casos era "cargar" el timer con un valor, activar el timer y tratar la interrupción que se producía cuando el contador llegaba a cero.
Volviendo al tema de los checksum podría pasarte un Excel con una rutinilla en Visual Basic que calcula el checksum de la cadena hexadecimal que se escriba en la celda A2 dejando el valor del checksum en la celda B2. Esto serviría para asegurarnos de que estamos hablando del mismo concepto de Checksum.

Ahora se mejor como va esto del foro, aquí no se pueden enviar win_rar, así que pierde todo el formato el archivo y en internet no creas que hay tanto del asm 51, todo es publicidad, internet esta cambiando mucho para peor en algunas cosas, yo tengo el compilador asm 51, el que va con la consola de ms_dos, un saludo de Juan

La forma habitual de pasar archivos es subirlos a algún disco en red (en mega, google drive o la página que sea) y poner en la página el enlace.

No sé si puedo hacer algo por ti, pero puedes intentarlo.

No entiendo eso de subir la página a un servidor, me lo puedes explicar . Encontré una función que convierte decimal en hexadecimal pero la inversa tengo que hacerla de otra forma, gracias

No digo "subir la página a un servidor" sino subir el archivo o archivos a una página dedicada a esta función de "disco en red" (que haría de servidor, lo que se suele llamar la "nube") y poner aquí el enlace que permite descargarse el archivo. Para hablar de algo concreto aquí puedes encontrar el archivo Excel del que hablaba más arriba:

https://drive.google.com/open?id=1TitKqZlPNXEn9IDxAONnqYmQ-qARU0Eo 

Convertir decimal en hexadecimal y viceversa no debe ser ningún problema.

Encontré una función que convierte decimal a hexadecimal, lo que no encuentro es la inversa, pero ya convierto y obtengo el cheksum del archivo intel, te paso un *.txt, gracias por tu interés,

Porque no te registras en una página foro que se llama Delphi y te puedo enviar archivos .

:10000000 02 00 03 75 90 00 12 00 11 75 90 FF 12 00 11 80 1C
:0E001000F27A7F79FF78FFD8FED9FADAF6226D ---
:00000001FF                                               |---> SALIDA CHEKSUM
// Da la salida del cheksum en Hexadecimal
 HEX | DEC | 
------------------  2+0+3+117+144+0+18+0+17+117+144+255+18+0+17+128 = 28
02 - 02 -> F9
00 - 00 -> F8
03 - 03 -> F4
75 - 117 -> 7E
90 - 144 -> ED
00 - 00 -> EC
12 - 18 -> D9
00 - 00 -> D8
11 - 17 -> C6 
75 - 117 -> 50
90 - 144 -> BF 
FF - 255 -> BF
12 - 18 -> AC
00 - 00 -> AB
11 - 17 -> 99
80 - 128 -> 18
---------------------------------------------------------------------------
// Algoritmo del archivo Intel
procedure TForm1.FormDestroy(Sender: TObject);
begin
  Convirtiendo.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var  a, e,f,i, suma, Numero, n1, n2 : Integer;
begin
  a := StrToInt(codigo.Text);            // Introduzco el codigo en decimal en a
  suma:= 255 - StrToInt(codigo.Text);    // Resto 255 a todos los codigos hexadecimales y lo guarda en suma
  if a >  256 then exit;                 // Si algun codigo es mayor de 255 , NO lo procesa
  e:= StrToInt(calculo.Text)+ suma;      // Va sumando los codigos y los guarda e
  if e > 256 then
  e:= StrToInt(calculo.Text)+ suma - 256;// Cuando la suma supera el Limite de 255 , resta 256
  calculo.Text := IntToStr(e);           // Salida del Cheksum por un Edit
  codigo.Text := IntToHex(StrToInt(calculo.Text), 6);
  Edit1.Text := IntToHex(StrToInt(calculo.Text)+a, 6); // Da la salida del cheksum en Hexadecimal
  codigo.SetFocus;
end;
procedure TForm1.borrarClick(Sender: TObject);
begin
codigo.Clear;
calculo.Clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
     Label1.Caption := 'Son las  ' + TimeToStr(Time);
end;
end.

No entiendo lo que pones. Parece que se trata de calcular el checksum de esta serie hexadecimal:

02 00 03 75 90 00 12 00 11 75 90 FF 12 00 11 80

Y, por un lado, parecería ser (supongo que según tu propio algoritmo y no en una suma normal, que daría 980):

2+0+3+117+144+0+18+0+17+117+144+255+18+0+17+128 = 28 = 0x1C

Lo que explicaría el 1C que aparece tras la serie. Pero luego, en lo que parece el cálculo paso a paso, el resultado final es 18 (y parece que ya en hexadecimal). Tampoco entiendo como se van haciendo los checksum parciales, por ejemplo el:

02 - 02 -> F9

porque 255 - 2 = 253 = 0xFD y no 0xF9. Y tampoco entiendo como los nulos incrementan el checksum.

Se me olvidó comentar un par de cosas:

1. ¿Qué significan las líneas:

:0E001000F27A7F79FF78FFD8FED9FADAF6226D ---
:00000001FF 

2. Mi algoritmo de cálculo de checksum (el que figura en el archivo Excel cuyo enlace te pasé y que obliga a usar una rutinilla de VB que lleva dentro) obtiene para esa serie el valor 0xD4 (resultado de dividir la suma, 980, entre 256 y obtener el resto, que son 212, en hexadecimal D4)

El algoritmo esta verificado y funciona por que estoy cargando programas en la Flash de un 8051, el cheksum no es una suma normal es un algoritmo para el que hice la herramienta lo que ocurre que ahora tengo que meterlos a mano en mi herramienta, ahora tengo que abrir el archivo intel *.hex y que se haga automatizado, necesito hacer controladores o drivers y lo tengo fastidiado, te paso un cheksum más sencillo a ver si ves el algoritmo, esta bastante claro la documentación que te voy a pasar

:04000000 B2 90 80 FC 3E 
:00000001FF            |--------< Es el checksum
HEX DEC
--- ---
B2 - 178
90 - 144
80 - 128
FC - 252
--------
3E
255 - 178 = 77 ----------------> 4D
255 - 144 = 111  + ------------> BC
255 - 128 = 127 ---------------> 3B
255 - 252 = 3   --------------->  3
          ---------
        318
          - 256
      ---------
             62 CHEKSUM ------> 3E 

Las series hexadecimales o líneas como llamas tu, son los códigos intel que luego se convierten a binario y entran en el procesador para ejecutar l programa, un saludo de Juan.

¿Tu qué tienes Visual Basic?

El checksum es el algoritmo de control de errores más simple de todos los utilizados (otros son, por ejemplo, el CRC o redundancia cíclica polinomial o la paridad), porque calcula un único octeto de control para cualquier serie de octetos, sea la serie de la longitud que sea. Aunque su nombre llevaría implícito el hecho de que se obtuviera a partir de la "suma" de todos los octetos de la serie, lo verdaderamente importante es que el algoritmo utilizado por el "generador/emisor" del octeto/byte de control sea idéntico al algoritmo utilizado por el "comprobador/receptor". Si se decide que antes de hacer la suma cada octeto se sustituya por 255 menos el valor del octeto es tan válido como mantener el valor original. Pero yo creo que este sistema no asegura que la suma final no pueda valer cantidades como, por ejemplo, 5528, en cuyo caso no valdría con restarle 256 para dejarlo en un valor de un solo octeto. Es más razonable que la última operación sea calcular el resto de la división por 256 y codificarlo en hexadecimal. A no ser que apliques la regla de restarle 256 siempre que la suma parcial supere los 256 (que es lo que creo que haces en la instrucción comentado como "Cuando la suma supera el Limite de 255, resta 256"). Pero la regla que te sugiero (regla del resto de la división entre 256), que es la que siempre se ha utilizado, evita ese paso extra intermedio.

Actualmente programo en java, C/C++ o incluso en Clipper, pero lo hago muy de vez en cuando. Y en VB cuando quiero algo aplicable en Excel como es el caso de la hoja que te dejé en Google Drive y que acabo de actualizar para que trabaje con tu algoritmo:

https://drive.google.com/open?id=1jFsrfZj6ALa2b3gl0j7m5h-mcQDXMx3Q 

Bueno yo no estoy descubriendo las américas, solo hago un trabajo para calcular el cheksum, y si lo utiliza Intel el lgoritmo es que funciona bien, bueno una trabajo cuando te lo dan echo parece que no es nada, pero sacar el algoritmo me llevo muchas horas, de todos modos gracias por compartir este tiempo, el resultado de los dos últimos dígitos hexadecimales siempre tiene que ser el que cumpla el algoritmo, un saludo de Juan .

Bien. Tienes razón, no se trata de descubrir las Américas. He visto alguna información sobre el cálculo del checksum en los archivos de Intel (por ejemplo en https://en.wikipedia.org/wiki/Intel_HEX ) y no parece encajar con tu algoritmo. Pero tu consulta iba sobre algún problema al calcular en Delphi ese checksum, de modo que si quieres volvemos a ese punto de partida (o lo dejamos estar, claro)

¡Gracias! Esta verificado que el cheksum es así como te digo, tengo la herramienta que hice funcionando y meto los códigos que genero del compilador asm51 y me sale el cheksum, si estuvieses en el https://www.lawebdelprogramador.com, te pasaria el programa para que lo verificases y quedases tranquilo, el problema que tengo ahora es que necesito convertir hexadecimal a decimal y no tengo ninguna funcion .No se como voy hacerlo a pensar, asi que un saludo de Juan

¡Gracias! Hola buenos días, no me sirve porque mi delphi es el 4 y no tiene esa función, pero llevan convirtirendo hexadecimal a decimal en delphi tantos años como más o menos 25. Estoy buscando una forma diferente de hacerlo con otras funciones, ya lo encontrare espero, hay mucho que hacer, también tengo que entrar en el archivo intel, abrirlo y separar los dígitos todo por programa, así que tengo aun mucho trabajo, gracias, ¿te interesa un delphi 3?

Como he dicho desde el principio no uso Delphi, pero sin conocer el lenguaje estoy casi seguro de que lo que aparece en la página cuyo enlace te he facilitado y que copio aquí:

function HexToInt(const Value: String): Integer;
begin 
  Result := StrToInt('$' + Value);
end;

Es la definición de una función "de usuario" (HexToInt) que, a su vez, utiliza una función (que esa ya debe existir) StrToInt que convierte una cadena en un entero. Por tanto bastaría preceder del símbolo "$" a la cadena hexadecimal para que la función StrToInt lo convierta a entero (decimal). ¿Me estás diciendo que tu Delphi 4 no tiene la función StrToInt?

Si ese fuera el caso también podrías usar la otra opción:

function HextoInt(HexStr:string):integer;
const Hex : array['A'..'F'] of integer = (10,11,12,13,14,15);
var 
    i   : integer;
begin 
  Result:=0;
  for i := 1 to Length(HexStr) do 
    if HexStr[i] < 'A' then Result := Result * 16 + Ord(HexStr[i]) - 48
                       else Result := Result * 16 + Hex[HexStr[i]];
end;

que parece ir tratando la cadena hexadecimal dígito a dígito según el algoritmo "manual" de conversión de una base a otra.

Mi opinión, respecto a los diferentes lenguajes de programación, es que, básicamente, todos sirven para todo aunque se dice, por ejemplo, que C/C++ es más eficaz cuando hay que tratar con punteros a direcciones de memoria. Por tanto no considero necesario, para mí mismo, conocer más lenguajes de los que ya conozco. Estoy seguro que yo podría hacer en C/C++ cualquier programita que consiga lo que estás intentando en Delphi. Y tampoco soy un experto en C/C++

En resumen, que no sé muy bien cuál es tu problema y, por tanto, seguramente no estoy en situación de echarte una mano.

¡Gracias! No hay ningún problema no quiero que te molestes por un programa que a fin de cuentas no va contigo en absoluto, no te enfades conmigo hombre, un saludo Juan

Descuida, que no me enfado en absoluto. Si puede dar esa impresión será porque no me he expresado bien. Ha sido un placer tratar contigo.

¡Gracias!  estoy buscando la forma de asignar a un Edit una cadena y el compilador se queja , ya se donde buscar , hay que crear una clase y asignarlo a edit .

¡Gracias! Ya encontré la solución ya puedo convertir Hexadecimal en decimal, ¿era más fácil de lo que pensaba . Tu estas haciendo ese trabajo con la hoja de calculo?

Hice una hoja para eso hace años pero en realidad la calculadora de Windows ya lo hace, de modo que tampoco tenía demasiada utilidad

¡Gracias! Que no te dige nada de las funciones por que estab muy liado, pero te lo agradezco, aunque no me sirvan por que mi Delphi es el 4, estoy pensando en actualizarlo, pero es una pasta y hay que mirarlo bien . vaya tormenta que cae aquí en Gijón ahora mismo, hasta mañana

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas