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:
- Acesse Settings→Compiler;
- Selecione o Compilador: Small Device C Compiler;
- Na aba “Compiler settings”, deixe tudo desmarcado;
- Na aba “Linker Settings”, deixe tudo em branco, remova qualquer biblioteca se tiver;
- Faça o mesmo na aba “Search directories” e suas sub-abas;
- Na aba “Toolchain executables”, corrija o diretório do compilador, no meu caso é “C:\Program Files\SDCC”;
- Na aba “Other Settings”, clique em “Avanced Options” e Yes;
- Na aba “Commands”, selecione o comando “Link object files to executable” e, no campo “Command line macro”, remova “-o $exe_output”;
- Faça o mesmo para “Link object files to console executable”
- Faça o mesmo para “Link object files to native executable”;
- 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:
- 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
- workspace (minha pasta de trabalho)libs (bibliotecas compartilhadas)
Parte 2
Vamos criar um projeto. No Code::Blocks, vá em File→New Project:
- Selecione “Empty project”;
- Clique em Go e em Next;
- Dê um nome, de preferência sem espaços e outros caracteres que não sejam letras, números e underline;
- 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;
- Clique em Next;
- Desmarque a opção ‘Create “Debug” configurations’ e clique em Finish;
- 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.
- Crie outros dois arquivos, picsetup.c e picsetup.h;
- Vá em Project→Properties;
- Na aba “Build targets”
- Altere Type para Native;
- Apague o Output filename (deixe em branco);
- Desmarque “Auto-generate filename extension;
- Clique OK;
- Na aba “Build targets”
- Vá em Project→Build Options;
- 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;
- 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.
- Na aba “Linker settings” acrescente “main.c” no campo “Other linker options”;
- 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”
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.
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.
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?