Este artigo irá demonstrar como o GNU/Linux pode ser uma plataforma de desenvolvimento de programas para microcontroladores. O foco do artigo será como utilizar as ferramentas de compilação, simulação e gravação. Será explicado um pouco da teoria de programação para microcontroladores. Como exemplo, usaremos o microcontrolador PIC16F877.
Agora que temos as ferramentas necessárias instaladas, vamos
programar. Programar microcontroladores não é complicado, é
trabalhoso. Gasta-se muito tempo lendo manuais para saber como
"setar os bits" para as coisa funcionarem. No compilador, temos
um header (arquivo .h) que define constantes que são mapas para
o endereço de memória das portas dos seu microcontrolador. Então
para ativar todos os 8 bits da porta D do seu PIC, basta colocar:
PORTD = 0b11111111;
PORTD = 0xff;
PORTD = 255;
No exemplo acima usei notação em binário, hexadecimal e decimal.
Todas tem o mesmo efeito. Use a que achar mais fácil. PORTD é uma
constante que aponta para o endereço de memória da porta D. Para
ativar apenas o terceiro bit da porta D, usa-se:
RD3 = 1;
O nome de todas as constantes estão dentro do diretório "include"
de onde instalamos o PICC Lite, no arquivo pic1687x.h, que é o usado
para PIC16F877. Segue um "alô mundo" que alterna os estados de
ligado e desligado de 2 bits da porta A:
01: #include <pic.h>
02:
03: int main (void)
04: {
05: int contador;
06:
07: RA0 = 0;
08: RA1 = 1;
09:
10: /* Desabilita Watchdog, para o mcontrolador nao
11: ficar resetando. Isso tem no pic1687x.h */
12: __CONFIG (WDTDIS);
13:
14: /* Configura a porta A como saida, manual do P16F877
15: pagina 29. Sem isso nao se consegue alterar os
16: valores dos bits da porta A */
17: TRISA = 0;
18:
19: while (1)
20: {
21: // Gera uma espera
22: for (contador = 1; contador < 30000; contador++);
23:
24: // Alterna estados entre os bits 0 e 1 da porta A
25: if (RA0 == 1)
26: {
27: RA0 = 0;
28: RA1 = 1;
29: }
30: else
31: {
32: RA0 = 1;
33: RA1 = 0;
34: }
35: }
36:
37: // Nunca chega aqui
38: return 0;
39: }
40:
Comentários:
Você deve estar achando estranho que não usei o header
pic1687x.h (linha 1) no include. O certo é usarmos apenas o
pic.h e passarmos qual microcontrolador usamos como parâmetro
do compilador. Isto deixa nosso código portável, desde que o
microcontrolador suporte os recursos usados no código.
Normalmente quanto menor o número do PIC, menos recursos ele
tem. Um código para PIC16F84 deve compilar para PIC16F877.
Watchdog é um recurso do PIC para ele resetar no caso
de travamento. É um contador que deve ser zerado regularmente.
Quando isto não ocorre (em caso de travamento), o contador
estoura e ocorre um reset. Como nosso programa é muito pequeno,
podemos desabilitar o Watchdog (linha 12).
Na linha 17 configuramos o registrador TRISA como 0 (decimal).
Isto equivale a colocarmos todos os 8 bits desta porta como 0.
Esta porta quando zerada, indica que a porta A é uma porta de
saída, então podemos alterar seus valores. Quando ela é de
entrada, só pode ser alterada por um mecanismo externo.
Observe que o programa roda dentro de um loop infinito (linha
19). É assim mesmo que funciona. O programa nunca deve chegar
ao fim, senão espere o inesperado. Nosso código fica alternando
os estados dos bits 0 e 1 da porta A eternamente. Nestas portas
poderiam estar ligados LEDs que ficariam piscando.
[2] Comentário enviado por jose_maria em 16/12/2004 - 08:28h
Parabéns pelo artigo.
Eu tenho alguns microcontroladores aqui e sempre tive curiosidade de como fazer isso no Linux. Eu já tinha pesquisado um pouco e tinha achado bastante coisa, mas não tinha colocado nada em prática.
Nessas férias eu vou práticar este artigo.
[4] Comentário enviado por Bentux em 16/12/2004 - 09:20h
Amigo, legal mesmo o seu artigo! Só tem a contribuir com o Open Hardware, quem sabe o pessoal se empolga e começamos a realizar projetos de placas ou dispositivos Open aqui no Brasil!? Valeu mesmo pela contribuição!!!
[5] Comentário enviado por cioban em 16/12/2004 - 13:34h
Muito bom o seu artigo,
Gostaria de saber se existe uma forma de programar em assembler para o microcontrolador 8051, eu tenho um kit para programar, e queria programar no LINUX.
[6] Comentário enviado por torque em 16/12/2004 - 14:34h
Este howto veio na hora certa, é uma área que há muito o que explorar, e na qual não se acha muita documentação a respeito em português, e muito menos para Linux.
[7] Comentário enviado por mandark_br em 16/12/2004 - 14:57h
Sérgio,
Não conheco muito Assembly, não pesquisei muito nesta área. Existe um compilador livre de C ANSI, chamado SDCC. Ele compila pra PIC e para 8051 dentre outros. Para PIC ele ainda não está legal, por isso não usei ele no artigo. Quando estiver maduro vou substituir o PICC por ele. Detalhe que ele compila pra Zilog Z80! Lembram do MSX?
[8] Comentário enviado por removido em 16/12/2004 - 15:37h
ok legal o artigo.. mas o que eh um microcontrolador??? Acho que faltou soh uma boa explicação sobre isso... se tiverem algum link para ler sobre eu agradeço!! Ninguem nasce sabendo neh! =)
[11] Comentário enviado por ercarnauba em 17/12/2004 - 09:44h
Parabéns pelo artigo!
É uma pena não ter muito material para programar a família 8051, no meu caso AT89C51 em linux :( , eu tenho todo material para o $ruindows$ para trabalhar com o bicho, só que eu confio muito mais no Linux :) .
Eu quero aproveitar esse espaço para pedir a ajuda de alguem q tb trabalho com uC 8051 em linux para me passar umas dicas...
[12] Comentário enviado por wagnerdequeiroz em 20/10/2006 - 20:25h
Pessoal estou comecando com 8051 tb e estou no mesmo barco. No entanto ja achei programador para 8051
falta achar simulador grafico
visitem o site www.asm51.eng.br para ver se aparecem novidades. Este é um forum de Microcontroladores onde podemos trocar informacoes sobre microcontroladores.
[16] Comentário enviado por mcleber em 19/02/2009 - 11:17h
Ficou muito legal seu artigo.. Todos os meus softwares de eletronica são para windows. A sorte é que para diagramas eletricos e algumas simulações já encontrei vários para linux. Agora preciso fazer minha ICD2 (gravadora de pic) rodar em linux. O problema será gravar dsPIC. No windows utilizo CCS com C30 + ICD2 gravando in-circuit...