sexta-feira, 28 de junho de 2013

SDCC: Interrupções no PIC

SDCC: Interrupções no PIC

Interrupção é um artifício dos que muitos processadores implementam para que respondam aos eventos externos. Esse pedido de processamento possui prioridades. É um cutucão. Se ele receber um sinal de interrupção, ele:
- pára o que está fazendo,
- salva o contexto,
- identifica a interrupção,
- aciona a rotina de tratamento da interrupção (que TÊM que ser curta e eficiente)
- retornar o contexto
- voltar a fazer o que estava fazendo antes da interrupção

Dependendo da arquitetura do microcontrolador podemos ter 1 ou mais pontos de tratamento de interrupção. Isso dá o nome de vetores. E cada vetor atendendo a um propósito específico.
Isso tudo é muito dependente da arquitetura do microcontrolador. À medida que nos aprofundamos no assunto, procure ler intensamente o manual do microcontrolador.

Contexto é configuração atual dos registradores no momento imediatamente anterior ao recebimento da interrupção. Dependendo da situação, salvar o contexto é necessário para que quando houver o retorno da atividade interrompida, tudo esteja íntegro.


Interrupções no SDCC

Escrever interrupçoes no SDCC é facilidado pela instrução __interrupt . Onde é um número que identifica a posição no vetor de interrupções. 

A estrutura é de uma função com essa instrução mágica. Essa instrução faz com que o código seja relocado para o endereço de vetor específico.

void isr() __interrupt 1 {
/*...*/
}

Como eu disse, a posição no vetor de interrupções é dependente da arquitetura do microcontrolador. Você vai precisar ler muito o manual do microcontrolador para entender como utilizar cada vetor especificamente.

Normalmente é algo sequencial... por exemplo se tomarmos o PIC16F88, ele só tem 1 vetor de interrupção, portanto uma declaração simples já basta.  Esse vetor fica localizado no endereço 0x004 da memória...

Já o PIC18F252, ele têm 2 vetores, o primeiro em 0x010 e o segundo em 0x018. Com propósitos definidos. Declarar no SDCC essas interrupções se faz assim:

void isr_high() __interrupt 1 {
/*...*/
}
void isr_low() __interrupt 2 {
/*...*/
}

Contexto

Falei um pouco sobre contextos. Quando uma interrupção é invocada. O SDCC automaticamente criará o código necessário para salvar o estado dos registradores. Isso pode ser visto no assembly gerado (.asm)

Por exemplo (para PIC16F88):

void isr1() __interrupt 1 {
PORTB=0xFF;
}

irá gerar o código em assembler:

c_interrupt code 0x4      ; 
__sdcc_interrupt
_isr1 ;Function start
MOVWF WSAVE
SWAPF STATUS,W
CLRF STATUS
MOVWF SSAVE
MOVF PCLATH,W
CLRF PCLATH
MOVWF PSAVE
MOVF FSR,W
BANKSEL ___sdcc_saved_fsr
MOVWF ___sdcc_saved_fsr
; .line 20; "interrupt.c" PORTB=0xFF;
MOVLW 0xff
BANKSEL _PORTB
MOVWF _PORTB
BANKSEL ___sdcc_saved_fsr
MOVF ___sdcc_saved_fsr,W
BANKSEL FSR
MOVWF FSR
MOVF PSAVE,W
MOVWF PCLATH
CLRF STATUS
SWAPF SSAVE,W
MOVWF STATUS
SWAPF WSAVE,F
SWAPF WSAVE,W
END_OF_INTERRUPT
RETFIE

O código marcado é o código que salva o contexto e restaura respectivamente.

Obviamente esse cuidado tem um custo. Vou marcar o programa de teste. E nas condições acima o programa completo tomou aproximadamente 78 bytes

Descartando o Contexto

Se na lógica de programação for julgado que o processamento de context é desnecessário, podemos introduzir na declaração da rotina de tratamento de interrupção (ISR) o modificador __naked

__naked instrui ao SDCC para não gerar o código para salvamento e restaruração do contexto. Seguindo o nosso exemplo:

void isr1() __naked __interrupt 1 {
PORTB=0xFF;
}

Gerará o seguinte assembly:

c_interrupt code 0x4
__sdcc_interrupt
_isr1 ;Function start
; 0 exit points
; .line 20; "interrupt.c" PORTB=0xFF;
MOVLW 0xff
BANKSEL _PORTB
MOVWF _PORTB
END_OF_INTERRUPT
RETFIE

Muito mais enxuto não? :) Com isso o programa completo tomou somente  30 bytes. Menos da metade!!!

Sessões críticas

A execução de uma rotina de tratamento de interrupção, não invalida o microcontrolador de estar recebendo ainda eventos externos. Isso pode gerar um problema sério de ter que atender a múltiplas requisições de interrupção sem ter terminado alguma delas. O efeito colateral disso é que  o endereço de retorno da interrupção (retornar de onde parou) é armazenado em uma pilha.

A pilha é algo limitado. Costuma ser de míseros bytes (16, 32, 64bytes) e tem seu lugar na na RAM.

Se a pilha atinge o seu topo, o microcontrolador pode parar e reiniciar. Com isso o programa não executa direito o que tem de ser resolvido urgentemente... A depuração disso não é fácil!

Para evitar tal situação, é bom instruir o microcontrolador a não aceitar mais interrupções quando estiver processando uma. Podemos explicitamente dizer isso  no programa, desabilitando interrupções, e antes de terminar, rehabilitando-os. Ou utilizar  a instrução __critical

Vamos tomar o nosso programa de exemplo:

void isr1() __critical __naked __interrupt 1 {
PORTB=0xFF;
}

O seu assembly será:

c_interrupt code 0x4
__sdcc_interrupt
_isr1 ;Function start
; 0 exit points
; .line 19; "interrupt.c" void isr1() __critical __naked __interrupt 1 {
MOVF INTCON,W
BCF INTCON,7
BANKSEL r0x1000
MOVWF r0x1000
; .line 20; "interrupt.c" PORTB=0xFF;
MOVLW 0xff
BANKSEL _PORTB
MOVWF _PORTB
BANKSEL r0x1000
BTFSS r0x1000,7
GOTO _00001_DS_
BANKSEL INTCON
BSF INTCON,7
END_OF_INTERRUPT
_00001_DS_
RETFIE

O código marcado acima desabilita TODAS as interrupções do PIC16F88 (GIE=0) e reabilita no final da interrupção. O programa compilado total tomou 54bytes. O que é  razoável.

--//--

Nota: Não fiz comparativo entre tamanhos dos programas compilados como se fosse mera vantagem. Não! Quando se programa para microcontroladores, não há espaço para desperdício. O volume de memória, principalmente RAM é muito pequeno e isso requer otimizações seguras para evitar bugs!

Se durante o desenvolvimento do código, você desenvolvedor, julgar e se certificar de que os preâmbulos são desnecessários, por que não otimizar? Ganha-se em velocidade e tamanho de código. Mas fique certo de também haverá situações em que nenhuma dessas otimizações poderão ser empregadas... Valha-se de sua experiência e conhecimento!

--//--
Há algum tempo atrás, fiquei "encucado com um negócio aqui"... se usarmos o __naked uma coisa vai acontecer: a função é reescrita em assembly sem o código de preâmbulo (e epílogo). O que significa isso? Simples, ele não savará contexto, tampouco irá criar a chamada para retorno de função.

O QUÊ?! Sim, Não cria o "retorno". Isso significa que chamar uma função __naked, irá fazer com que a função saia executando atropelando tudo até encontrar um lugar com RETFIE ou RETURN. Enfim. Se o contexto não me é necessário, o retorno é! para isso eu sempre procuro finalizar uma função __naked com a linha

__asm RETURN __endasm;

Por exemplo (para interrupts):

void isr1() __critical __naked __interrupt 1 {
PORTB=0xFF;
 __asm RETFIE __endasm; /* finaliza a função de interrupt */
}

quinta-feira, 27 de junho de 2013

SDCC: Estrutura de um programa para PIC

Não vou entrar nos detalhes de como programar em C. Se você chegou até aqui, eu presumo que você saiba o mínimo necessário para escrever um "Hello World!" em C para qualquer plataforma. E tutorial para programar em C puro tem aos baldes na internet.

C ou C++? C!!! Assim rezado por Ken Thompson e Dennis Ritchie. SDCC não suporta C++. Então aquelas maravilhas de cin/cout não vai te ajudar em nada. Estamos programando para microcontroladores que têm uma memória absurdamente diminuta, então não dá para ficar "dourando a pílula".

Estrutura Mínima

Basicamente um programa em C para PIC no SDCC tem a seguinte estrutura:

- Cabeçalho (headers inclusion)
- Configuração dos bits do microcontrolador (fuses - somente no módulo principal)
- E a função main()

Óbvio que não fica limitado a isso... por isso eu chamo de estrutura mínima.

A função main é a função que será invocada pelo microcontrolador quando esse inicializar. Simplesmente declarado como

void main() {
/* ... */
}

Exemplo:

#define __16F88
#include "pic16regs.h"

typedef unsigned int config;

config __at _CONFIG1 conf1=_HS_OSC & _PWRTE_OFF & _BOREN_OFF & _BODEN_OFF & _WDT_OFF & _MCLR_ON;

int main()
{
TRISB=0xFD;
while(1) {
PORTB=(PORTB^0x02);
}

}

Cabeçalhos 

Se alguma função, constante, tipos definidos, variáveis externas, etc, não declarados no corpo do programa atual forem utilizados, eles terão que ser declarado antes. Para isso serve os arquivos .h (headers)

Para o SDCC com PIC a estrutura mais comum é definir o tipo do microcontrolador e depois incluir os registros necessários.


#define _p16f88 
#include "pic16regs.h"

...


A declaração acima faz com que seja utilizado as definições de registros/registradores para suporte do PIC16F88 somente!

#define _p18f252
#include "pic18fregs.h"

...

De forma similar, mas para o PIC18F252.


Existem programadores que fazem diferente, por exemplo:

#include "pic14/pic16f88.h" 

que faz a mesma coisa da definição que eu utilizo. Fica a teu critério.

Configuração dos Bits (fuses)

Essa é a parte mais confusa. Dependendo da versão de SDCC você terá dores de cabeça. Estou usando a versão 3.3 - então assumo que você tenha essa versão.

O SDCC da versão 3.2 em diante, procurou fazer alguma compatibilidade com o compilador XC da Microchip. Então, para chips mais modernos (18F em diante) a melhor técnica de declarar os fuses é utilizando a diretiva #pragma config

/* para PIC18F252... */
#define _p18f252
#include "pic18fregs.h"

#pragma config OSC=HS, OSCS=OFF, PWRT=OFF, BOR=OFF, WDT=OFF, CCP2MUX=OFF, LVP=OFF, CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF

/* ... */

As chaves acima, possuem definições bem definidas nos arquivos .inc que estão nos diretórios do gputils!

Para microcontroladores antigos, ainda vale a antiga forma de declarar, que é mais confusa de todas (pode variar de compilador para compilador).

/* Para PIC16F88 */
#define _p16f88
#include "pic16regs.h"

typedef unsigned int config;

config __at _CONFIG1 conf1=_HS_OSC & _PWRTE_OFF & _BOREN_OFF & _BODEN_OFF & _WDT_OFF & _MCLR_ON;

/* ... */


No caso acima, os registros dos valores e nome das configs, podem ser encontrados no .h respectivo de seu processador (no caso pic16f88.h no diretório de include do SDCC)

NOTA: Dá para usar processadores mais modernos com a notação antiga. Aumenta a confusão e o compilador irá mostrar uma mensagem de warning... mas pode ser ignorado. :)

Free e Non-Free

Alguma coisa mudou e alguém teve que fazer algum ajuste de conduta. Nos novos compiladores SDCC, se você procurar no diretório include ( C:\...\SDCC\include ) você não vai encontrar NENHUM header de pic algum. Somente os wrappers (pic16fregs.h, pic14regs.h, ...). Onde foram parar p16f*, p18f*?

No próprio diretório do SDCC tem um diretório chamado non-free. Lá estão os headers de cada microcontrolador.

VOCÊ NÃO PRECISA FAZER NADA!!! Não precisa copiar os arquivos ou inventar que está organizando o SDCC... não cometa bobagens.

Para fazer compilar o programa, basta passar na linha de comando a flag --use-non-free e pronto. O SDCC vai achar normalmente!

Sem --use-non-free:

c:\Development\SDCC>sdcc -p16f88 -mpic14  blink.c
In file included from blink.c:6:
C:/PROGRA~1/SDCC/bin/../include/pic14/pic16regs.h:163:24: error: pic16f88.h: No
such file or directory
blink.c:14: error 20: Undefined identifier '_CONFIG1'
blink.c:14: error 2: Initializer element is not constant
blink.c:18: error 20: Undefined identifier 'TRISB'
blink.c:20: error 20: Undefined identifier 'PORTB'
blink.c:20: error 20: Undefined identifier 'PORTB'

Deu erro! :(

Com o --use-non-free:

c:\Development\SDCC>sdcc --use-non-free -p16f88 -mpic14  blink.c
message: using default linker script "C:\Program Files (x86)\gputils\lkr\16f88_g.lkr"

c:\Development\SDCC>


Funciona! :)

---

Próximo tópico: Vetores de interrupção

PIColino - Development Board para PIC - Protótipo

Chegou hoje as placas! :) Ficaram fantásticas e tudo conforme eu havia desenhado.

Veja abaixo a foto.

Montei rapidinho pois havia em casa os componentes. O PIC está rodando a 16MHz (depois troco para um cristal de 20MHz).

Por enquanto não tem bootloader, mas já estou estudando formas de desenvolver um que seja facilmente integrado ao SDCC (hoje descobri algumas limitações... conto em outro post).

[Update: 1o. de Agosto] - Agora sim, o PIColino tem um bootloader (que o chamo de Yablo). Leia nesse post as informações do Yablo: http://mmc-zaap.blogspot.com.br/2013/07/yablo-yet-another-bootloader-english.html Está em inglês, e nesse outro local, o projeto no Google Code: https://code.google.com/p/yablo/

Programa de Inauguração

#define __18F252
#include "pic18fregs.h"
#include "delay.h"

#pragma config OSC=HS, PWRT=OFF, BOR=OFF, WDT=OFF, CCP2MUX=OFF, LVP=OFF, CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF

int main()
{
 TRISB=0x7F;
 while(1) {
  PORTB=(PORTB^0x80);
delay10ktcy(500);
 }
}



Compilado e carregado (via MPLAB/ICD2), esse programa simplesmente irá fazer um led (L) piscar. Veja o video de demonstração


Próximos passos: Bootloader e mais SDCC! Bem vindo Picolino!!!

quarta-feira, 26 de junho de 2013

Ambiente de Desenvolvimento para PIC: SDCC+GPUtils

À medida que ficamos mais exigentes com os microcontroladores as complexidades começam a aparecer. Programar em Assembly começa a deixar espaços para algo mais produtivos... então vamos para um compilador.

Naturalmente pensa-se em C. Mas de qual fabricante? Bom o objetivo desse post não é tecer um comparativo entre uns e outros. Cada um tem uma visão de como tratar o código. Eu escolhi o SDCC por ser o mais disponível de todos. (É gratuito).

O SDCC


O SDCC surgiu como um projeto para a criação de um compilador que pelo menos facilitasse a vida de portar código entre diferentes microcontroladores (retargettable compiler). Vamos deixar de utopias, mas isso é praticamente impossível a menos que tenha uma camada que abstraia o processador. O SDCC suporta muitos dos microcontroladores comuns: PIC(8bits, 16bits), 8051, HC08, Z80. Com uma ou outra alteração que atenda às características intrínsecas do microcontrolador, podemos ter um código até razoavelmente portável...

Bom, mais informações sobre o projeto do sdcc: http://sdcc.sourceforge.net/

O problema do SDCC é que o manual é escasso e confuso. O projeto é bem intencionado. Tenho acompanhado as listas de developers por longa data e muito daquelas pessoas têm dado uma constante dedicação para criar e manter um produto com grande qualidade (Parabéns/Congrats/KUDO's). Para quem está iniciando programar com vistas ao SDCC, configurar o ambient e se achar nele é uma novela.

GPUtils


Não vou falar muito do projeto GPUtils pois pouco tenho interagido com o grupo que o desenvolve. Mas é uma alternativa para o MPASM (da microchip) e têm tido muito sucesso. Eu chamo o GPUtils de backend de PIC do SDCC.

O SDCC não gera código HEX. Mas gera o código assembly necessário para que o GPUtils/gpasm possa tratar e gerar o .HEX.

SDCC+GPUTILS: Instalação


Não vou ser purista em ambiente de desenvolvimento. Esse post é para instalações baseadas em WINDOWS. Fora a instalação que é específica para esse ambiente, o restante se aplica a qualquer sistema operacional.

Baixe e Instale o SDCC do site http://sourceforge.net/projects/sdcc/files/
Durante a instalação NÃO DEIXE QUE O INSTALADOR ADICIONE O SDCC AO PATH; e anote onde ele instalou!


Baixe e Instale o GPUtils do site http://sourceforge.net/projects/gputils/files/
Durate a instalação NÃO DEIXE QUE O INSTALADOR ADICIONE O SDCC AO PATH; e anote onde ele instalou!

Por que não deixar adicionar? Simples. No Windows ele irá colocar os caminhos como "C:\Program Files..." isto é com espaço em branco e isso dá dor de cabeça depois! :) Além do que, os utilitários do SDCC e GPUtils poderão gerar conflitos com os utilitários do Windows/DOS. Ok?

Nota: Estou assumindo que GPUtils e SDCC serão instalado no diretório padrão (C:\Program Files\...).

Configuração do Ambiente

Eu recomendo criar um arquivinho .CMD dentro do diretório bin do SDCC. Por exemplo, no meu sistema, o SDCC está instalado em c:\Program Files\SDCC; então eu tenho um arquivo C:\Program Files\SDCC\bin\setEnv.cmd com o seguinte conteúdo:

@echo OFF

echo SDCC Development Environment Setup
echo.

SET PATH=C:\WINDOWS;C:\WINDOWS\SYSTEM32
SET PATH=C:\PROGRA~1\SDCC\bin;%PATH%
SET PATH=C:\PROGRA~2\GPUTILS\bin;%PATH%


No Desktop, um atalho para o prompt do DOS (c:\Windows\System32\cmd.exe) com os parâmetros setados conforme  abaixo:



Nome/Name: SDCC Command Prompt
Destino/Target: C:\Windows\System32\cmd.exe /K ""c:\Program files\SDCC\bin\setenv.cmd""
Iniciar em/Start In: C:\Development\SDCC

Explicando...


O arquivo setenv.cmd é o acionador do nosso shell de desenvolvimento. Ele possui as principais entradas para configurar o ambiente tendo acesso ao básico do DOS, mais o SDCC e o GPUTILS. Se for necessário adicionar um outro caminho para algum utilitário que queira usar no desenvolvimento de seus códigos, em vez de poluir o PATH global do sistema, aqui é um bom lugar!

PROGRA~1, PROGRA~2? é... lembra que eu falei sobre nao deixar o windows adicionar o path? Pois bem, existe uma condição (digamos assim) que faz com que o sdcc tenha problemas durante a compilação/linkedição por causa dos espaços em branco. No meu sistema, "C:\Program Files" é registrado (convenção DOS 8.3) como c:\PROGRA~1, e é onde está o SDCC. "C:\Program Files (x86)" é c:\PROGRA~2. É onde encontra-se o GPUtils.

C:\Development\SDCC? Você não me falou disso! É o meu diretório de desenvolvimento. Crie um e coloque o startup do atalho apontanto para ele.


Para ver os nomes do seu sistema assim, abra o prompt do DOS e digite DIR /X :)

Testando...


Se fez como eu disse, você vai ter ter:
- No desktop: O atalho do Prompt do DOS - Agora SDCC Command Prompt;
- Dentro do \bin o arquivo setenv.cmd apontando para os locais corretos

Duplo clique no SDCC Command Prompt e...




Bingo!

Crie um pequeno programa: blink.c

#define __18F252
#include "pic18fregs.h"

#pragma config OSC=HS, OSCS=OFF, PWRT=OFF, BOR=OFF, WDT=OFF, CCP2MUX=OFF, LVP=ON, CP0=OFF, CP1=OFF, CP2=OFF, CP3=OFF

int main()
{
TRISB=0xFD;
while(1) {
PORTB=(PORTB^0x02);
}

}

Salve e compile

c:\Development\SDCC>sdcc --use-non-free -mpic16 -p18f252 blink.c
message: using default linker script "C:\Program Files (x86)\gputils\lkr\18f252_g.lkr"

c:\Development\SDCC>

Ignore a mensage do linker script - NÃO É ERRO! Inspecione o diretório (dir)

c:\Development\SDCC> dir
 Volume in drive C has no label.
 Volume Serial Number is 88EE-897E

 Directory of c:\Development\SDCC

06/26/2013  04:29 PM             .

06/26/2013  04:29 PM             ..

06/26/2013  04:29 PM             4,198 blink.asm
06/26/2013  03:03 PM               238 blink.c
06/26/2013  04:29 PM             8,192 blink.cod
06/26/2013  04:29 PM               630 blink.hex
06/26/2013  04:29 PM            13,111 blink.lst
06/26/2013  04:29 PM             4,833 blink.o
               6 File(s)         31,202 bytes
               2 Dir(s)  165,685,358,592 bytes free


All done! Você já tem um .HEX para queimar no PIC (não faça isso ainda, os fuses estão "a la loca"!):)

--//--

Próximos posts: Picolino (minhas placas chegaram!!!), Programação para PIC usando SDCC

sexta-feira, 7 de junho de 2013

PIColino - Development Board para PIC

Mais um projeto que estou encabeçando, apresento-lhes em primeira mão o Picolino! Dá até para ter idéia né?!

Muitos já procuraram por aí uma placa de desenvolvimento com a versatilidade do Arduino, mas, para a família de microcontroladores PIC essa busca nunca é satisfatória por diversos fatores, dentre eles cito o custo e design. Talvez o que mais chegue perto é o ChipKit. Mas não vou entrar nesses assuntos agora.

A minha proposta é apresentar para vocês um projeto novo e acredito que vai ajudar bastante muita gente nos trabalhos de conclusão de curso. É o Picolino, uma placa QUASE  compatível com o conhecido Arduino... Mas o core dele é um PIC da famila 18F de 28 pinos.

O Picolino

O hardware do Picolino deverá possuir as seguintes características:
  • Alguma Compatibilidade (pin/pin) com shields Arduino;
  • Clock de 20MHz ou mais (isso garantirá no máximo 5MIPS para as famílias PIC18F ou 1MIPS/MHz em PIC24 e PIC32)
  • Porta Serial RS232 nativo (ainda insisto no RS232, apesar do USB estar começando a aparecer com mais frequencia);
  • Simples de usar, simples de implementar;
  • Compacto: "best fit" na categoria.(aproveita o mesmo layoute do Arduino, só que espelhado)

Por design do microcontrolador, aparecerão as restrições:
  • Ausencia de PWM pins. Terá que ser feito via software!
  • I2C pins e RXTX em localização diferente do arduino
  • Programação via conector próprio (Sem bootloader ainda)
  • 5 portos AD (em vez de 6 no arduino) (mesmo trazendo 6 pinos no conector RA)
  • SPI (MISO/MOSI/SCLK/SS) via software apenas!

Mesmo com algumas restrições que o afastam ainda mais do Arduino, o projeto parece ser promissor. Haja visto que existe uma base de conhecimento imensa usando PIC tais como compiladores, livros didáticos e muitos outros recursos de software.

Ser "best fit" na categoria significa que ele provê o máximo de funcionalidade possível e que pelo menos, num projeto de tamanho razoável (controle de iluminação, temperatura, controles pequenos), pelo menos 50% da sua capacidade seja usada. Isto é, o seu integrado e suas funcionalidades não tenham pinos desperdiçados!

Escolhi a família de microcontroladores PIC18F sendo a placa base, compatível com os seguintes microcontroladores:

PIC18F2520
PIC18F2550
PIC18F2580
PIC18F26K20
CPU clk (max)
40
48
40
64
CPU clk (MIPS)
10
12
10
16
MEM (CODE)
32K
32K
32K
64
MEM (RAM)
1.5K
2K
1.5K
3.5K
MEM (EEPROM)
256
256
256
1K
IO PINS
25
24
25
25
AD converters
10
10
8
10
Timers
4
4
4
4
PWM
2
2
1
1
RS232
Y
Y
Y
Y
I2C
Y
Y
Y
Y
SPI
Y
Y
Y
Y
USB

Y


CAN


Y

LIN
Y
Y
Y
Y


 Ainda tem o PIC18F252 que ficou de fora da comparação. Mas é tirar um e colocar outro no lugar. 

Especial atenção para quem utilizar PIC18F2550: O pino RC3 é perdido pois nesse chip ele é usado para ser referencia de VUSB!

Protótipo

Não costumo perder tempo nos meus projetos. Sempre que começo a pensar, já tenho que implementar algo que possa ser facilmente realizável e entender as suas dificuldades. Então temos abaixo o esquema inicial do protótipo. Parece promissor.

Surpresa!!! Saiba que o picolino tem quase a mesma configuração de pinos de um AVR, só que espelhado...  Isso cria uma nova e interessante solução. conector do Arduino tem que ser colocado no lado da solda. Sendo assim fica pro lado dos componentes o conector dos shields Picolino

Mandei hoje (06/06/2013) a requisição para cotação da manufatura de 6 protótipos... quer ver como ele vai ficar?


Os componentes nessa fase são through hole. Futuras versões virão mais compactos. Usarei SMD.

Agora a surpresa... Saiba que o Picolino tem quase a mesma configuração de pinos de um Arduino, só que espelhado...  Isso cria uma nova e interessante solução: - conector do Arduino tem que ser colocado no lado da solda. Sendo assim fica pro lado dos componentes o conector dos shields Picolino, veja o esquema abaixo:

   .Picolino. Arduino Shield
   .    |   .  
=|-.   =|=  . -|=-|=
[| .   [|   .  |] |
<| .   [|   .  || | 
=|-.   =|=  . -|=-|=
   .    |   .
O desenho não ficou bom..

Ambiente de Programação

Esse é um assunto delicado. Pois desenvolver hardware e software ao mesmo tempo é algo complexo e demanda muito tempo... não tenho equipe comigo nisso. Então vamos fazer assim.

Fica o leitor liberado para usar o que quiser, mas desde que tenha possibilidade de escrever o firmware através do porto ICSP da placa. 

Em paralelo, vou estar trabalhando com uma frente: SDCC. Onde criarei wrappers que facilitem a programação. Em seguida o bootloader. Fica o leitor liberado para usar com toda liberdade. 

--//--

Quando chegar as placas do Picolino, eu atualizo este post...  :)