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.

2 comentários em “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.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *