Boa noite a todos, então aqui vai uma introdução muito básica de como começar a programar em C um arduino, quem diz arduino diz qualquer outro micro-controlador atmel, mas por agora digamos que é arduino pois é para quem quiser dar o salto do ide do arduino para algo melhor.
Primeiro temos de começar por instalar o AvrStudio, que é o IDE oficial da atmel e que podem fazer o download do mesmo aqui:
http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725
Andam com a página para baixo até encontrarem a linha que diz:
AVR Studio 4.18 (build 684) (116 MB, updated 11/09)
Têm de se registar para fazer o download do mesmo, mas o registo é rápido, depois fazem o download do seguinte ficheiro(que está pouco acima do outro):
AVR Studio 4.18 SP3 (b716) (31 MB, updated 9/10)
E por fim fazem o download do WinAvr que é o compilador C para os avrs, e que se encontra aqui:
http://sourceforge.net/projects/winavr/files/WinAVR/20100110/WinAVR-20100110-install.exe/download
Depois de fazerem o download destes 3 ficheiros podem começar a instalação, primeiramente o ficheiro intitulado AVR Studio 4.18 depois o AVR Studio 4.18 SP3 e por fim do WinAvr, não mudem nenhuma das pastas de instalação quer do AvrStudio quer do WinAvr pois poderam ter problemas com a compilação pois o WinAvr espera que as bibliotecas estejam num sitio e não noutro e não querem ir editar Makefiles para o meter a funcionar.
No fim de tudo instalado recomendo que criem uma pasta onde vão guardar os programas feitos ao longo deste tutorial, aconselho a colocar a pasta logo em c:/ ou d:/ pois vamos andar na linha de comandos e quanto menos sub pastas melhor, aconselho a fazer como eu e criar uma pasta chamada AVR em c:/ e é ai que vão ficar os programas quer em C, quer todos os ficheiros gerados pelo compilador, depois o IDE encarrega-se de criar uma pasta por cada projecto que criam, por isso fica tudo separado e organizado.
Tendo tudo isto instalado podem começar por iniciar o AvrStudio e irá aparecer-vos a seguinte janela:
De seguida clicam em "New Project" e a janela passa a mostrar a seguinte informação:
Como irão notar eu já preenchi alguns dos campos e voces devem fazer tal e qual como está na imagem.
O "Project Name" neste caso é blinky, o famoso piscar um led, simples mas no entanto serve para vos iniciar neste novo mundo, quando estão a escrever blinky no "Project Name" podem notar que o programa copia automaticamente o que escrevem para o campo Initial file.
Devem tambem selecionar as caixas "Create initial file" e "Create folder", assim o programa deixa-vos tudo arrumado e pronto a programar, e por fim devem selecionar "AVR GCC" no "Project type" pois querem programar em C e não em Assembly.
Não esquecer de mudar a localização("Location") para a pasta anteriormente criada em c:/.
Tendo tudo isto feito cliquem em "Next >>", ao clicar vais-vos aparecer duas listas:
Como podem ver pela imagem selecionem "AVR Simulator 2" como a "Debug platform" e seleccionem o "ATmega328p" como o "Device" pois é esse o chip que o arduino trás, se o vosso for um dos arduinos com um ATmega168p procedam de igual modo para a "Debug platform" mas no "Device" nem precisam de andar para baixo na lista, pois o ATmega168p aparece logo no inicio da lista.
Tendo o vosso chip seleccionado cliquem em "Finish" e ai está o vosso projecto pronto para começarem a programar em C.
Eis o aspecto do IDE quando clicam em "Finish":
Agora é começar a escrever código, neste caso é algo bastante simples:
Loop infinito{
Acender led;
esperar 1s;
Apagar led;
esperar 1s;
}
Primeiramente e ao contrário do IDE do arduino que faz muitas coisas sem nós saber-mos temos que dizer ao compilador para incluir alguns ficheiros, um deles é um ficheiro com as definições genéricas de registos e portos do nosso chip, outro á uma biblioteca que nos permite criar os delays que precisamos para esperar neste caso 1s.
Como podemos ter o nosso atmega328p com um grande numero de diferentes cristais de diferentes frequências temos de dizer ao compilador qual é a frequência do nosso cristal para que ele saiba gerar delays com precisão.
Assim ainda no pseudo código teremos então:
Incluir os ficheiros necessários
Definir a frequência do relógio/cristal
Incluir biblioteca de delays
Loop infinito{
Acender led;
esperar 1s;
Apagar led;
esperar 1s;
}
Começando agora a passar um pouco para c:
#include <avr/io.h> //Definições dos portos do m328p, assim pudemos usar os portos para controlar o led
#define F_CPU 16000000UL //F_CPU é uma constante especifica do compilador que serve para armazenar a frequencia do nosso cristal, 16000000 é os 16Mhz escritos em hz, e UL é uma indicação de que queremos o numero representado por uma variavel capaz de o armazenar para não termos problemas de overflow se o compilador usar uma variavel em que o numero não cabe
#include <util/delay.h> //Biblioteca que nos fornece o delay, tem de ser sempre declarada depois da declaração de F_CPU e não antes, se não o compilador não sabe qual é a frequencia do nosso cristal
Loop infinito{
Acender led;
esperar 1s;
Apagar led;
esperar 1s;
}
Agora que já dissemos ao compilador o que ele tem de ir buscar fora do nosso programa vamos passar para C o nosso pseudo-código:
#include <avr/io.h> //Definições dos portos do m328p, assim pudemos usar os portos para controlar o led
#define F_CPU 16000000UL //F_CPU é uma constante especifica do compilador que serve para armazenar a frequencia do nosso cristal, 16000000 é os 16Mhz escritos em hz, e UL é uma indicação de que queremos o numero representado por uma variavel capaz de o armazenar para não termos problemas de overflow se o compilador usar uma variavel em que o numero não cabe
#include <util/delay.h> //Biblioteca que nos fornece o delay, tem de ser sempre declarada depois da declaração de F_CPU e não antes, se não o compilador não sabe qual é a frequencia do nosso cristal
int main(void){
while(1){ //Loop infinito{
PORTB |= (1<<PB5); //Acender led; vamos usar o led que está no pin13 do arduino
_delay_ms(1000); //esperar 1s; como são milisegundos, temos de esperar 1000ms para fazer 1s
PORTB &= ~(1<<PB5); //Apagar led;
_delay_ms(1000); //esperar 1s;
}
}
Por esta imagem podem relacionar os nomes que o arduino dá aos pinos com os nomes verdadeiros dos mesmos quando querem usar o AvrStudio.
Ainda falta uma coisa, tal como no arduino temos que definir se um pino é uma entrada ou uma saída, para isso usamos uma coisa chamada DDR, que é um registo que define se um pino é entrada ou saída, no caso do AVR 1 quer dizer saída e 0 quer dizer entrada, para isso vamos definir o nosso pino numero 5 do porto B como uma entrada assim:
DDRB |= (1<<PB5);
E o nosso código final fica assim:
#include <avr/io.h> //Definições dos portos do m328p, assim pudemos usar os portos para controlar o led
#define F_CPU 16000000UL //F_CPU é uma constante especifica do compilador que serve para armazenar a frequencia do nosso cristal, 16000000 é os 16Mhz escritos em hz, e UL é uma indicação de que queremos o numero representado por uma variavel capaz de o armazenar para não termos problemas de overflow se o compilador usar uma variavel em que o numero não cabe
#include <util/delay.h> //Biblioteca que nos fornece o delay, tem de ser sempre declarada depois da declaração de F_CPU e não antes, se não o compilador não sabe qual é a frequencia do nosso cristal
int main(void){
DDRB |= (1<<PB5); //Definir o pin digital 13/PORTB5 como saida para pudermos piscar o nosso led
while(1){ //Loop infinito{
PORTB |= (1<<PB5); //Acender led; vamos usar o led que está no pin13 do arduino
_delay_ms(1000); //esperar 1s; como são milisegundos, temos de esperar 1000ms para fazer 1s
PORTB &= ~(1<<PB5); //Apagar led;
_delay_ms(1000); //esperar 1s;
}
}
Basta copiar este código para a janela do IDE e carregar em F7 que é o botão para compilar e o código deve compilar sem qualquer erro e deve aparecer algo assim:
Se de erro é porque se enganaram a copiar alguma coisa, certifiquem-se que os comentários que aqui aparecem em várias linhas no IDE só estão numa linha, se andarem um pouco para cima na janela com o nome Build poderão ver que este código ocupa 172bytes de flash, muito mas muito menos que o blinky do arduino ocupa.
Sei que é neste momento que muitos de vós ficam com um nó no cérebro por causa de coisas como o "|=" o "&=" e até mesmo o "<<", isso meus caros colegas são operadores lógicos e o melhor mesmo é ler um tutorial sobre eles pois é um assunto um pouco extenso, se vocês de dão bem com inglês recomendo este aqui, pois aprendi a partir dele:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=37871
Se mesmo assim não perceberem é só dizer que eu irei fazer o meu melhor para vos ensinar.
Agora vamos passar á parte de colocar o programa no arduino, como não estamos a usar o IDE do mesmo não temos o botão mágico para fazer o upload do programa para o atmega, mas em vez de termos um botão mágico vamos fazer nós mesmo o que o IDE do arduino não mostra, primeiro vamos começar por ir á barra Iniciar do
Windows, se estiverem a usar o Vista ou superior escrevam "Executar" e carreguem no icon azul que vos aparece com o nome "Executar":
Na janela que vos aparece escrevam cmd, que quer dizer linha de comandos do windows e cliquem em ok:
Ao clicar no ok vais-vos aparecer uma janela nova, a nossa querida linha de comandos, que vai ser a vossa nova companheira, pois é por ela que vão passar a fazer o upload dos programas para o arduino:
E agora se usaram a mesma pasta que eu usei, ou seja AVR e se a meteram no mesmo sitio escrevam o seguinte na linha de comandos:
cd/
e carreguem no enter
cd AVR
E carreguem no enter
cd blinky
E carreguem no enter
cd default
E carreguem no enter, eu sei que não criaram a pasta default mas é nessa pasta que está o nosso ficheiro .hex, ou seja o programa compilado pronto a enviar para o arduino, agora vem mais um pouco de magia, usando o ide do arduino vejam qual é a porta com a que o vosso arduino está associado quando o ligam ao pc.
O comando genérico para usar o avrdude é este:
avrdude -p m328p -c avrisp -P com* -b 57600 -F -U flash:w:Nome do hex.hex
No meu caso a porta com é a com5 e neste exemplo o nosso programa chama-se blinky logo o hex tem o nome de blinky.hex, se não tiverem a certeza escrevam:
dir
E façam enter, como podem ver ali está o Blinky.hex, tenham atenção que o avrdude é sensível a letras maiúsculas e minúsculas:
Então para enviar este programa para o nosso arduino escreve-mos o seguinte na linha de comandos:
avrdude -p m328p -c avrisp -P com5 -b 57600 -F -U flash:w:Blinky.hex
E carreguem no enter, a única diferença aqui é que terão de carregar no botão de reset do arduino para que o upload do programa seja feito, se não irão obter um erro de "out of sync" ou algo parecido, quando o upload do programa é bem sucedido eis a mensagem que vos é apresentada:
Agora podem olhar para o vosso arduino a piscar o seu led todo contente da vida com uma tonelada de código a menos em cima, e espero que vocês tenham gostado de ler esta introdução ao avr-gcc usando o AvrStudio, se houver interesse irei continuar com uma série de tutoriais simplificados e muito explicados, estou aberto a sugestões pessoal!