Download SDCC Small Device C Compiler

O SDCC (Small Device C Compiler – compilador C para dispositivos pequenos) é um otimizado do compilador ANSI -C que permite trabalhar com o Intel 8051, Maxim 80DS390, Zilog Z80 e o Motorola 68HC08 baseados em MCUs. Há também como compilar e usar para a linha Microchip PIC16 e PIC18. Trata-se de um projeto open source (código fonte aberto) sob licença GLP (General Public License) da GNU.

Há um plugin que permite integrar o SDCC junto como o IDE Eclipse, permitindo compilar programas para microcontroladores.

Um detalhe legal é que além de gratuito ele possui versões para Linux, Windows e MAC.

Fonte e mais detalhes aqui.

The CCSC2SDCC Migration Guide

This chapter summarises and explains how to migrate code written for the CCS compiler to code for the SDCC. (16bit targets)

Contents

Comparison of the two compilers
Feature matrix
Language differences
Tools for your convenience
Resources
convert.pl
ren_ident
enum-o-matic
convert.sh
How to use
Required manual work
Compatibility files
compat.h
compat_defs.h
stdint.h
delay.c
disptab.c
initprio.c
compat_i2c.c, software_i2c.c, software_i2c.h
Example
General hints
Links

Fonte e mais detalhes aqui.

GoGo Real: Firmware SDCC

Para gerarmos um firmware compatível com a GoGo Real, utilizando a última versão do compilador SDCC e bibliotecas Gputils, além de instala-los, deveremos utilizar a programação abaixo.

Para a compilação no Windows, poderemos criar um arquivo bat com este conteúdo:

@echo off
sdcc --ivt-loc=0x1840 --use-non-free -mpic16 -p18f4550 -c main.c
pause
sdcc -mpic16 -p18f4550 --ivt-loc=0x1840 --use-non-free --no-crt main.o libc18f.lib libm18f.lib libio18f4550.lib -m -o main.hex
pause

O código em C poderá ser:

#define NO_BIT_DEFINES 1
#include "pic18f4550.h"
#include "pic18fregs.h"
#include

#pragma config XINST=OFF
#define CLOCK_SPEED 48000000

int i = 0;

void main(void) {
TRISA = 0x2F; // 0b00101111
TRISB = 0x03; // 0b00000011
TRISC = 0x00; // 0b00000000
TRISD = 0x02; // 0b00000010
TRISE = 0x07; // 0b00000111
while(1) {
PORTAbits.RA4 = 0; //run
PORTDbits.RD0 = 0; //user
PORTCbits.RC0 = 0; //u2
PORTCbits.RC1 = 0; //u3
for(i=0; i<=32000; ++i);
for(i=0; i<=32000; ++i);
PORTAbits.RA4 = 1; //run
PORTDbits.RD0 = 1; //user
PORTCbits.RC0 = 1; //u2
PORTCbits.RC1 = 1; //u3
for(i=0; i<=32000; ++i);
for(i=0; i<=32000; ++i);
}
}

Este programa fará com que todos os leds da placa alterem seu estado entre acesso e apagado, utilizando ao invés de um delay um contador for com o mesmo princípio.

GoGo Board: Firmware SDCC – VII

Neste exemplo de While, acenderemos todos os leds presentes na placa, bem como acionaremos o bip.

while(1) {
PORTAbits.RA4 = 1; //run
PORTDbits.RD0 = 1; //user
PORTCbits.RC0 = 1; //u2
PORTCbits.RC1 = 1; //u3
PORTCbits.RC2 = 1; //pz
}
}

Ate o momento a função Delay presente na biblioteca não tem funcionado corretamente, sendo assim, não incluimos uma etapa de desligamento dos leds e bip.

GoGo Board: Firmware SDCC – VI

No Main, conforme abaixo, definiremos os pinos utilizados e seu modo de operação, ou seja, entrada ou saída:

void main(void) {
TRISA = 0x2F; // 0b00101111
TRISB = 0x03; // 0b00000011
TRISC = 0x00; // 0b00000000
TRISD = 0x02; // 0b00000010
TRISE = 0x07; // 0b00000111

Será preciso atenção neste ponto, uma vez que o SDCC aceita apenas notação hexadecimal nos pinos.

GoGo Board: Firmware SDCC – V

Deveremos iniciar nosso código para ser compilado no SDCC, deste modo:

#define NO_BIT_DEFINES 1
#include "pic18f4550.h"
#include "pic18fregs.h"
#include <delay.h>

#define CLOCK_SPEED 48000000

Aonde definiremos qual PIC será utilizado, além de incluir algumas bibliotecas necessárias para a programação e compilação.

Feito isso, iremos para a escrita do Main e While em nosso programa.

GoGo Board: Firmware SDCC – IV

Para o Linux, deveremos utilizar:

sdcc --ivt-loc=0x1840 --use-non-free -mpic16 -p18f4550 main.c

O gplink será executado automaticamente e nosso programa será compilado.

Tudo aparenta estar correto, porém notamos algumas incompatibilidades no gplink para a compilação de cógicos.

Sendo assim, com base em tutoriais do Pinguino, o mais adequado foi utilizar apenas o SDCC, deste modo:

sdcc --ivt-loc=0x1840 -mpic16 -p18f4550 -c main.c
sdcc -mpic16 -p18f4550 --ivt-loc=0x1840 --no-crt main.o libc18f.lib libm18f.lib libio18f4550.lib -m -o main.hex

Finalmente nosso código poderá ser gravado na placa.

GoGo Board: Firmware SDCC – III

No Windows, após escrevermos nosso código em C utilizando o bloco de notas ou outro editor de texto, deveremos, através da linha de comando, utilizar:

sdcc --ivt-loc=0x1840 -mpic16 -p18f4550 -c main.c

A seguir:

gpasm -c main.asm

Por fim:

gplink -m -c main.o -o main.hex

Feito isso, já teremos um firmware pronto para ser gravado na placa, neste caso, uma GoGo Real.

GoGo Board: Firmware SDCC – II

Como já falamos anteriormente, para que um firmware seja compatível com o bootloader existente nas placas, devemos gravá-lo em uma posição expecífica de memória do PIC.

Na BR-GoGo, até o momento, este endereço é o 0x1560, para a GoGo Real, até o momento, é o 0x1840.

Para o SDCC, como já visto, deveremos alterar algumas bibliotecas, além de usar diretivas na compilação para que o código seja compilado de maneira correta, ou seja, iniciando a partir da posição de memória que desejamos.

GoGo Board: Firmware SDCC

Assim como fizemos utilizando outros compiladores, poderemos escrever nosso firmware e compilá-lo através do SDCC, tanto no Windows como no Linux.

Para Windows, devemos baixar o compilador através deste endereço, além disso, também precisaremos do GPutils, disponível aqui.

No Linux, mais expecíficamente no Raspbian, da Raspberry Pi, bastará utilizarmos “apt-get install sdcc” na linha de comando. O SDCC, bem como suas dependências: “gputils gputils-common gputils-doc sdcc-doc sdcc-libraries sdcc-ucsim”, serão instaladas.

BOOTLOADER EN SDCC – PIC18F4550

Para começar o primeiro artigo neste blog, vamos discutir o compilador de linguagem C para microcontroladores e como alterar o reset SDCC VETOR para uso com um bootloader para o PIC 18F4550.

A primeira coisa a fazer é mudar os vetores no. LKR de gputils, arquivo 18f4550.lkr.

No meu caso o bootloader armazenados no 0x00 endereço e 0xFFF, portanto, o vetor de reset será a 0x1000 posição e 0x1008 é interrupções.

Fonte e mais detalhes aqui.

pic18F4550 with Debian GNU/Linux and SDCC

Ontem, estava trabalhando com dispositivos pic 18F4550, gravados com bootloader da Microchip (PICDE). Descobri que no Linux há pouca documentação sobre programação para família pic 18f. Bem, eu finalmente programei meu pic sem um programador pic (usando o bootloader), todo o processo a partir de Debian GNU / Linux (usando sid).

Os programas que eu precisava (e as versões usadas por mim) são:

piklab (0.15.4-1)
gputils (0.13.7-1) e gputils-common (0.13.7-1)
sdcc (2.9.0-3)
e os picdemfs microchip bootloader (baixe aqui, hex para restaurar o pic para o estágio inicial)

Fonte e mais detalhes aqui.