Desenvolvendo para microcontroladores em GNU/Linux

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.

[ Hits: 103.561 ]

Por: Thiago Marcos P. Santos em 16/12/2004


Programando



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.

Página anterior     Próxima página

Páginas do artigo
   1. Compilador
   2. Simulador
   3. Gravador
   4. Programando
   5. Compilando
   6. Simulando
   7. Gravando
   8. Dicas
   9. Bibliografia
   10. Outros
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Criando aplicativos para o iPhone no Linux (sem Xcode e MacOS X)

Alocação dinâmica

A duplicação do buffer de saída na chamada de sistema fork() do Linux

Desenvolvendo aplicativo para autenticação biométrica utilizando a Libfprint

A poderosa nuvem: Intel® DevCloud com GPU Iris Xe Max!

  
Comentários
[1] Comentário enviado por kakaroto em 16/12/2004 - 01:42h

Cara, fico muito bom o seu howto, e numa área que nao temos muitos docs meus parabéns :)

[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.

[3] Comentário enviado por mandark_br em 16/12/2004 - 09:06h

Galera, segue um link com alguns códigos, inclusive um que mexe no LCD.
Também uma versão PDF do artigo:

http://www.rockpesado.com.br/artigos/microcontroladores_linux.tar.gz

Qualquer dúvida, só me falar!

[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.

Valeu,
Sérgio Cioban Filho

[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?

http://sdcc.sourceforge.net/

[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! =)

[9] Comentário enviado por willy_herman em 17/12/2004 - 01:30h

Cara, muito legal seu Artigo.
Gostaria de saber se voce possui algum livro/apostila/tutorial para me indicar pra programacao em C para PIC

[10] Comentário enviado por mandark_br em 17/12/2004 - 07:28h

Na parte Bibliografia do artigo estão indicados todos os documentos que usei para fazer o artigo. É o que recomendo.

Note que praticamente não há documentação em pt_BR sobre o assunto. Eu pelo menos não achei nada...

[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...

Mais uma vez, parabéns pelo artigo.

Ederson.

[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.

No momento:
http://www.geocities.com/dinceraydin/8051/ programador dos at892051

http://www.colargol.tihlde.hist.no/~jonah/el/avrp.html


simulador
http://sourceforge.net/projects/emu51/

e tem o SDCC e o UCSIM do sdcc que tb diz simular 8051 no linux.

http://wiki.eagle-usb.org/wakka.php?wiki=Asm8051
O link acima tem varios programas e informacoes interessantes para 8051


Wagner de Queiroz

[13] Comentário enviado por redebr2818 em 28/02/2007 - 11:30h

hehehe a exsto fica em frente a minha casa haha vo la comentar sobre gravaçao em linux hehe

[14] Comentário enviado por rafael### em 26/05/2007 - 21:09h

galera alguém conhece um simulador pra pic16f628?? grato :)

[15] Comentário enviado por GilsonDeElt em 22/06/2008 - 18:41h

mandark_bh, congratulations pelo artigo! =D

ficou d+ mesmo, bem completo e detalhado

os eletrônicos-under-linux (como eu) agradeçem =D

[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...

Abraço,

mcleber


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts