Manual
do
Maker
.
com
Os conceitos para manipulação de MCUs é basicamente o mesmo para Atmel e PIC, mas quando falamos de Arduino e PIC, as coisas já ficam um bocado diferentes. Para programar em PIC, existem algumas IDEs, tal qual MPLab e Mikroc, sendo que uso a Mikroc, devidamente licenciada. Considerando isso, vou dar algumas dicas de PIC importantes, para iniciantes utilizando essa IDE.
Primeiramente, quando iniciamos um novo projeto no Mikroc, a página de código tem basicamente isso:
void main(){
}
Como já citei algumas vezes, tal qual se faz com Arduino deverá ser feito em PIC para utilização de uma porta; configura-se a direção e levanta-se o pino.
Repare que nesse modelo temos dois controladores de portas; RA e RB. Se quero utilizar a porta RA2 como output para acender um LED, então utilizo as variáveis a seguir:
PORTA = 0;//OUTPUT
RA2_bit = 1; // levanta o pino
Apenas isso. No Arduino as portas estão dispostas em uma determinada ordem, de forma que os pinos analógicos deverão ser sempre os mesmo para programar na IDE. No PIC não, você pode usar qualquer porta como digital ou analógica. Então, supondo que eu quisesse utilizar a porta RA3 para ler um LDR e acender um LED somente quando atingisse determinada temperatura, eu teria que fazer uma nova configuração da porta A:PORTA = 0b00001000;
A porta RA3 foi configurada como INPUT. Agora deve-se dizer à MCU que a porta fará leitura analógica, então deve-se modificar o bit relacionado à porta RA3 em ANSELA:ANSELA = 0b00001000;
Os valores estão em bits, contados da direita para a esquerda e cada registrador tem 8 bits, sendo que alguns podem estar desabilitados. Em PICs menores (com 8 pinos por exemplo) não existem os mesmos recursos que em PICs maiores e os nomes das variáveis podem mudar um pouco, assim como para PICs maiores. Estou baseando esse exemplo em um PIC16F1827, que é a MCU sendo utilizada para o projeto em desenvolvimento nos posts atuais.
Sempre que possível, a melhor opção é fazer o aterramento no pino, invés de alimentar algo a partir dele. Isso porque drenar corrente do pino pode ser prejudicial para a MCU, caso haja uma sobrecarga ou diversos pinos tenham que fornecer a corrente e a soma total seja superior à corrente entrante na MCU.
Nesse caso, a respectiva porta permanece como OUTPUT, mas o pino em LOW fará o aterramento. Então, perceba que há 2 casos de configuração da porta como INPUT que me ocorrem no momento; leitura analógica e geração de PWM. O segundo caso veremos no próximo post que tratarei de controlar um servo motor.
Em alguns posts sou obrigado a configurar o clock da MCU devido a dependências relacionadas. Especificamente o PIC16F1827 trabalha por padrão a 500Hrtz, o que faz um Delay_ms(30)
virar praticamente 3 segundos. Como no post do cofrinho eletrônico utilizaremos um servo motor (talvez eu não devesse citar nesse post, mas as explicações ficam para o próximo), será fundamental configurar o clock, mais especificamente para 8MHz, que foi o único clock que consegui configurar para funcionar o servo motor adequadamente.
A configuração é feita através do registrador OSCCON, como pode ser visto no datasheet.
Perceba que o registrador possui funções diferentes em cada porção de bits.OSCCON = 0b**1****1110****0****10**;
Vejamos os bits da esquerda para a direita:1) SPLLEN - Software PLL Enabled
Para utilizar os PLLs para fazer a configuração do clock internamente, deve-se habilitar SPLLEN.
1110)IRCF 32MHz ou 8MHz - manter 8MHz em Project Settings
Esses 4 bits correspodem à frequência do clock. No datasheet quando cita-se IRCF, ele é procedido por <3:0>. Isso significa que IRCF possui 4 bits configuráveis. No datasheet está especificada cada uma das possibilidades, sendo que 1110 corresponde a 32MHz ou 8Mhz.
0) s/ uso
Como citei anteriormente, alguns bits aleatórios podem não ter funções.
10)SCS System Clock Select bits
Determina o clock através do IRCF, sendo 10 correspondente ao internal oscillator.
Juntando todas as 'peças', "OSCCON = 0b11110010;" corresponde ao uso do oscilador interno à 32Mhz ou 8MHz.
Aliases são uma forma interessante de criar apelidos para pinos e portas e podem ser muito úteis em um código mais extenso.
Suponhamos que eu tenho RA3 configurado para acender um LED, mas por algum motivo eu reordenei as portas fisicamente (no circuito, obviamente) e necessariamente o LED passou ao pino RB5. Se seu código executa essa rotina em diversos lugares, trocando RA3_bit de 0 para 1 e vice-versa, você poderá utilizar um find/replace, mas o modo mais rápido é ter um alias para o pino, o que também te livrará de decorar onde está cada coisa na MCU.
Para tal, antes de "void main()" coloque:sbit LED at RA3\_bit;
Agora sempre que quiser acender ou apagar o LED, manipule o valor de LED invés de ter que lembrar a porta. E se mudar o pino, bastará trocar no alias:sbit LED at RB5_bit;
Não sei se é assim no mundo todo, mas no Brasil existe uma péssima mania de comprar um PIC grande de 40 pinos e subutilizá-lo. Não que seja preciosismo, mas economizar energia, espaço, simplificar projeto são coisas que devem ser levadas em consideração. Eu procuro mesmo a máxima variedade de PICs possível para conhecer os recursos de cada um. Como vocês devem ter notado, já há um bom tempo estou escrevendo sobre o 16F1827 e ainda tem diversos recursos a utilizar! Mas para escolher não dá pra ter cada um dos mais de 250 modelos porque obviamente é impossível que alguém lembre dos recursos de cada um. Então, para escolher o modelo ideal eu utilizo um aplicativo para Android, o PicMicroDatabase, que pode ser baixado livremente através do Google Play.
Esse programa te possibilita escolher a MCU pelo recurso desejado através de filtros na própria interface, recomendo fortemente. Além disso ele possui links para os respectivos datasheets e diversos modelos tem a imagem tecnica da MCU e seus recursos nos pinos.
São alguns poucos detalhes, mas importantes por agora, considerando que no próximo post veremos como controlar servo motor com PIC e garanto, não é fácil, passei alguns dias pesquisando para chegar em algo funcional, mas em breve estaremos brincando com o cofrinho eletrônico!
Se gostou, não deixe de compartilhar; dê seu like no video e inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.