Seu primeiro projeto com um microcontrolador!

Nesse post vou ensinar a fazer um led temporizado com o PIC16F876A, nosso companheiro até o fim do curso.

1: Preparando o projeto.

Para criar o código-fonte, abra o MikroBasic e siga a sequência de imagens a seguir

 Clique em New project
















Clique em next

















Em Project Name, você vai digitar o nome do projeto, aqui no caso, Projeto_1. Não use espaço ao digitar o nome! Em Project Folder, você vai escolher a pasta onde o projeto, o código-fonte e o arquivo .hex será salvo. Device Name você vai escolher o MCU utilizado, aqui como já falei, o PIC16F876A (tem que ter o A no final) e por último em Device Clock você irá colocar a frequência de clock do MCU (se vc leu as apostilas das aulas anteriores sabe o que é isso), que aqui será de 4.096 MHz e então clique em Next
















Clique em Next

















Verifique se a opção Include All está marcada. A opção Include None fará com que você escolha as bibliotecas utilizadas no projeto, o que fará a compilação ser mais rapida, mas como ela demora apenas segundos, não temos porque usar essa opção (o que também deixaria vocês confusos e a coisa seria mais complicada). Clique em Next

















Marque essa opção e então clique em Finish















Essa janela irá aparecer: é onde os Fusíveis serão configurados (novamente, se vc não leu as apostilas passadas, você não fará a mínima idéia do que é isso).
Aqui a coisa vai ser longa:

-Oscillator Selection: você selecionará o tipo de oscilador para o clock. Esse trabalho é feito automaticamente em caso do uso de cristais:
LS: Cristais com menos de 2MHz de frequência (se não me engano);
XT: Cristais até 4MHz;
HS: Cristais maiores que 4MHz e;
RC: Oscilador feito com um resistor e um capacitor. Usado quando nao se é nescessário uma precisão no tempo do programa. Por padrão, usaremos até o fim do curso um cristal de 4.096 MHz, que no caso fica configurado em HS;

-WatchDog Timer: reseta o PIC caso ele trave. Não será usado nos nossos projetos;

-Power-Up Timer: Temporizador que proteje o PIC em caso de oscilações na alimentação. Complementa o trabalho do Brown-Out Reset. Fica desabilitado;

-Brown-Out Reset: Desliga o PIC quando a tensão cai para um certo nível, protegendo o PIC quando for desligado o circuito (queda de tensão devido ao capacitor de filtro que descarrega lentamente quando deligada a fonte). Fica habilitado!;

-LVP: Low Voltage Programmer (programador de baixa tensão): Será usado apenas com gravadores USB. Como o nosso é serial, deve ficar DESABILITADO, caso contrário, você não conseguirá gravar o PIC;

-Data EEPROM Memory Code protection: Protege o código da memória EEPROM contra leitura/cópia. Fica desabilitada!;

-Flash Program Memory Write: Permite ao código se auto-modificar. Fica desabilitado;

-In-Circuit Debugger Mode: Usado apenas em programadores com a função Debugger. Fica desabilitado e;

-Flash Program Memory Code Protection: Protege a memória Flash (onde fica o programa) de ser lida/copiada. Fica desabilitada!

Se por acaso você habilitar a proteção das memórias, quando o IC-Prog for verificar erros na gravação, ele sempre irá acusar o código 0000h, que indica que o PIC não pode ser lido/programado.

Confira o modelo do PIC e a frequẽncia do clock  e pronto! Clique em OK. 

2-Escrevendo o código-fonte.

Aqui começa o legal: escrever, gravar e ver o resultado.
Quando você acabar de configurar os fusíveis, verá essa tela:














É aí que você irá digitar seu código (a sua tela vai ter algumas coisas que na minha não aparece, mas não se preocupe!)

Veja que o programa está assim:














Em Declaration Sections, você irá declarar as variáveis, configuração de algumas bibliotecas, sub procedimentos e etc. (tudo será explicado mais a frente) e em Main Program, o programa principal, que será esse:






















Começamos em Program Projeto_1. Aqui é declarado o nome do programa, que é automaticamento escrito quando se cria o projeto.
Seguimos com main:, que define onde começa o programa principal.
Passamos para TRISB, que é o nome do registrador que configura os pinos do PORTB como entrada (1) ou saída (0). Veja que usei TRISB=%. Esse % é usado para configurar o registrador em modo binário (o que é fácil se você não tiver prátical com Hexadecimais), onde a configuração fica assim:

TRISx=%(PORTx.7)(PORTx.6)(PORTx.5)...(PORTx.0) Onde x é o nome do PORT, no caso do PIC16F876A vai de PORTA até PORTC.
___________________________________________________________________________________

Como escrever em hexadecimal?

Você pode usar calculadoras online ou treinar vc mesmo. Faça assim:
Divida seu byte em dois nibbles (meio byte ou 4 bits) vai ficar algo assim:
Byte: 01011001
Em Nibbles: 0101  1001
Agora Converta cada nibble usando a seguinte tabela

0000=0
0001=1
0010=2
0011=3
0100=4
0101=5
0110=6
0111=7
1000=8
1001=9
1010=A
1011=B
1100=C
1101=D
1110=E
1111=F

no nosso caso, o byte ficaria 59. Para ser escrito no programa ficaria como por exemplo PORTA=$59 ou PORTA=0x59. Viu? fácil. Mas se for preguiçoso, use esse link, clique em binário e digite seu byte.
___________________________________________________________________________________

O While é um statement (você pode ler mais sobre os statements no manual do mikrobasic, que possui uma grande referencia sobre a linguagem dele) que é fechado pelo Wend. Esse While executa um determinaod comando (ou série deles) enquanto uma afirmação for verdadeira. No nosso caso, ao lado do While coloquei o TRUE, que faz com que o while vire um loop infinito, ou seja, o programa executa eternamente.
Em seguida temos o statement IF, que executa um comando (ou série deles) caso uma afirmação seja verdadeira. O IF é escrito da seguinte forma

IF (afirmação) THEN
...
ELSE
...
END IF

e o while

WHILE (afirmação)
...
wend

Então,  traduzindo o código dentro do IF:

SE PORTB.0 for igual a 0 ENTÃO
Põe o PORTB.1 em 1
espera 1 segundo (1000 milisegundos)
SENÃO
Põe o PROTB.1 em 0
FIM DO IF

A função delay_ms faz que o programa espere x milisegundos, ou no delay_us, x microsegundos.

Após o END IF, que encerra o statement IF, temos o wend pra fechar o While e o end., que define o fim do programa. É OBRIGATÓRIO ESSE END. COM O PONTO FINAL.

Quando terminarem de digitar, apertem control+s para salvar e control+F9 para compilar, que é o que irá gerar o hex. Se tudo estiver certo, você verá algo assim:



Se tiver algum erro, ele vai te levar até o erro e dizer o que está errado. reveja o código.

O circuito é simples e pode ser montado em uma protoboard:



S1 e R1 formam o circuito de reset manual, que pode ser usado em caso do programa travar (o que não vai acontecer em programas simples), mas já é bom vcs se acustumarem. Se quiser omitir, ligue direto o pino 1 no Vdd (que deve ser de +5Vdc).
R3 é um resistor de pull-up (se tivesse ligado no negativo, seria pull-down), para evitar que o valor no pino do PIC fique "flutuando". Liguei o negativo do LED no PIC pra fazer diferente mas nada impede que o positivo fosse ligado no PIC, apenas teria de haver mudanças no código onde define o valor do pino do PORTB que é saída  (que está DENTRO do IF. Onde e 0 vira 1 e vice-versa).

Abra o IC-Prog, vá em file --> open file e procure a pasta do programa e clique no arquivo que termina em .hex (Projeto_1.hex), conecte o programador na porta serial, aperte F3 e em programmer clique em JDM programmer e em ports, selecione a porta serial que vc está usando. CLique em OK, selecione o modelo do seu PIC e aperte F5 e em yes e espere terminar. Se tudo ocorrer direito, aparecerá uma mensagem dizendo "Device was sucefully verified!", se não, verifique as conexões, se o PIC está inserido corretamente, e caso tudo esteja certo, seu PIC está queimado. Se vc por ele errado no gravador/circuito, vc irá queimá-lo!!!.




3: Usando os resistores de pull-up internos.
Alguns modelos de PIC contam com resistores de pull-up internos, como o nosso PIC. Caso sejam ativados, o resistor de pull-up que está ligado no botão seria omitido, liberando assim espaço no circuito. Para isso, devemos acioná-los através do registrador OPTION_REG (mais informações olhe no datasheet do PIC). O bit responsável é o bit 7, ou RBUP, como pode se ver na figura seguinte:



 Aqui vai mais uma coisa no código: quando se quer definir o valor de poucos bits de um registrador, para não configurar toodo o registrador, podemos acessar apenas um determinado Bit, como por exemplo: queremos configurar o 7º bit do OPTION_REG, então o código fica OPTION_REG.7=0. Perceba que colocamos o nome do registrador, um ponto e o bit e então definimos seu valor, no caso aqui é o 0, que arma os resistores de pull-up.
"AH!, Mas apenas um pino é entrada e o resto é saída. Como todas os pinos do PORTB tem resistor um de pull-up, não vai ter problemas se eu armar eles?" Não, pois quando vc arma, ele detecta quais pinos são entrada pela configuração do TRISB e arma os resistores só nos pinos de entrada. Se você prestou atenção, esse modo de selecinar apenas um bit do registrador foi a mesma coisa que eu fiz no codigo pra ligar e desligar um pino do PIC: PORTB.1=0 ou 1. PORTB é o registrador da porta, que define ligado (1) ou desligado (0)!
Se for usar resistores de pull-up, o código fica assim:






















Veja que não muda nada! Apenas acrescentamos o OPTION_REG.7=0! O circuito é o mesmo, apenas deve-se tirar o R3.
É isso. Espero que funcione, que vocês gostem e se impolguem com esse 1º de muitos circuitos. Esse foi simples, mas vai ficando cada vez mais implementado.
Dúvidas ou problemas falem ai.
ATENÇÃO! QUEM ENVIAR VIDEOS/FOTOS DAS MONTAGENS E DO CIRCUITO FUNCIONANDO, VAI GANHAR BRINDES DURANTE A SÉRIE!!!
Até a próxima...

Comentários

  1. boa tarde porque nao faço tudo correto meu arquivo nao salva em HEX

    ResponderExcluir
    Respostas
    1. Ele só gera o hex se o código estiver certo. Veja se tem erros (lembre-se que o .HEX é gerado com o control+F9)

      Excluir

Postar um comentário