Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Editar un buffer (https://www.clubdelphi.com/foros/showthread.php?t=55549)

JoseFco 20-04-2008 02:28:52

Editar un buffer
 
"Tolomeo se mudo al Polo Norte"

JoseFco 20-04-2008 03:52:32

"Tolomeo se mudo al Polo Norte"

eduarcol 20-04-2008 13:51:33

yo pienso que es un dbGrid conectado a una tabla, y que al hacer click sobre el registro abre una pantalla asociada a esta tabla que permite editar el registro activo, o sea, el que esta seleccionado en el grid.

Pero esto es pura suposicion ya que no se mucho de IntelHEx

JoseFco 20-04-2008 14:04:37

"Tolomeo se mudo al Polo Norte"

eduarcol 20-04-2008 14:09:29

Cita:

Empezado por JoseFco (Mensaje 281265)
Hola eduarcol.

Gracias por la respuesta.tendre que buscarme el dbGrid entonces, porque en el delphi 7 este solo tengo StringGrid y DrawGrid.
Ya tengo tarea para hoy con el DbGrid entonces. A San Google entonces.

Un Saludo.

busca una en delphi una pestaña que se llama datacontrols ;)

JoseFco 20-04-2008 15:57:42

"Tolomeo se mudo al Polo Norte"

JoseFco 20-04-2008 16:34:40

"Tolomeo se mudo al Polo Norte"

xEsk 20-04-2008 19:08:24

No sé yo si el DbGrid es realmente el que necesitas eh! Ya que el DbGrid sirve para mostrar datos de una base de datos.

Creo que con el StringGrid ibas bien.

Saludos.

JoseFco 20-04-2008 21:49:09

"Tolomeo se mudo al Polo Norte"

JoseFco 20-04-2008 22:18:08

"Tolomeo se mudo al Polo Norte"

JoseFco 21-04-2008 02:14:14

"Tolomeo se mudo al Polo Norte"

JoseFco 21-04-2008 04:41:01

"Tolomeo se mudo al Polo Norte"

Dedalo 21-04-2008 14:07:23

Yo eso lo solucioné con un StringGrid.

El fuente de la ventana que manipula los datos es el siguiente:

Cita:

unit VerDatos;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, StdCtrls, Buttons, ExtCtrls, Pic16f84;

type
TFverDatos = class(TForm)
Panel6: TPanel;
BBcancelar: TBitBtn;
BBaceptar: TBitBtn;
Panel3: TPanel;
Panel1: TPanel;
SGeprom: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure BBaceptarClick(Sender: TObject);
procedure BBcancelarClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
Pic:^Tpic;
public
procedure Entrar(var PicRef:TPic);
end;

implementation
{$R *.DFM}

procedure TFverDatos.FormCreate(Sender: TObject);
var
i:Integer;
begin
for i:=0 to 3 do SGeprom.cells[0,i]:=IntToHex(i*16,2);
end;

procedure TFverDatos.Entrar(var PicRef:TPic);
var
i,j:Integer;
begin
Pic:=@PicRef;
for i:=0 to 3 do for j:=0 to 15 do SGeprom.cells[j+1,i]:=IntToHexPic.MemDatos[i*16+j],2);
Show;
end;

procedure TFverDatos.BBaceptarClick(Sender: TObject);
var
i,j,k:Integer;
begin
for i:=0 to 3 do for j:=0 to 15 do Val('$'+SGeprom.cells[j+1,i],Pic.MemDatos[i*16+j],k);
end;

procedure TFverDatos.BBcancelarClick(Sender: TObject);
begin
Close;
end;

procedure TFverDatos.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

end.
Esta hecho para ver la tabla de datos de la eprom del PIC16F84, pero aumentando los numeros vale para cualquier tabla de datos en hexadecimal.

FGarcia 21-04-2008 16:43:21

Hola!
Esto me parecio interesante:

Código:

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, StdCtrls, Buttons, ExtCtrls, Pic16f84;

esa unidad como ¿la conseguiste o creaste para añadirla a Delphi?

Gracias.

Dedalo 21-04-2008 19:11:21

Cita:

Empezado por FGarcia (Mensaje 281442)
Hola!
Esto me parecio interesante:

Código:

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, StdCtrls, Buttons, ExtCtrls, Pic16f84;

esa unidad como ¿la conseguiste o creaste para añadirla a Delphi?

Gracias.

la hice yo. En realidad me hice todo, pondré el programa completo por trocitos para no llenar el hilo con codigo.

JoseFco 21-04-2008 23:58:35

"Tolomeo se mudo al Polo Norte"

JoseFco 22-04-2008 01:16:44

"Tolomeo se mudo al Polo Norte"

Dedalo 22-04-2008 08:37:23

Este es el fichero PIC16F84.pas. Es el que cambio en el compilador al cambiar de procesador. Tengo varios, segun el procesador para el que vaya a compilar.


Código Delphi [-]
unit Pic16F84;
interface
uses SysUtils;
type
 Tpic = Record
  MemPrograma:array[0..1023] of Word;
  MemDatos:array[0..63] of Word;
  Id:array[0..3] of Word;
  Configuracion:Word;
  MemProgramaOk:Boolean;
  MemDatosOk:Boolean;
  ConfiguracionOk:Boolean;
 end;
const
 LoadConfiguration  = 0;
 Desconocido1   = 1;
 LoadProgramMemory  = 2;
 LoadDataMemory   = 3;
 ReadProgramMemory  = 4;
 ReadDataMemory   = 5;
 IncrementAddress  = 6;
 Desconocido7   = 7;
 BeginEraseProgramming = 8;
 BeginProgrammingOnly = 24;
 BulkEraseProgram  = 9;
 BulkEraseData   = 11;
function ConvierteToken(Token:String):Integer;
function DecodificaInstruccion(Opcode:Word):String;
function ParametrosInstruccion(Instruccion:String):Integer;
implementation
function ConvierteToken(Token:String):Integer;
begin
// Tokens propios del procesador
 if UpperCase(Token)=  'CLRW'   then Result := $0100
 else if UpperCase(Token)= 'CLRWDT' then Result := $0064
 else if UpperCase(Token)= 'NOP'    then Result := $0000
 else if UpperCase(Token)= 'RETURN' then Result := $0008
 else if UpperCase(Token)= 'RETFIE' then Result := $0009
 else if UpperCase(Token)= 'SLEEP'  then Result := $0063
 else if UpperCase(Token)= 'OPTION' then Result := $0062
 else if UpperCase(Token)= 'TRIS'   then Result := $0060
 else if UpperCase(Token)= 'MOVWF'  then Result := $0080
 else if UpperCase(Token)= 'CLRF'   then Result := $0180
 else if UpperCase(Token)= 'ADDLW'  then Result := $3E00
 else if UpperCase(Token)= 'ANDLW'  then Result := $3900
 else if UpperCase(Token)= 'IORLW'  then Result := $3800
 else if UpperCase(Token)= 'MOVLW'  then Result := $3000
 else if UpperCase(Token)= 'RETLW'  then Result := $3400
 else if UpperCase(Token)= 'XORLW'  then Result := $3A00
 else if UpperCase(Token)= 'SUBLW'  then Result := $3C00
 else if UpperCase(Token)= 'CALL'   then Result := $2000
 else if UpperCase(Token)= 'GOTO'   then Result := $2800
 else if UpperCase(Token)= 'ADDWF'  then Result := $0700
 else if UpperCase(Token)= 'ANDWF'  then Result := $0500
 else if UpperCase(Token)= 'COMF'   then Result := $0900
 else if UpperCase(Token)= 'DECF'   then Result := $0300
 else if UpperCase(Token)= 'DECFSZ' then Result := $0B00
 else if UpperCase(Token)= 'INCF'   then Result := $0A00
 else if UpperCase(Token)= 'INCFSZ' then Result := $0F00
 else if UpperCase(Token)= 'IORWF'  then Result := $0400
 else if UpperCase(Token)= 'MOVF'   then Result := $0800
 else if UpperCase(Token)= 'RLF'    then Result := $0D00
 else if UpperCase(Token)= 'RRF'    then Result := $0C00
 else if UpperCase(Token)= 'SUBWF'  then Result := $0200
 else if UpperCase(Token)= 'SWAPF'  then Result := $0E00
 else if UpperCase(Token)= 'XORWF'  then Result := $0600
 else if UpperCase(Token)= 'BCF'    then Result := $1000
 else if UpperCase(Token)= 'BSF'    then Result := $1400
 else if UpperCase(Token)= 'BTFSC'  then Result := $1800
 else if UpperCase(Token)= 'BTFSS'  then Result := $1C00
// Tokens del compilador (iguales para cualquier procesador)
 else if UpperCase(Token)= 'EQU'    then Result := -2
 else if UpperCase(Token)= 'ORG'    then Result := -3
 else if UpperCase(Token)= 'DB'     then Result := -4
 else if UpperCase(Token)= 'END'    then Result := -5
 else Result:=-1;
end;
function DecodificaInstruccion(Opcode:Word):String;
var
 d,f,b,k,kl:String;
begin
 Result:='???';
 f:='$'+IntToHex(Opcode and $7F,2);
 if (Opcode and $80)=0 then d:='W' else d:='F';
 b:='$'+IntToHex((Opcode shr 7) and $7,1);
 k:='$'+IntToHex(Opcode and $ff,2);
 Kl:='$'+IntToHex(Opcode and $7ff,2);
 case Opcode shr 7 of
  $01      :Result:='MOVWF '+ f;
  $02      :Result:='CLRW';
  $03      :Result:='CLRF '+ f;
  $04,$05  :Result:='SUBWF '+ f+','+d;
  $06,$07  :Result:='DECF '+ f+','+d;
  $08,$09  :Result:='IORWF '+ f+','+d;
  $0A,$0B  :Result:='ANDWF '+ f+','+d;
  $0C,$0D  :Result:='XORWF '+ f+','+d;
  $0E,$0F  :Result:='ADDWF '+ f+','+d;
  $10,$11  :Result:='MOVF '+ f+','+d;
  $12,$13  :Result:='COMF '+ f+','+d;
  $14,$15  :Result:='INCF '+ f+','+d;
  $16,$17  :Result:='DECFSZ '+ f+','+d;
  $18,$19  :Result:='RRF '+ f+','+d;
  $1A,$1B  :Result:='RLF '+ f+','+d;
  $1C,$1D  :Result:='SWAPF '+ f+','+d;
  $1E,$1F  :Result:='INCFSZ '+ f+','+d;
  $20..$27 :Result:='BCF '+ f+','+b;
  $28..$2F :Result:='BSF '+ f+','+b;
  $30..$37 :Result:='BTFSC '+ f+','+b;
  $38..$3F :Result:='BTFSS '+ f+','+b;
  $40..$4F :Result:='CALL '+ kl;
  $50..$5F :Result:='GOTO '+ kl;
  $60..$67 :Result:='MOVLW '+ k;
  $68..$6F :Result:='RETLW '+ k;
  $70,$71  :Result:='IORLW '+ k;
  $72,$73  :Result:='ANDLW '+ k;
  $74,$75  :Result:='XORLW '+ k;
  $76,$77  :Result:='???';
  $78..$7B :Result:='SUBLW '+ k;
  $7C..$7F :Result:='ADDLW '+ k;
  $00:
  begin
   if (Opcode and $3FF8)=$060 then
          begin
    Result:='TRIS '+IntToHex(Opcode and 7,2);
    Exit;
   end;
       case Opcode of
    $000,$020,$040,$060:Result:='NOP';
    $064:Result:='CLRWDT';
    $009:Result:='RETFIE';
    $008:Result:='RETURN';
    $063:Result:='SLEEP';
    $062:Result:='OPTION';
   end;
  end;
 end;
end;
function ParametrosInstruccion(Instruccion:String):Integer;
begin
 case ConvierteToken(Instruccion) of
  $0100,$0064,$0000,$0008,$0009,$0063,$0062: Result:=0; // Sin Operandos
  $0060: Result:=1;     // 0 <= f <= 7
  $0080,$0180: Result:=2;     // 0 <= f <= 127
  $3E00,$3900,$3800,$3000,$3400,$3A00,$3C00: Result:=3; // 0 <= k <= 255
  $2000,$2800: Result:=4;     // 0 <= k <= 2047
  $0700,$0500,$0900,$0300,$0B00,$0A00,$0F00,$0400,$0800,
  $0D00,$0C00,$0200,$0E00,$0600: Result:=5;  // 0 <= f <= 127 y W ó F
  $1000,$1400,$1800,$1C00: Result:=6;   // 0<= f <= 128 / 0 <= b <= 7
  else Result:=-1;
 end;
end;
end.

FGarcia 23-04-2008 17:08:39

Gracias por la informacion Dedalo. Lo voy a estudiar para continuar aprendiendo.

JoseFco 23-04-2008 22:37:05

"Tolomeo se mudo al Polo Norte"

JoseFco 24-04-2008 01:12:12

"Tolomeo se mudo al Polo Norte"

MaMu 24-04-2008 05:50:30

La variable k, sobra.
De 0 a 15 deberia ser lo mismo que de 0x0000 a 0x000F y vos lo que estas haciendo, es llenar una columa con el final de la cuenta de 0 a 15, entonces,
0x0000 a 0x000F que sigue? 0x0010, y ahi te empieza a escribir. El procedimiento esta "alrevez".

Saludos

MaMu 24-04-2008 05:53:45

Te diste cuenta?, mira la corrección, es muy sencillo.

Código Delphi [-]

procedure TForm1.InicializaGridBuffer;
var  i,j,k,l: integer;
begin
  StringGrid1.ColWidths[0] := 35;
  StringGrid1.Cells[0,0] := 'Addr';
  j := $0000;  l := $0000;
  for i := 0 to 15 do
    StringGrid1.Cells[i+1,0] := IntTohex(i,2);
  for j := 0 to (BufferSize div 16)-1 do    // (BufferSize div 16)
    begin
      k := j;
      StringGrid1.Height := StringGrid1.Height + 1;
      StringGrid1.RowCount := StringGrid1.RowCount + 1;
      StringGrid1.Cells[0,k+1] := IntToHex(l,4);
      l := l + 16;  //Porque?, arranco de 0000 primero
    end;
end;

Saludos

JoseFco 24-04-2008 22:20:24

"Tolomeo se mudo al Polo Norte"

Dedalo 24-04-2008 22:49:30

Para tratar una serie de 0 a 4095 no hagas dos bucles, haz uno solo.

Código Delphi [-]
 
for j:=0 to 4095 do
begin
 Fila:=j mod 16
 columna:= j div 16
 StringGrid1.Cells[columna,fila] := IntToHex(Buffer[j],2);
end:

Asi no pierdes ni uno solo de los valores ni repites ninguno.

Dedalo 24-04-2008 22:55:17

Por cierto, para llenar el memo lo haces cuando la pasada lo piad, al final de cada grupo de 16.

Código Delphi [-]
 
for j:=0 to 4095 do
begin
 Fila:=j mod 16
 columna:= j div 16
 if Fila=0 then Str:= IntToHex(j,4); // empieza una fila nueva
 StringGrid1.Cells[columna,fila] := IntToHex(Buffer[j],2);
 if Fila=15 then Memo1.Lines.Add(Str); // se acaba una fila, al memo
end:

JoseFco 24-04-2008 22:55:20

"Tolomeo se mudo al Polo Norte"

JoseFco 24-04-2008 23:16:00

"Tolomeo se mudo al Polo Norte"

MaMu 25-04-2008 06:21:17

Cita:

Empezado por JoseFco (Mensaje 282442)
Hay algo que no entiendo bien.
Me dices que no haga doble bucles. te refieres a que no ponga el addres primero y despues intente llenar el resto del stringgrid con la data.En otra rutina por separado.?

Un Saludo.

Es exactamente lo que te esta sugiriendo, si analizas el bucle contempla todos los numeros y nunca los repetiras.

Saludos

Dedalo 25-04-2008 11:16:49

Cita:

Empezado por MaMu (Mensaje 282485)
Es exactamente lo que te esta sugiriendo, si analizas el bucle contempla todos los numeros y nunca los repetiras.

Saludos

:D:D:D:D:D

JoseFco 25-04-2008 22:49:39

"Tolomeo se mudo al Polo Norte"

JoseFco 25-04-2008 22:59:28

"Tolomeo se mudo al Polo Norte"

MaMu 25-04-2008 23:31:30

Pero no entiendo cual es la duda.
de 0 a 4095 son 4096 posiciones, en el bucle, carga fila/columa aplicando un mismo valor de j, es decir, de posición. Si el incremento llega a un valor de palabra de 0x000F entonces agrega la linea al Memo.
El hecho de usar un solo bucle y no dos, es simplemente para mejorar el procedimiento, porque sino que harias? rellenas todas las columnas y cuando tenes las columnas empezas a cargar una a una las filas, para que? si se puede hacer de un tirón, sin miedo de repetir numeros.
Siempre tenes que saber como esta formado el mapa de memoria, y miralo como una matriz de fila por columna, sabiendo eso, son los parámetros que necesitas modificar, asi como el ancho de la palabra (en bytes).

Saludos

JoseFco 26-04-2008 03:05:19

"Tolomeo se mudo al Polo Norte"

MaMu 26-04-2008 17:34:47

Cita:

...se me ocurrio que en vez de un memo se ve mas elegante en un stinggrid. Pero que mi data no todo el tiempo va a ser del mismo peso que la memoria del chip que programare y tendre que rellenar ese espacio con 00h.

En realidad podés considerar que tu firmware "si" ocupa toda la memoria.
No se que uC estás programando, ya que de eso depende las características del mapa de memoria, forma de escritura, etc. Pero te pongo un ejemplo con un uC Pic. El programa puede considerarse que ocupa toda la memoria, puesto a que, donde finaliza la data real del firmware, dicho código escribe un dato de nulidad o conjunto vacío. En el caso de un Pic, (3FFFh=vacío). Por lo que borrar un chip, en el caso de un Pic, es lo mismo que decir, escribir 3FFFh a toda la matriz de memoria de programa, y 00h a cada direccion de la EEPROM.
Para resolver esto y que lo vuelques de forma elegante en un StringGrid, que me parece una idea exelente, y de hecho programas como el ICProg lo hacen asi, hay que analizar la situacion de la siguiente forma:

1) Determinar la estructura de la matriz del mapa de memoria del uC.
2) Determinar la estructura de la matriz que ocupa en memoria los datos.

Sabiendo estos 2, solo resta hacer la lógica

Pseudocódigo

Cita:

MiMatrizUC = La capacidad de mi uC
MiPrograma = Lo que ocupa mi programa
entonces
Sabiendo lo que ocupa mi programa
Mientras haya datos
rellenar grid con datos
si no hay datos, poner blanco
hasta que mi uC no tenga más capacidad.
Espero que esto pueda darme una idea más clara.

Saludos

JoseFco 26-04-2008 17:56:31

"Tolomeo se mudo al Polo Norte"

Dedalo 26-04-2008 22:37:37

Atencion, pregunta, ¿porque vas a guardar en un fichero IntelHex 4Kb de codigo si solo son utiles unos pocos cientos de bytes? ¿es posible grabar solo una parte del chip? ¿Seria mas comodo un StringGrid mas pequeño que 4096 celdas?. Yo hice algo parecido para un PIC y tenia una solucion, el resto de la memoria no ocupada por el programa efectivo no lo llenaba con ceros, simplemente lo dejaba en blanco, es decir, a 3FFF. Asi puedes reconocer donde esta el limite del codigo activo y fijar un limite superior para los bucles de grabacion y de volcado a un fichero IntelHex o para grabar el micro o crear el StringGrid que va a contener los datos.

JoseFco 26-04-2008 23:40:23

"Tolomeo se mudo al Polo Norte"

JoseFco 26-04-2008 23:53:05

"Tolomeo se mudo al Polo Norte"

JoseFco 27-04-2008 01:07:46

"Tolomeo se mudo al Polo Norte"


La franja horaria es GMT +2. Ahora son las 14:40:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi