 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
wfsistem Novato

Registrado: Sábado, 15 de Julho de 2017 Mensagens: 6
|
Enviada: Sáb Jul 15, 2017 11:34 pm Assunto: dsPIC Bootloader |
|
|
Olá pessoal, tenho uma aplicação que ja se comunica com a placa,
dsPIC33 microchip e ja faz todos os processos,
agora estou querendo fazer o bootloader dele..
Alguem tem ai ou sabe como fazer?
Ler o arquivo .hex e converter!!!
Abraços e obrigado |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Jul 18, 2017 2:46 pm Assunto: Re: dsPIC Bootloader |
|
|
wfsistem escreveu: | Olá pessoal, tenho uma aplicação que ja se comunica com a placa,
dsPIC33 microchip e ja faz todos os processos,
agora estou querendo fazer o bootloader dele..
Alguem tem ai ou sabe como fazer?
Ler o arquivo .hex e converter!!!
Abraços e obrigado |
Voce vai precisar de:
1º manual do fabricante da placa
2º programa sniffer
3º alguns conhecimento extra sobre os arquivos hex
assim:
1º com o nanual pode ver algumas caracteristica o qual te permita elaborar aplicação de comunicação eficiente seguindo os padrões sugerido pelo manual
2º usar sniffer será uma coisa fundamental para entender como funciona a risca a comunicação entre a aplicação que você possui e a placa.
3º vai precisar enteder o que os arquivos hex representa para placa. pode dá uma olhada no link abixo para uma melhor ideia:
https://en.wikipedia.org/wiki/Intel_HEX#Record_types
Na grande maioria os arquivo hex nada mais é que linhas de comando "programa" normalmente em C, podendo ser tb Pascal que são convertido em arquivo Hex para que possa ser gravado nas placa através de uma gravadora.
Os arquivos Hex não são armazenado na memoria da placa e sim gravado na mesma pois neste mesmo arquivo possui os endereço onde cada linhas será gravada nesta mesma memoria.
Assim na memoria destas placa não possui arquivos e si, mas há códigos gravado na mesma e que o bootloader faz, nada mais é que ler os valores destes endereço e converter hex decimal e salvar-lo em um arquivo.
atente em da uma espiada no link
http://www.microchip.com/forums/m818756.aspx _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
wfsistem Novato

Registrado: Sábado, 15 de Julho de 2017 Mensagens: 6
|
Enviada: Qua Jul 19, 2017 12:06 am Assunto: Re: dsPIC Bootloader |
|
|
strak2012 escreveu: | wfsistem escreveu: | Olá pessoal, tenho uma aplicação que ja se comunica com a placa,
dsPIC33 microchip e ja faz todos os processos,
agora estou querendo fazer o bootloader dele..
Alguem tem ai ou sabe como fazer?
Ler o arquivo .hex e converter!!!
Abraços e obrigado |
Voce vai precisar de:
1º manual do fabricante da placa
2º programa sniffer
3º alguns conhecimento extra sobre os arquivos hex
assim:
1º com o nanual pode ver algumas caracteristica o qual te permita elaborar aplicação de comunicação eficiente seguindo os padrões sugerido pelo manual
2º usar sniffer será uma coisa fundamental para entender como funciona a risca a comunicação entre a aplicação que você possui e a placa.
3º vai precisar enteder o que os arquivos hex representa para placa. pode dá uma olhada no link abixo para uma melhor ideia:
https://en.wikipedia.org/wiki/Intel_HEX#Record_types
Na grande maioria os arquivo hex nada mais é que linhas de comando "programa" normalmente em C, podendo ser tb Pascal que são convertido em arquivo Hex para que possa ser gravado nas placa através de uma gravadora.
Os arquivos Hex não são armazenado na memoria da placa e sim gravado na mesma pois neste mesmo arquivo possui os endereço onde cada linhas será gravada nesta mesma memoria.
Assim na memoria destas placa não possui arquivos e si, mas há códigos gravado na mesma e que o bootloader faz, nada mais é que ler os valores destes endereço e converter hex decimal e salvar-lo em um arquivo.
atente em da uma espiada no link
http://www.microchip.com/forums/m818756.aspx |
Grande strak2012, então, tenho o manual do bootloader.
Arquivos e comandos, porem o problema maior esta
CRC H e CRC L
Consigo conectar e ver a versão do bootloader
Consigo Limpar a flash
Leio o .hex normal
pego de 10 em 10 linhas e faço a conversão
e ja coloco o valido SOH / DLE / EOT
Mais o CRC H e CRC L que esta pegando aqui!
Abraços e obrigado! |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
|
Voltar ao Topo |
|
 |
wfsistem Novato

Registrado: Sábado, 15 de Julho de 2017 Mensagens: 6
|
Enviada: Qua Jul 19, 2017 5:30 pm Assunto: |
|
|
Será que conseguimos converter
static const unsigned short crc_table[16] =
{
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};
/****************************************************************************
* Update the crc value with new data.
*
* \param crc The current crc value.
* \param data Pointer to a buffer of \a data_len bytes.
* \param len Number of bytes in the \a data buffer.
* \return The updated crc value.
*****************************************************************************/
unsigned short CalculateCrc(char *data, unsigned int len)
{
unsigned int i;
unsigned short crc = 0;
while(len--)
{
i = (crc >> 12) ^ (*data >> 4);
crc = crc_table[i & 0x0F] ^ (crc <<4>> 12) ^ (*data >> 0);
crc = crc_table[i & 0x0F] ^ (crc << 4);
data++;
}
return (crc & 0xFFFF);
}
é em C...
um bootloader que funciona na dsPIC hj... mais é em visual studio 2008.... |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qua Jul 19, 2017 8:00 pm Assunto: |
|
|
Consigo converter sim, deixa eu arrumar um tempinho livre aqui que converto isso rápido. _________________ Tudo podemos quando tudo sabemos!
Editado pela última vez por strak2012 em Qua Jul 19, 2017 9:54 pm, num total de 1 vez |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qua Jul 19, 2017 8:51 pm Assunto: |
|
|
segue a conversão:
Código: | const
crc_table: array [0 .. 15] of word = (
$0000, $1021, $2042, $3063, $4084, $50A5, $60C6, $70E7,
$8108, $9129, $A14A, $B16B, $C18C, $D1AD, $E1CE, $F1EF);
function CalculateCrc(data: array of byte): word;
var
i, p: integer;
crc: word;
begin
crc := 0;
for p := Low(data) to High(data) do
begin
i := (crc shr 12) xor (data[p] shr 4);
crc := crc_table[i and $0F] xor (crc shl 4 shr 12) xor (data[p] shr 0);
crc := crc_table[i and $0F] xor (crc shl 4);
end;
result := (crc and $FFFF);
end; |
_________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
wfsistem Novato

Registrado: Sábado, 15 de Julho de 2017 Mensagens: 6
|
Enviada: Qui Jul 20, 2017 1:33 am Assunto: |
|
|
strak2012 escreveu: | segue a conversão:
Código: | const
crc_table: array [0 .. 15] of word = (
$0000, $1021, $2042, $3063, $4084, $50A5, $60C6, $70E7,
$8108, $9129, $A14A, $B16B, $C18C, $D1AD, $E1CE, $F1EF);
function CalculateCrc(data: array of byte): word;
var
i, p: integer;
crc: word;
begin
crc := 0;
for p := Low(data) to High(data) do
begin
i := (crc shr 12) xor (data[p] shr 4);
crc := crc_table[i and $0F] xor (crc shl 4 shr 12) xor (data[p] shr 0);
crc := crc_table[i and $0F] xor (crc shl 4);
end;
result := (crc and $FFFF);
end; |
|
Que isso hein! Show de bola!
Muito obrigado!
Mais, fazendo os testes aqui, não bate os CRCH e CRCL...
Irei ver aqui o que esta de errado!
Vou juntar o que tenho aqui e o que é para ser o resultado!
Ai passo aqui, para trocar uma ideia com vc!
Muito obrigado por enquanto! |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Jul 20, 2017 3:54 pm Assunto: |
|
|
Deixa eu lembrar que o CRC H e CRC L é um único byte cada e que a junção eles nada mais é que o CRC isso pq
O CRC é um numero Word logo ele vai de 0 a 256^2 ou seja 0 a 65.535 o que indica dois bytes assim o CRC L (Low byte CRC) e o CRC H (CRC High byte) nada mais é que o primeiro e o segundo byte do CRC respectivamente, exemplo
se o
CRC é AAFF = 43775
logo o
CRC L será FF = 170
e o
CRC H será AA = 255
Também deve levar em conta que o CRC deve ser em cima de todo o conteúdo apenas destinado para DATA
tomando a linha abaixo como exemplo
[<SHO>...]<SHO>[<DATA>]<CRCL><CRCH><EOT>
assim no exemplo acima ficaria
[<SHO em bytes>...]<SHO em bytes>[<Dados que resultou o CRC = AAFF em bytes>]<255><170><EOT em bytes>
onde:
<...> conjunto 1 ou mais de bytes
[...] variável ou números opcionais também em bytes
achei estas informações no documento:
http://ww1.microchip.com/downloads/en/AppNotes/01388B.pdf _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
wfsistem Novato

Registrado: Sábado, 15 de Julho de 2017 Mensagens: 6
|
Enviada: Qui Jul 20, 2017 4:19 pm Assunto: |
|
|
strak2012 escreveu: | Deixa eu lembrar que o CRC H e CRC L é um único byte cada e que a junção eles nada mais é que o CRC isso pq
O CRC é um numero Word logo ele vai de 0 a 256^2 ou seja 0 a 65.535 o que indica dois bytes assim o CRC L (Low byte CRC) e o CRC H (CRC High byte) nada mais é que o primeiro e o segundo byte do CRC respectivamente, exemplo
se o
CRC é AAFF = 43775
logo o
CRC L será FF = 170
e o
CRC H será AA = 255
Também deve levar em conta que o CRC deve ser em cima de todo o conteúdo apenas destinado para DATA
tomando a linha abaixo como exemplo
[<SHO>...]<SHO>[<DATA>]<CRCL><CRCH><EOT>
assim no exemplo acima ficaria
[<SHO>...]<SHO>[<Dados>]<255><170><EOT>
onde:
<...> conjunto 1 ou mais de bytes
[...] variável ou números opcionais também em bytes
achei estas informações no documento:
http://ww1.microchip.com/downloads/en/AppNotes/01388B.pdf |
Exatamente, isso mesmo!
Vamos la...
Tenho o arquivo .hex...
Por base do programa que existe hj em C.... e o monitor serial,
ele pegou 10 linhas do arquivo...
são esses...
:020000040000fa
:080000000002040000000000f2
:020000040000fa
:100008001e82010034820100e00200004a820100e1
:1000180060820100e0020000e0020000e00200004f
:10002800e0020000b27b0100807c010068760100dc
:10003800187b0100127c0100c67d01008c7601004e
:10004800a8770100e0020000e0020000dc81010066
:10005800c2810100e0020000e0020000e0020000ae
:10006800e0020000667c0100e0020000e0020000ff
:10007800e0020000e0020000e0020000e0020000f0
Pego esses dados tiro o ':' do inicio de cada linha e converto...
Converti em String primeiro
'020000040000fa080000000002040000000000f2020000040000fa100008001e82010034820100e00200004a820100e11000180060820100e0020000e0020000e00200004f10002800e0020000b27b0100807c010068760100dc10003800187b0100127c0100c67d01008c7601004e10004800a8770100e0020000e0020000dc8101006610005800c2810100e0020000e0020000e0020000ae10006800e0020000667c0100e0020000e0020000ff10007800e0020000e0020000e0020000e0020000f0'
Retirando os ":"
Após isso, coloco em um array em byte
Array of byte(2, 0, 0, 4, 0, 0, 250, 8, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 242, 2, 0, 0, 4, 0, 0, 250, 16, 0, 8, 0, 30, 130, 1, 0, 52, 130, 1, 0, 224, 2, 0, 0, 74, 130, 1, 0, 225, 16, 0, 24, 0, 96, 130, 1, 0, 224, 2, 0, 0, 224, 2, 0, 0, 224, 2, 0, 0, 79, 16, 0, 40, 0, 224, 2, 0, 0, 178, 123, 1, 0, 128, 124, 1, 0, 104, 118, 1, 0, 220, 16, 0, 56, 0, 24, 123, 1, 0, 18, 124, 1, 0, 198, 125, 1, 0, 140, 118, 1, 0, 78, 16, 0, 72, 0, 168, 119, 1, 0, 224, 2, 0, 0, 224, 2, 0, 0, 220, 129, 1, 0, 102, 16, 0, 88, 0, 194, 129, 1, 0, 224, 2, 0, 0, 224, 2, 0, 0, 224, 2, 0, 0, 174, 16, 0, 104, 0, 224, 2, 0, 0, 102, 124, 1, 0, 224, 2, 0, 0, 224, 2, 0, 0, 255, 16, 0, 120, 0, 224, 2, 0, 0, 224, 2, 0, 0, 224, 2, 0, 0, 224, 2, 0, 0, 240)
Desse array que faço o Calculo CRC...
E não bate! :/
Fiz o teste
Array[0] := 1 ( VERSÃO BOOTLOADER ) //
CRC := CalculoCRC(Array, 1);
CRCLO = LO(crc);
CRCHI = HI(crc);
Esses valores bate correto! |
|
Voltar ao Topo |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Qui Jul 20, 2017 4:31 pm Assunto: |
|
|
Passa-me o seguinte, com o programa que funciona pega o data e o crc e posta cá para podemos analisar o que falta ajustar na função que foi convertida para delphi. _________________ Tudo podemos quando tudo sabemos! |
|
Voltar ao Topo |
|
 |
wfsistem Novato

Registrado: Sábado, 15 de Julho de 2017 Mensagens: 6
|
Enviada: Qui Jul 20, 2017 4:34 pm Assunto: |
|
|
Mestre, consegui chegar no valor...
Quando é para enviar os dados PROGRAMAR
é o 0x03 correto?
Tenho que adicionar no buffer[0] = 3.....
Ai, deu certo!
Link para conversão de Hex para decimal... bem legal!
http://www.binaryhexconverter.com/hex-to-decimal-converter
Código: |
/****************************************************************************
* Send Command
*
* \param cmd: Command
* \param data: Pointer to data buffer if any
* \param dataLen: Data length
* \param retries: Number of retries allowed
* \param retryDelayInMs: Delay between retries in milisecond
* \return
*****************************************************************************/
char Buff[1000];
bool CBootLoader::SendCommand(char cmd, unsigned short Retries, unsigned short DelayInMs)
{
unsigned short crc;
unsigned int StartAddress, Len;
unsigned short BuffLen = 0;
unsigned short HexRecLen;
UINT totalRecords = 10;
TxPacketLen = 0;
// Store for later use.
LastSentCommand = cmd;
switch((unsigned char)cmd)
{
case READ_BOOT_INFO:
Buff[BuffLen++] = cmd;
MaxRetry = RetryCount = Retries;
TxRetryDelay = DelayInMs; // in ms
break;
case ERASE_FLASH:
Buff[BuffLen++] = cmd;
MaxRetry = RetryCount = Retries;
TxRetryDelay = DelayInMs; // in ms
break;
case JMP_TO_APP:
Buff[BuffLen++] = cmd;
MaxRetry = RetryCount = 1;
TxRetryDelay = 10; // in ms
break;
case PROGRAM_FLASH:
Buff[BuffLen++] = cmd;
if(ResetHexFilePtr)
{
if(!HexManager.ResetHexFilePointer())
{
// Error in resetting the file pointer
return false;
}
}
HexRecLen = HexManager.GetNextHexRecord(&Buff[BuffLen], (sizeof(Buff) - 5));
if(HexRecLen == 0)
{
//Not a valid hex file.
return false;
}
BuffLen = BuffLen + HexRecLen;
while(totalRecords)
{
HexRecLen = HexManager.GetNextHexRecord(&Buff[BuffLen], (sizeof(Buff) - 5));
BuffLen = BuffLen + HexRecLen;
totalRecords--;
}
MaxRetry = RetryCount = Retries;
TxRetryDelay = DelayInMs; // in ms
break;
case READ_CRC:
Buff[BuffLen++] = cmd;
HexManager.VerifyFlash((unsigned int*)&StartAddress, (unsigned int*)&Len, (unsigned short*)&crc);
Buff[BuffLen++] = (StartAddress);
Buff[BuffLen++] = (StartAddress >> 8);
Buff[BuffLen++] = (StartAddress >> 16);
Buff[BuffLen++] = (StartAddress >> 24);
Buff[BuffLen++] = (Len);
Buff[BuffLen++] = (Len >> 8);
Buff[BuffLen++] = (Len >> 16);
Buff[BuffLen++] = (Len >> 24);
Buff[BuffLen++] = (char)crc;
Buff[BuffLen++] = (char)(crc >> 8);
MaxRetry = RetryCount = Retries;
TxRetryDelay = DelayInMs; // in ms
break;
default:
return false;
break;
}
// Calculate CRC for the frame.
crc = CalculateCrc(Buff, BuffLen);
Buff[BuffLen++] = (char)crc;
Buff[BuffLen++] = (char)(crc >> 8);
// SOH: Start of header
TxPacket[TxPacketLen++] = SOH;
// Form TxPacket. Insert DLE in the data field whereever SOH and EOT are present.
for(int i = 0; i < BuffLen; i++)
{
if((Buff[i] == EOT) || (Buff[i] == SOH)
|| (Buff[i] == DLE))
{
TxPacket[TxPacketLen++] = DLE;
}
TxPacket[TxPacketLen++] = Buff[i];
}
// EOT: End of transmission
TxPacket[TxPacketLen++] = EOT;
return true;
}
|
Esse é o programa em C....
Que estou repassando!
Se quiser te mando ele no e-mail....
Vou continuar os testes aqui e posto mais detalhes!
Vlw |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|