Utilizando a IDE Code::Blocks com SDCC

Após muito tempo de pesquisas e tentativas, finalmente consegui configurar o Code::Blocks para usar o SDCC de forma satisfatória.

Então, neste post vamos configurar o Code::Blocks para utilizar o compilador SDCC (Small Device C Compiler). Além de todas as vantagens do uso de uma IDE, como auto-completar, o Code::Blocks compila automaticamente todas as bibliotecas necessárias e gera o arquivo .hex pronto para utilizar com apenas 1 clique.

Após instalar o Code::Blocks, vamos configurar o compilador SDCC:

  1. Acesse Settings→Compiler;
  2. Selecione o Compilador: Small Device C Compiler;
  3. Na aba “Compiler settings”, deixe tudo desmarcado;
  4. Na aba “Linker Settings”, deixe tudo em branco, remova qualquer biblioteca se tiver;
  5. Faça o mesmo na aba “Search directories” e suas sub-abas;
  6. Na aba “Toolchain executables”, corrija o diretório do compilador, no meu caso é “C:\Program Files\SDCC”;
  7. Na aba “Other Settings”, clique em “Avanced Options” e Yes;
    1. Na aba “Commands”, selecione o comando “Link object files to executable” e, no campo “Command line macro”, remova “-o $exe_output”;
    2. Faça o mesmo para “Link object files to console executable”
    3. Faça o mesmo para “Link object files to native executable”;
  8. Você pode clicar em “Set as default” se só usa o sdcc;

Feita a configuração do compilador, criamos um novo projeto. Nesse novo projeto fazemos as configurações locais.

Para não ter que fazer toda a configuração a seguir, você pode baixar um modelo de projeto. Assim, basta abrir e alterar/compilar. Mas, se quiser entender como funciona, siga os passos abaixo.

Aqui temos algumas ressalvas:

workspace1

  • Você deve ter uma pasta de trabalho, a qual contem os seus projetos, um em cada pasta, e as bibliotecas compartilhadas numa outra pasta, assim:
    • workspace (minha pasta de trabalho)libs (bibliotecas compartilhadas)
      • projeto_1
      • projeto_2

 

Parte 2

Vamos criar um projeto. No Code::Blocks, vá em File→New Project:

  1. Selecione “Empty project”;
  2. Clique em Go e em Next;
  3. Dê um nome, de preferência sem espaços e outros caracteres que não sejam letras, números e underline;
  4. Selecione a pasta “workspace”. Não crie uma pasta para seu projeto lá, o Code::Blocks irá fazer isso usando o nome que você deu ao projeto;
  5. Clique em Next;
  6. Desmarque a opção ‘Create “Debug” configurations’ e clique em Finish;
  7. Adicione um novo arquivo ao seu projeto em File→New→Empty File ou usando o ícone “New File”. A IDE perguntará se deseja salva, clique em Yes e salve na mesma pasta do projeto. Salve como main.c, pois usaremos esse nome novamente depois.
  8. Crie outros dois arquivos, picsetup.c e picsetup.h;
  9. Vá em Project→Properties;
    1. Na aba “Build targets”
      1. Altere Type para Native;
      2. Apague o Output filename (deixe em branco);
      3. Desmarque “Auto-generate filename extension;
      4. Clique OK;
  10. Vá em Project→Build Options;
    1. Na aba Compiler Settings e na sub-aba Compiler Flags, marque PIC 16-bit (p18f452…). Use PIC 14-bit se seu pic for da Familia 16F;
    2. Na sub-aba Other compiler options acrescente: –use-non-free -p18f4550 -I ../libs. Veja que incluímos o diretório de bibliotecas compartilhadas ‘libs’. Também indicamos qual é o pic a ser programado.
    3. Na aba “Linker settings” acrescente “main.c” no campo “Other linker options”;
  11. Abra o Arquivo main.c e vá em File→Properties, na aba Build, desmarque “Compile File” e “Link File”

Coloque o código de exemplo nos arquivos que foram criados:

main.c

#include "picsetup.h"

#pragma config FOSC = HSPLL_HS
#pragma config PWRT = OFF, BOR = OFF
#pragma config WDT = OFF
#pragma config DEBUG = OFF
#pragma config PLLDIV = 5
#pragma config USBDIV = 1
#pragma config CPUDIV = OSC1_PLL2
#pragma config XINST = OFF

#define LOOPS_PER_MS 820
#include <delays.h>
#define LED PORTEbits.RE1
#define LED2 PORTEbits.RE2

void main()
{
    hdw_setup();
    LED = 0;
    delay_ms(500);
    LED = 1;
    delay_ms(500);
    LED=0;
    delay_ms(500);
    while(1)
    {
        LED = 1;
        delay_ms(100);
        LED = 0;
        delay_ms(100);
    }
}

NOTA: evite LED = !LED, por algum motivo, o SDCC não gera o código corretamente.

picsetup.h

#include <pic18fregs.h>

void hdw_setup();

 

picsetup.c

#include "picsetup.h"

void hdw_setup(){

	TRISA = 0b00000011;
	TRISB = 0b00000000;
	TRISC = 0b10000000;
	TRISD = 0b00000000;
	TRISE = 0b00000000;

	PORTA = 0;
	PORTB = 0b00000000;
	PORTC = 0;
	PORTD = 0;
	PORTE = 0;
}

 

Salve os arquivos e clique em Build→Rebuild.

Prefira usar sempre o Rebuild, pois o Code::Blocks pode não detectar alterações das bibliotecas.

O resultado deve ser o seguinte:

-------------- Clean: Release in protest (compiler: Small Device C Compiler)---------------

Cleaned "protest - Release"

-------------- Build: Release in protest (compiler: Small Device C Compiler)---------------

sdcc.exe  -mpic16 --use-non-free -p18f4550 -I ../libs     -c picsetup.c -o obj\Release\picsetup.o
sdcc.exe    -mpic16 --use-non-free -p18f4550 -I ../libs    main.c   obj\Release\picsetup.o
message: Using default linker script "C:\Program Files (x86)\gputils\lkr\18f4550_g.lkr".
Output file is main.hex with size 1.35 KB
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))

 

Os passos que envolvem o arquivo main.c foram necessários para que o Code::Blocks executasse a seguinte linha de comando:

sdcc.exe    -mpic16 –use-non-free -p18f4550 -I ../libs    main.c   obj\Release\picsetup.o

De outro modo, o compilador iria primeira gerar um arquivo objeto (-c main.c -o main.o) e depois tentar linkar. E, quando você precisar usar bibliotecas como stdio (para printf, por exemplo), obteria um erro dizendo que falta a biblioteca. Executando a linha acima, o compilador encontra as bibliotecas corretas automaticamente.

Dúvidas, entre em contato ou deixe um comentário.

3 comments on “Utilizando a IDE Code::Blocks com SDCC

  1. Gostei muito de sua pagina.
    Só que não consegui rodar nenhum programa para fazer o arquivo hex .
    Gostaria que mandasse uma copia de algum projeto que use 18f4550 com arquivo de configuração.
    Agradeço pelo que puder fazer por mim.

    1. Olá, Te mandei uma pasta com exemplos.
      Porém, a parte 1 ainda precisa ser feita manualmente, pois ela não é salva junto com o projeto.

  2. Olá Leandro, parabéns pelo conteúdo e obrigado por sua generosidade em compartilhar!
    Não tive sucesso no procedimento acima e acredito que tem algo a corrigir na instalação, veja:
    Eu instalei o SDCC e GPUTILS antes do CodeBlocks. Fiz os procedimentos acima alterando pertinentemente para o pic16f887, mas a pasta libs da minha workplace está vazia, o que eu deveria colocar lá? O CodeBlocks não consegue compilar e dá erro ao tentar localizar o arquivo pic18fregs.h ou pic16fregs.h (penso que é para pic16f887). O que devo fazer pra corrigir isso?

Deixe um comentário

O seu endereço de e-mail não será publicado.