ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

dsPIC Bootloader

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
wfsistem
Novato
Novato


Registrado: Sábado, 15 de Julho de 2017
Mensagens: 6

MensagemEnviada: Sáb Jul 15, 2017 11:34 pm    Assunto: dsPIC Bootloader Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Jul 18, 2017 2:46 pm    Assunto: Re: dsPIC Bootloader Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
wfsistem
Novato
Novato


Registrado: Sábado, 15 de Julho de 2017
Mensagens: 6

MensagemEnviada: Qua Jul 19, 2017 12:06 am    Assunto: Re: dsPIC Bootloader Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qua Jul 19, 2017 12:55 am    Assunto: Responder com Citação

Esta parte vai precisar saber calcular pois são dados bem variável de acordo do tamanho da aplicação que se vai gravar na memória.

Recomendo uma breve leitura no documento
https://www.google.com.br/url?sa=t&source=web&rct=j&url=http://ww1.microchip.com/downloads/en/DeviceDoc/30009729b.pdf&ved=0ahUKEwjMhvacuJTVAhVBDZAKHY9IAR0QFgggMAE&usg=AFQjCNEzWqRwI6Ue9WlqfTThgqGT_gdcYA

Explica como funciona os cálculos destas duas variante.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
wfsistem
Novato
Novato


Registrado: Sábado, 15 de Julho de 2017
Mensagens: 6

MensagemEnviada: Qua Jul 19, 2017 5:30 pm    Assunto: Responder com Citação

strak2012 escreveu:
Esta parte vai precisar saber calcular pois são dados bem variável de acordo do tamanho da aplicação que se vai gravar na memória.

Recomendo uma breve leitura no documento
https://www.google.com.br/url?sa=t&source=web&rct=j&url=http://ww1.microchip.com/downloads/en/DeviceDoc/30009729b.pdf&ved=0ahUKEwjMhvacuJTVAhVBDZAKHY9IAR0QFgggMAE&usg=AFQjCNEzWqRwI6Ue9WlqfTThgqGT_gdcYA

Explica como funciona os cálculos destas duas variante.


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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qua Jul 19, 2017 8:00 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qua Jul 19, 2017 8:51 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
wfsistem
Novato
Novato


Registrado: Sábado, 15 de Julho de 2017
Mensagens: 6

MensagemEnviada: Qui Jul 20, 2017 1:33 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Jul 20, 2017 3:54 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
wfsistem
Novato
Novato


Registrado: Sábado, 15 de Julho de 2017
Mensagens: 6

MensagemEnviada: Qui Jul 20, 2017 4:19 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Jul 20, 2017 4:31 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
wfsistem
Novato
Novato


Registrado: Sábado, 15 de Julho de 2017
Mensagens: 6

MensagemEnviada: Qui Jul 20, 2017 4:34 pm    Assunto: Responder com Citação

Mestre, consegui chegar no valor...

Quando é para enviar os dados PROGRAMAR

é o 0x03 correto?
Tenho que adicionar no buffer[0] = 3.....

Ai, deu certo! Very Happy

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB