Página 1 de 1
Botloader via USB cm o PIC18f4550 ( MikroC )

Enviado:
12 Jan 2010 17:10
por rodrigoadachi
Ola,
Será que da espaço pro programa usar um bootloader via USB? Alguem ja fez issu?

Enviado:
12 Jan 2010 19:23
por Francesco

Enviado:
14 Jul 2010 12:32
por Jorge_Francisco
Então,
Estava querendo testar um bootloader mas ele não funcionou. Será que alguém teria algum material interessante sobre Bootloader USB, tem que ser USB. Queria primeiro testar e ver funcioanar, depois eu queria entender o funcionamento e alterar pro que eu quero. Segundo queria o código fonte para alterar o firmware no cliente, ou seja, farei o software para atualizar o firmware pelo bootloader.
Alguém me ajuda? Se tiver algo feito por vocês é melhor ainda, porque o que pego na internet é muito vago, ou só coloca o .hex, mas queria o .c para entender o processo.
Meu PIC é um 18f4550, a IDE é MikroC, e o meu VID e PID são proprietários( essa é dificuldade com exemplos da net ).
Abraço

Enviado:
14 Jul 2010 14:57
por Jorge_Francisco
Se eu quiser fazer do zero NO MIKROC, alguém me daria uma luz????
Do tipo, sei mais ou menos como funciona a budega. Mas preciso de uma ideia de como começar, não quero o código, mas um passo a passo seria bom.
Vlw

Enviado:
14 Jul 2010 15:09
por Francesco
Jorge,
Se quiser podemos ajudar... estou mais acostumado com o bootloader do ARDUINO. As flags e endereços são diferentes (lógico), mas o processo em sí é igual.
Veja o que você acha:
http://code.google.com/p/arduino/source/browse/tags/0015/hardware/bootloaders/atmega/ATmegaBOOT_168.c
O bacana é que o código está aberto, e é apenas um arquivo C. Assim fica mais fácil para entender.
Francesco

Enviado:
14 Jul 2010 15:15
por Jorge_Francisco
Porque alguns bootloaders são armazenados no final da memoria?

Enviado:
14 Jul 2010 15:43
por Francesco
Dessa forma você consegue carregar qualquer programa de qualquer compilador. Não precisa se preocupar em compila-lo para uma determinada área da memória.
Por exemplo, o arduino com ATmega8 compila o bootloader para 0x1C00, isso significa que dos 8K de memória ele vai ocupar 1K do final. Assim, você pode fazer um programa de até 7K em qualquer compilador, compilando para o endereço padrão (0000h).

Enviado:
14 Jul 2010 16:06
por Jorge_Francisco
Francesco escreveu:Dessa forma você consegue carregar qualquer programa de qualquer compilador. Não precisa se preocupar em compila-lo para uma determinada área da memória.
Por exemplo, o arduino com ATmega8 compila o bootloader para 0x1C00, isso significa que dos 8K de memória ele vai ocupar 1K do final. Assim, você pode fazer um programa de até 7K em qualquer compilador, compilando para o endereço padrão (0000h).
Entendido. Quando o uC inicializa ele vai para a posição 0000h para executar o programa, tenho que dizer ao compilador em todos os programas que eu fizer que tem que começar da posição 0x1C00( como o seu exemplo )???? Aí o bootloader toma uma decisão (atualizar ou não o firmware) e vai para 0000h, é isso??

Enviado:
14 Jul 2010 16:25
por Sergio38br
Veja a area que pode ser protegida em cada micro contra auto gravação, geralmente esta coincide com a area onde fica armazenado o bootloader.
[ ]'s
Sergio

Enviado:
14 Jul 2010 16:58
por Jorge_Francisco
Sergio38br escreveu:Veja a area que pode ser protegida em cada micro contra auto gravação, geralmente esta coincide com a area onde fica armazenado o bootloader.
[ ]'s
Sergio
Vou dar uma olhada Sérgio.
Vlw

Enviado:
14 Jul 2010 17:34
por Jorge_Francisco
No código do Bootloader eu coloco isso no MikroC :
#pragma orgall 0x1C00
Mas como que ao inicializar o PIC saberá que tem que ir para este endereço?
Tenho que colocar no endereço 0x0000 um goto 0x1C00?
Como faria isso no MikroC???

Enviado:
15 Jul 2010 00:54
por Francesco
Jorge,
No meu caso estou com um ATmega, não com um PIC... então as coisas são um pouco diferentes.
Quando ele inicia, vai direto para o endereço 0x1C00 porque o microcontrolador permite isso. No programa do bootloader ele verifica se a sequência de boot foi iniciada, se não ele pula para o 0x0000 e inicia o programa normalmente.
Se tiver curiosidade, no link do código que te mandei há a configuração do ponteiro para a função:
- Código: Selecionar todos
void (*app_start)(void) = 0x0000;
E quando ele verifica que o boot não foi iniciado, então carrega o programa do 0x0000:
- Código: Selecionar todos
/* no UART was selected, start application */
if(!bootuart) {
app_start();
}
Francesco