Ir ao conteúdo
  • Cadastre-se
gustavo.rotondo

Hello World pic18f4550

Recommended Posts

Ola,

 

Iniciei no mundo do pic. Adquiri um 18f4550 com usb hid bootloader. 

 

Tentei fazer um programa simples para piscar um led. Usei MPLAB, e com o .hex o simulei no proteus e o mesmo funcionou.

 

Código

#include <stdio.h>#include <stdlib.h>#include <p18f4550.h>void main(){  TRISB0 = 0x00;          // informa que o port B é saída  do {          PORTB = 0xFF;        // liga leds do PORT B  } while(1);            //  loop}

porém quando vou passar para o pic  (direto USB) aparece a seguinte mensagem

 

"HEX file contains code over device bootloader area"

E pede para cancelar ou prosseguir. Testei com um .hex que achei na internet e nao retornou esse erro, porém com meu código da esse erro. Como posso arrumar?

Meu intuito é apenas piscar um LED ligado na porta B0 do pic. No proteus consegui, mas com esse erro não consigo

O pic em questão que adquiri foi esse: http://produto.mercadolivre.com.br/MLB-555358153-placa-desenvolvimento-pic-18f4550-no-precisa-gravador-_JM

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso ocorre porque você esta usando um Bootloader e o código não tem definições de endereço,então ele começa do Reset que é onde o Bootloader esta armazenado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso ocorre porque você esta usando um Bootloader e o código não tem definições de endereço,então ele começa do Reset que é onde o Bootloader esta armazenado.

 

Agradeço a resposta. então a mensagem de aviso ""HEX file contains code over device bootloader area. This code will be ignored". Eu a ignoro? Fiquei com receio de apagar o bootloader. 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hummm complicado isso hein, eu pensei que essas soluções a base de HID bootloader tratassem esse problema para o usuário iniciante apenas se preocupar em primeiro aprender :(

Enfim, antes de resolver esse problema talvez seja interessante ver onde o linker está alocando a área de código, para tal, que tal por aqui no forum TODOS os arquivos da pasta de projeto?

Sabendo onde esta colocando talvez possamos resolver o problema simplesmente alterando algumas linhas no linker-script da ferramenta que está usando para desenvolver o código ;)

Ficamos no aguardo do seu retorno.

Abs.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hummm complicado isso hein, eu pensei que essas soluções a base de HID bootloader tratassem esse problema para o usuário iniciante apenas se preocupar em primeiro aprender :(

Enfim, antes de resolver esse problema talvez seja interessante ver onde o linker está alocando a área de código, para tal, que tal por aqui no forum TODOS os arquivos da pasta de projeto?

Sabendo onde esta colocando talvez possamos resolver o problema simplesmente alterando algumas linhas no linker-script da ferramenta que está usando para desenvolver o código ;)

Ficamos no aguardo do seu retorno.

Abs.

 

Ola felipe, obrigado pelo retorno.

 

Pois é. Deveria ser um negocio mais simples mesmo. Fiz o projeto no MPLAB e esse foi o unico codigo que digitei. A partir dele gerei o .hex. Quais seriam esses arquivos que me pediu? Se for o codigo do programa é só esse. 

Utilizo o mikrobootloader pra passar o .hex pro pic, logo nao tenho nenhum diretorio que possa conter um arquivo indicando os limites da memoria do boot.

Uma duvida. Fiquei com medo de ter apagado meu bootloader pois ignorei a mensagem. A qual dizia HEX file contains code over device bootloader area. This code will be ignored"

Agora nao sei se o bootloader que estava contido foi ignorado ou meu codigo. No manual do bootloader diz que se eu usar um gravador,o bootloader seria apagado. Nao usei gravador e consegui colocar um .hex que peguei na internet e o mesmo nao mostrou nenhuma mensagem. E consegui colocar no pic, creio que nao tenha apagado então o bootloader, correto? ate mesmo o meu mikro usb reconhece o pic. Teria alguma forma de testar?

Voltando aos arquivos, posso postar um print da arvore de arquivos do projeto que o MPLAB gerou. Seria isso?

Obrigado

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Uma duvida. Fiquei com medo de ter apagado meu bootloader pois ignorei a mensagem. A qual dizia HEX file contains code over device bootloader area. This code will be ignored"

Bem essa mensagem pelo menos indica que o boot não é tão "burro". Parece que caso o código fique na área do bootloader, ele simplesmente não grava este, bom sinal ;)

 

 

 

E consegui colocar no pic, creio que nao tenha apagado então o bootloader, correto? ate mesmo o meu mikro usb reconhece o pic. Teria alguma forma de testar?

Essa é a parte mais bizarra, mas me deu uma ideia, como você está a usar o código do mikrobootloader, porque não experimente desenvolver esse mesmo pisca LED no mikroC, não estou sugerindo ele como ferramenta, mas apenas para eu ter certeza do problema.

 

 

 

Voltando aos arquivos, posso postar um print da arvore de arquivos do projeto que o MPLAB gerou. Seria isso?

Isso, se possível zipar essa pasta de arquivos e postar aqui :)

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola felipe. Dei uma pesquisada mais a fundo e descobri que tenho que programar o mapeamento da memoria tambem. Por isso aquele aviso.

 

Achei um codigo que ja tem esse mapeamento

#include <p18f4550.h>#pragma code REMAPPED_RESET_VECTOR=0x1000		// Car on utilise le Bootloader HID de Microchip	extern void _startup (void);void _reset (void){   _asm goto _startup _endasm}#pragma codevoid delay(void){	unsigned int i;	for(i=0; i<1000; ++i);}void main(void){	TRISB=0b00011111;	LATB=0;	while(1)	{		delay();		++LATB;	}}

Li tambem que teria que incluir no mplab um arquivo .lkr. Que achei junto na pasta de exemplo que eu baixei, só que não sei como fazer tal inclusão.

Compilei esse codigo no MPLAB sem erros e passei o .hex para o pic sem erros. No proteus esse .hex não rodou e no pic tambem não

O arquivo teste05 é o que eu baixei de exemplo que sua descrição constava ligar um led com usb bootloader

Att

TEST05.rar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

 

eu tenho um desse. 

Segui os exemplos que foram disponibilizados para donwload (http://www.smartradio.com.br/loja-pic/?id=42)

 

Você precisa colocar as referencias do bootloader. faça os download disponíveis, e tem alguns exemplos.

 

Tenho um projeto padrão para o mplab que separai tudo em arquivos separados, apenas fazendo a chamada.

 

 

 

deve possuir isso antes do programa:

 

/** B O O T L O A D E A R ****************************************************/
// para usar gravaзгo bootloader por usb hid sempre usar este trecho
void YourHighPriorityISRCode();
void YourLowPriorityISRCode();
 
#define PROGRAMMABLE_WITH_USB_HID_BOOTLOADER
 
    #if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)
        #define REMAPPED_RESET_VECTOR_ADDRESS           0x1000
        #define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS  0x1008
        #define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS   0x1018
 
    #if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)||defined(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER)
    extern void _startup (void);        // See c018i.c in your C18 compiler dir
    #pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
    void _reset (void)
    {
        _asm goto _startup _endasm
    }
    #endif
    #pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
    void Remapped_High_ISR (void)
    {
         _asm goto YourHighPriorityISRCode _endasm
    }
    #pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
    void Remapped_Low_ISR (void)
    {
         _asm goto YourLowPriorityISRCode _endasm
    }
 
    #if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)||defined(PROGRAMMABLE_WITH_USB_MCHPUSB_BOOTLOADER)
    //Note: If this project is built while one of the bootloaders has
    //been defined, but then the output hex file is not programmed with
    //the bootloader, addresses 0x08 and 0x18 would end up programmed with 0xFFFF.
    //As a result, if an actual interrupt was enabled and occured, the PC would jump
    //to 0x08 (or 0x18) and would begin executing "0xFFFF" (unprogrammed space).  This
    //executes as nop instructions, but the PC would eventually reach the REMAPPED_RESET_VECTOR_ADDRESS
    //(0x1000 or 0x800, depending upon bootloader), and would execute the "goto _startup".  This
    //would effective reset the application.
 
    //To fix this situation, we should always deliberately place a
    //"goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS" at address 0x08, and a
    //"goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS" at address 0x18.  When the output
    //hex file of this project is programmed with the bootloader, these sections do not
    //get bootloaded (as they overlap the bootloader space).  If the output hex file is not
    //programmed using the bootloader, then the below goto instructions do get programmed,
    //and the hex file still works like normal.  The below section is only required to fix this
    //scenario.
    #pragma code HIGH_INTERRUPT_VECTOR = 0x08
    void High_ISR (void)
    {
         _asm goto REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS _endasm
    }
    #pragma code LOW_INTERRUPT_VECTOR = 0x18
    void Low_ISR (void)
    {
         _asm goto REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS _endasm
    }
    #endif  //end of "#if defined(PROGRAMMABLE_WITH_USB_HID_BOOTLOADER)||defined(PROGRAMMABLE_WITH_USB_LEGACY_CUSTOM_CLASS_BOOTLOADER)"
 
 
    #endif
 
   #pragma code
 
    //These are your actual interrupt handling routines.
    #pragma interrupt YourHighPriorityISRCode
    void YourHighPriorityISRCode()
    {
        //Check which interrupt flag caused the interrupt.
        //Service the interrupt
        //Clear the interrupt flag
        //Etc.
        #if defined(USB_INTERRUPT)
            USBDeviceTasks();
        #endif
 
    }   //This return will be a "retfie fast", since this is in a #pragma interrupt section
    #pragma interruptlow YourLowPriorityISRCode
    void YourLowPriorityISRCode()
    {
        //Check which interrupt flag caused the interrupt.
        //Service the interrupt
        //Clear the interrupt flag
        //Etc.
 
    }   //This return will be a "retfie", since this is in a #pragma interruptlow section
 
/** F I M * B O O T L O A D E A R ********************************************/]
/** C O N F I G U R A Ç Õ E S  B I T S ****************************************/
#pragma config PLLDIV   = 5         // (20 MHz crystal on PICDEM FS USB board)
#pragma config CPUDIV   = OSC1_PLL2
#pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
#pragma config FOSC     = HSPLL_HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config PWRT     = OFF
#pragma config BOR      = ON
#pragma config BORV     = 3
#pragma config VREGEN   = ON      //USB Voltage Regulator
#pragma config WDT      = OFF
#pragma config WDTPS    = 32768
#pragma config MCLRE    = ON
#pragma config LPT1OSC  = OFF
#pragma config PBADEN   = OFF
#pragma config STVREN   = ON
#pragma config LVP      = OFF
#pragma config XINST    = OFF       // Extended Instruction Set
#pragma config CP0      = OFF
#pragma config CP1      = OFF
#pragma config CPB      = OFF
#pragma config WRT0     = OFF
#pragma config WRT1     = OFF
#pragma config WRTB     = OFF       // Boot Block Write Protection
#pragma config WRTC     = OFF
#pragma config EBTR0    = OFF
#pragma config EBTR1    = OFF
#pragma config EBTRB    = OFF
 
 
 
 
 
vamos conversar posteriormente sobre ele. recentemente tentei realizar comunicação do display de lcd e não consegui.

Cara, pode ter ficado meio confuso.

É que estou no serviço, e só quis dar uma ajuda inicial.

 

Mas se não conseguir, conversamos posteriormente.

E se conseguir, conversamos posteriormente para outros testes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola george. Muitissimo obrigado.

 

Esse código é só para referenciar o bootloader?

 

Onde esta o exemplo no site? Não achei na parte de downloads


Ola george. Muitissimo obrigado.

 

Esse código é só para referenciar o bootloader?

 

Onde esta o exemplo no site? Não achei na parte de downloads

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz aqui, gerei o .hex e no proteus funcionou

Não consegui especificar apenas uma porta. Manda sinal em todas as B. Tentei TRISB0 no mplab com c18 igual esta no p18f4550.h mas dava erro. Só compilava com TRISB

Sabe como especificar a B0?

Obrigado

E vi anteriormente o .lkr. Ele tem que ser incluso no main.c, passado junto para o pic? Ou não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente configuro assim: TRISA = 0b11001111; ai sei o que é cada porta.

 

O .lkr tem que está na mesma pasta, e se não me engano, no projeto deve-se add o linker. mas não sei se é obrigatório.


Segue meu projeto que utilizo como padrão, para iniciar qualquer outro.

padrão.X.zip

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente configuro assim: TRISA = 0b11001111; ai sei o que é cada porta.

 

O .lkr tem que está na mesma pasta, e se não me engano, no projeto deve-se add o linker. mas não sei se é obrigatório.

Segue meu projeto que utilizo como padrão, para iniciar qualquer outro.

essa .rar de exemplos, sabe se ja esta linkado? olhei no código e nao vi

Hoje vou passar para o pic e ver e funciona. Se não tivesse bootloader seria bem mais simples não?

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, já esta linkado. quando você abrir o projeto no c18, verá que na lista de arquivo terá o .lkr

 

sem o bootloader seria necessário um gravador de pic, e porta serial ( e eu não possuo nenhum dos dois, por isso optei por comprar este modulo).

 

no começo fiquei com muitas duvidas e medo de perder o bootloader, mas é tranquilo.

 

inclusive iniciei um projeto no ccs também, já com o bootloader.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×