programação do curso de PIC para Tatui \(Salvo ... - Pictronics
programação do curso de PIC para Tatui \(Salvo ... - Pictronics
programação do curso de PIC para Tatui \(Salvo ... - Pictronics
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>PIC</strong><br />
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Introdução à <strong>programação</strong><br />
<strong>de</strong> microcontrola<strong>do</strong>res –<br />
www.pictronics.com.br<br />
Nelson Camilo <strong>de</strong> Almeida<br />
Jan/2011
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Conteú<strong>do</strong><br />
1- Introdução <strong>PIC</strong> geral<br />
2 - Introdução a <strong>programação</strong><br />
3 - Acen<strong>de</strong>r e apagar Led (<strong>de</strong>lay_chaves) e Display 7 seguimentos<br />
4 - Display LCD<br />
5 - RS232<br />
6 – Conversor AD<br />
7 - Interrupção Flag's<br />
8 – PWM<br />
9 - EEPROM interna<br />
10 - I2C<br />
Programas utiliza<strong>do</strong>s:<br />
• MPLAB – www.microchip.com<br />
• <strong>PIC</strong>C-CCS Lite – www.ccsinfo.com<br />
• Proteus v7.7 – www.labcenter.co.uk<br />
Introdução:<br />
Diferença entre Microprocessa<strong>do</strong>r e Microcontrola<strong>do</strong>r<br />
Os microcontrola<strong>do</strong>res, surgi<strong>do</strong>s em torno <strong>de</strong> <strong>de</strong>z anos após o surgimento <strong>do</strong>s primeiros<br />
microprocessa<strong>do</strong>res, foram uma adaptação da indústria <strong>de</strong> eletrônica digital <strong>para</strong> aten<strong>de</strong>r<br />
as necessida<strong>de</strong>s <strong>do</strong> merca<strong>do</strong>. Essa necessida<strong>de</strong> se dava pela dificulda<strong>de</strong> em termos <strong>de</strong><br />
custos e complexida<strong>de</strong> <strong>de</strong> qualquer circuito digital em sistemas embarca<strong>do</strong>s que<br />
precisasse <strong>de</strong> um processamento <strong>de</strong> da<strong>do</strong>s.<br />
Um microprocessa<strong>do</strong>r é um circuito muito complexo, em forma <strong>de</strong> circuito integra<strong>do</strong>,<br />
que po<strong>de</strong> conter entre alguns milhares (Z80) a 7 milhões <strong>de</strong> transistores (Pentium II).<br />
Estes transistores internos constituem os mais diversos circuitos lógicos: como<br />
conta<strong>do</strong>res, registra<strong>do</strong>res, <strong>de</strong>codifica<strong>do</strong>res, e centenas <strong>de</strong> outros. Estes circuitos lógicos<br />
são dispostos <strong>de</strong> maneira complexa, dan<strong>do</strong> ao microprocessa<strong>do</strong>r a capacida<strong>de</strong> <strong>de</strong><br />
executar operações lógicas, aritméticas, e <strong>de</strong> controle. Porém, apesar da sua gran<strong>de</strong><br />
capacida<strong>de</strong> <strong>de</strong> processamento, os microprocessa<strong>do</strong>res são <strong>de</strong>sprovi<strong>do</strong>s <strong>de</strong> dispositivos<br />
essenciais <strong>para</strong> o funcionamento <strong>de</strong> um sistema.<br />
Por exemplo, <strong>para</strong> se fazer uma simples circuito <strong>de</strong> controle <strong>de</strong> um eleva<strong>do</strong>r seriam<br />
necessários um microprocessa<strong>do</strong>r, memória ROM <strong>para</strong> o programa, memoria RAM <strong>para</strong><br />
os da<strong>do</strong>s, <strong>de</strong> uma porta <strong>para</strong>lela <strong>para</strong> dar saída aos acionamentos, <strong>de</strong> uma outra porta pra<br />
receber os sinais digitais <strong>do</strong>s sensores, <strong>de</strong> uma porta serial <strong>para</strong> fazermos as<br />
configurações e rodarmos os diagnósticos, <strong>de</strong> um conversor AD <strong>para</strong> ler o sensor <strong>de</strong><br />
carga que informa o peso total das pessoas que entram no eleva<strong>do</strong>r, <strong>de</strong> um temporiza<strong>do</strong>r<br />
<strong>para</strong> medir o tempo que a porta <strong>de</strong>ve ficar aberta, <strong>de</strong>ntre outros. Com essa extensa lista,<br />
chegamos a um circuito cujo diagrama <strong>de</strong> blocos é mostra<strong>do</strong> na Figura 1.
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Figura 1: Diagrama em blocos <strong>do</strong> circuito <strong>para</strong> o eleva<strong>do</strong>r.<br />
Para a realização <strong>de</strong>sse circuito, precisaríamos <strong>de</strong> uma placa controla<strong>do</strong>ra <strong>de</strong> tamanho<br />
razoável e com muitos CI´s. Desta forma o circuito seria caro e per<strong>de</strong>ria confiabilida<strong>de</strong><br />
<strong>de</strong>vi<strong>do</strong> à gran<strong>de</strong> quantida<strong>de</strong> <strong>de</strong> componentes, o que seria fatal <strong>para</strong> qualquer indústria<br />
que <strong>de</strong>seja ser competitiva. Além disso, haveria um processamento <strong>de</strong>masiadamente<br />
sofistica<strong>do</strong> <strong>para</strong> o problema proposto.<br />
Desse problema é que surgiram os Microcontrola<strong>do</strong>res, que englobam em um único<br />
circuito integra<strong>do</strong> gran<strong>de</strong> parte <strong>do</strong>s periféricos lista<strong>do</strong>s no exemplo acima. Em um<br />
microcontrola<strong>do</strong>r, as memórias RAM e ROM, conversor AD, temporiza<strong>do</strong>res,<br />
controla<strong>do</strong>res serial e <strong>para</strong>lelo e a CPU em sí são todas integra<strong>do</strong>s em um bloco. Por<br />
serem compostos apenas <strong>de</strong> uma peça, eles tem muito maior confiabilida<strong>de</strong>, são mais<br />
baratos, consomem menos energia, têm a fase <strong>de</strong> projeto reduzida, além <strong>de</strong> terem a<br />
manutenção facilitada. Ou seja, são muitas as vantagens em relação ao uso <strong>de</strong> um<br />
microprocessa<strong>do</strong>r com circuito.<br />
Afora isso, como não será feito processamento sofistica<strong>do</strong>, sua CPU não precisa ter uma<br />
gran<strong>de</strong> capacida<strong>de</strong> <strong>de</strong> processamento, mas <strong>de</strong>ve oferecer um conjunto <strong>de</strong> instruções<br />
simples, que gere programas pequenos e <strong>de</strong> rápida execução, ou seja, as instruções<br />
<strong>de</strong>vem ser pequenas e velozes. É preciso ainda oferecer uma forma simples <strong>de</strong> se<br />
interfacear com outros periféricos que venham a ser adiciona<strong>do</strong>s.<br />
Levan<strong>do</strong> em conta tu<strong>do</strong> que foi dito, chegamos ao diagrama em blocos da figura 2, on<strong>de</strong><br />
se apresenta a típica arquitetura <strong>de</strong> um microcontrola<strong>do</strong>r. É claro que, <strong>de</strong> acor<strong>do</strong> com a<br />
finalida<strong>de</strong> <strong>do</strong> microcontrola<strong>do</strong>r, é possível integrar mais re<strong>curso</strong>s e tal possibilida<strong>de</strong> foi<br />
representada pelos blocos rotula<strong>do</strong>s com "etc".
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Figura 2: Exemplo <strong>de</strong> arquitetura <strong>de</strong> um Microcontrola<strong>do</strong>r.<br />
RISC e CISC<br />
Na sua essência, uma máquina RISC oferece um número muito reduzi<strong>do</strong> <strong>de</strong> instruções,<br />
<strong>de</strong>s<strong>de</strong> uma a poucas <strong>de</strong>zenas, e cada instrução apenas realiza uma ação muito simples.<br />
Se este conjunto satisfizer o critério <strong>de</strong> ser genérico, isto é, permitir programar qualquer<br />
algoritmo, então temos <strong>de</strong> reconhecer a gran<strong>de</strong> vantagem <strong>de</strong>sta abordagem: a sua<br />
simplicida<strong>de</strong> facilita a construção hardware da arquitetura <strong>do</strong> microcomtrola<strong>do</strong>r.<br />
Nomeadamente, a Unida<strong>de</strong> <strong>de</strong> Controle da CPU fica mais simples e, portanto, menor,<br />
on<strong>de</strong> ocupa menor área na pastilha ('chip') <strong>do</strong> material semicondutor (Silício,<br />
habitualmente) sobre o qual são implanta<strong>do</strong>s os circuitos digitais que realizam os<br />
componentes <strong>do</strong> controla<strong>do</strong>r. Fican<strong>do</strong> a Unida<strong>de</strong> <strong>de</strong> Controle menor, mais espaço livre<br />
fica na CPU, que po<strong>de</strong> ser aproveita<strong>do</strong> <strong>para</strong> outras unida<strong>de</strong>s que aumentem o ritmo <strong>de</strong><br />
execuções <strong>do</strong> CPU, por exemplo, um maior número <strong>de</strong> regista<strong>do</strong>res <strong>de</strong> da<strong>do</strong>s, uma<br />
memória interna ao CPU, etc.<br />
Uma máquina CISC segue uma filosofia oposta, procuran<strong>do</strong> suportar o mais<br />
diretamente possível os mecanismos das instruções da linguagem <strong>de</strong> alto nível. A sua<br />
principal <strong>de</strong>svantagem é que a Unida<strong>de</strong> <strong>de</strong> Controle fica mais complexa, dada a<br />
varieda<strong>de</strong> e complexida<strong>de</strong> das instruções. Para além <strong>do</strong> menciona<strong>do</strong> aspecto <strong>de</strong><br />
aumentar o espaço ocupa<strong>do</strong> pelos circuitos, isto também dificulta as otimizações das<br />
micro-ações que a Unida<strong>de</strong> <strong>de</strong> Controle <strong>de</strong>ve realizar, <strong>para</strong> obter execuções mais rápidas<br />
das instruções. Por exemplo, no mo<strong>de</strong>lo CISC, dada a gran<strong>de</strong> varieda<strong>de</strong> <strong>de</strong> instruções,<br />
estas têm formatos variáveis e as suas representações em bits variam, por exemplo,<br />
<strong>de</strong>s<strong>de</strong> 1 até 6 bytes, equivalente aos seus tipos.<br />
Observações importantes:<br />
A letra F (<strong>PIC</strong>16F877) i<strong>de</strong>ntifica que o microcontrola<strong>do</strong>r em questão utiliza a tecnologia<br />
FLASH, ou seja, po<strong>de</strong> ser regrava<strong>do</strong>. Alguns mo<strong>de</strong>los (que utilizam a letra C no nome,<br />
como o <strong>PIC</strong>16C877) só po<strong>de</strong>m ser grava<strong>do</strong>s uma única vez e são mais baratos.<br />
Outros mo<strong>de</strong>los da família 16 (como o <strong>PIC</strong>16F870, <strong>PIC</strong>16F628, <strong>PIC</strong>16F84, ....)<br />
possuem variações em termos <strong>de</strong> re<strong>curso</strong>s (com mais ou com menos pinos <strong>de</strong> I/Os,
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
entradas analógicas, memória ROM, memória RAM, etc...), mas to<strong>do</strong>s po<strong>de</strong>m ser<br />
programa<strong>do</strong>s com a mesma linguagem.<br />
Mo<strong>de</strong>los da família 18 são mais rápi<strong>do</strong>s e um pouco mais caros, continuan<strong>do</strong> a ser <strong>de</strong> 8<br />
bits.<br />
Mo<strong>de</strong>los da família 24 são <strong>de</strong> 16 bits, e indica<strong>do</strong>s <strong>para</strong> aplicações que exijam mais<br />
po<strong>de</strong>r <strong>de</strong> processamento.<br />
Os microcontrola<strong>do</strong>res <strong>PIC</strong> são indica<strong>do</strong>s <strong>para</strong> aplicações mais simples, que não<br />
necessitem <strong>de</strong> gran<strong>de</strong> volume <strong>de</strong> da<strong>do</strong>s manipula<strong>do</strong>s, e que não necessitem<br />
processamento em tempo real <strong>de</strong> alto <strong>de</strong>sempenho.<br />
Quan<strong>do</strong> transferimos um programa <strong>para</strong> o microcontrola<strong>do</strong>r, este <strong>de</strong>ve estar em<br />
linguagem <strong>de</strong> máquina (ARQUIVO HEX), e será armazena<strong>do</strong> na memória ROM <strong>do</strong><br />
microcontrola<strong>do</strong>r. Esta memória não será apagada até que outro programa seja envia<strong>do</strong>,<br />
mesmo que a alimentação <strong>de</strong> energia elétrica seja <strong>de</strong>sativada.<br />
Requisitos <strong>de</strong> Hardware
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Opcionais:<br />
Introdução à <strong>programação</strong><br />
Fluxograma:<br />
Os fluxogramas são ferramentas que auxiliam na <strong>programação</strong> e na codificação <strong>de</strong><br />
programas. Na realida<strong>de</strong> são elementos gráficos utiliza<strong>do</strong>s <strong>para</strong> estabelecer a sequencia<br />
<strong>de</strong> operações necessárias <strong>para</strong> o cumprimento <strong>de</strong> <strong>de</strong>terminada tarefa e,<br />
consequentemente, a resolução <strong>de</strong> um problema.<br />
Variáveis <strong>de</strong> da<strong>do</strong>s<br />
Variável é uma representação simbólica <strong>para</strong> elementos pertencentes a um <strong>de</strong>termina<strong>do</strong><br />
conjunto. As variáveis são armazenadas na memória <strong>do</strong> microcontrola<strong>do</strong>r e po<strong>de</strong>m<br />
assumir qualquer valor <strong>de</strong>ntro <strong>do</strong> conjunto <strong>de</strong> valores possíveis.<br />
De fato, as variáveis ficam localizadas na memória <strong>do</strong> equipamento, não em qualquer<br />
tipo <strong>de</strong> memória, mas na chamada memória RAM. Isto significa que num<br />
microcontrola<strong>do</strong>r, boa parte da memória é ocupada por variáveis, <strong>de</strong>finidas pelo<br />
programa em execução.<br />
As variáveis são classificadas segun<strong>do</strong> o tipo <strong>de</strong> da<strong>do</strong> que será armazena<strong>do</strong> e po<strong>de</strong>m ser:<br />
numéricas, caractere, alfanuméricas e lógicas.<br />
Variáveis e tipos <strong>de</strong> da<strong>do</strong>s<br />
A linguagem C disponibiliza ao programa<strong>do</strong>r uma gama <strong>de</strong> tipos <strong>de</strong> da<strong>do</strong>s. A<br />
implementação C da CCS possibilita o uso <strong>de</strong> quase to<strong>do</strong>s os tipos <strong>de</strong> da<strong>do</strong>s disponíveis<br />
em C padrão ANSI.
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Veja os tipos <strong>de</strong> da<strong>do</strong>s básicos disponíveis:<br />
Tipo Tamanho em bits Intervalo Descrição<br />
char 8 0 a 255 Caractere<br />
int 8 0 a 255 Inteiro<br />
float 32 3.4E-38 a 3.4E+38 Ponto flutuante<br />
void 0 nenhum valor vazio<br />
Modifica<strong>do</strong>res <strong>de</strong> tipo<br />
Além <strong>do</strong>s tipos <strong>de</strong> da<strong>do</strong>s vistos, po<strong>de</strong>mos utilizar coman<strong>do</strong>s especiais da linguagem C<br />
<strong>para</strong> modificar os tipos básicos, <strong>de</strong> forma a obter outros tipos <strong>de</strong> da<strong>do</strong>s.<br />
Esses coman<strong>do</strong>s especiais são chama<strong>do</strong>s <strong>de</strong> modifica<strong>do</strong>res <strong>de</strong> tipo e são os seguintes:<br />
signed, unsigned, short e long.<br />
O modifica<strong>do</strong>r signed po<strong>de</strong> ser utiliza<strong>do</strong> <strong>para</strong> modificar um tipo base <strong>de</strong> da<strong>do</strong>s <strong>de</strong> forma<br />
que ele possa representar tanto números positivos quanto negativos.<br />
Note que <strong>de</strong>vi<strong>do</strong> ao fato <strong>de</strong> utilizar um bit <strong>para</strong> representação <strong>do</strong> sinal, a magnitu<strong>de</strong><br />
absoluta da representação <strong>do</strong> tipo modifica<strong>do</strong> será meta<strong>de</strong> da magnitu<strong>de</strong> <strong>do</strong> tipo não<br />
modifica<strong>do</strong>.<br />
Assim, um tipo <strong>de</strong> da<strong>do</strong>s signed int po<strong>de</strong> representar valores <strong>de</strong> -128 a +127 em vez <strong>de</strong><br />
0 a 255.<br />
O modifica<strong>do</strong>r unsigned <strong>de</strong>fine um tipo <strong>de</strong> da<strong>do</strong> sem sinal, o que é o padrão <strong>do</strong><br />
compila<strong>do</strong>r da CCS. Note que o padrão ANSI especifica que os tipos padrão <strong>de</strong> da<strong>do</strong>s<br />
da linguagem C é signed.<br />
Já o modifica<strong>do</strong>r short é utiliza<strong>do</strong> <strong>para</strong> <strong>de</strong>finir uma variável <strong>de</strong> tamanho menor que o <strong>do</strong><br />
tipo modifica<strong>do</strong>, ou seja, uma versão reduzida <strong>do</strong> tipo especifica<strong>do</strong>. Assim, se<br />
especificarmos uma variável como sen<strong>do</strong> <strong>do</strong> tipo short int, ela será uma versão<br />
reduzida <strong>de</strong> int, o que no caso <strong>do</strong> compila<strong>do</strong>r CCS cria uma variável <strong>de</strong> apenas 1 bit <strong>de</strong><br />
tamanho (o que é chama<strong>do</strong> <strong>de</strong> flag ou sinaliza<strong>do</strong>r).<br />
Finalmente, temos o modifica<strong>do</strong>r long, utiliza<strong>do</strong> <strong>para</strong> ampliar a magnitu<strong>de</strong> da<br />
representação <strong>do</strong> tipo especifica<strong>do</strong>. Desta forma, um tipo <strong>de</strong> da<strong>do</strong> long int terá um<br />
tamanho <strong>de</strong> 16 bits, ou seja, irá ocupar duas posições <strong>de</strong> memória RAM <strong>do</strong> <strong>PIC</strong> e terá<br />
magnitu<strong>de</strong> <strong>de</strong> 0 a 65535.<br />
Outros tipos <strong>de</strong> da<strong>do</strong>s específicos <strong>do</strong> compila<strong>do</strong>r CCS C<br />
• int1: especifica valores <strong>de</strong> 1 bit (equivalente ao short int padrão);<br />
• boolean: especifica valores booleanos <strong>de</strong> bit (equivalente ao short int e int1);<br />
• int8: especifica valores <strong>de</strong> 8 bits;<br />
• byte: especifica valores <strong>de</strong> 8 bits;<br />
• int16: especifica valores <strong>de</strong> 16 bits;<br />
• int32: especifica valores <strong>de</strong> 32 bits.<br />
A seguir, temos uma tabela com to<strong>do</strong>s os tipos <strong>de</strong> da<strong>do</strong>s disponíveis por padrão no<br />
compila<strong>do</strong>r CCS:
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Opera<strong>do</strong>res<br />
A linguagem C possui uma gama <strong>de</strong> opera<strong>do</strong>res, sen<strong>do</strong> possivelmente uma das<br />
linguagens com maior numero <strong>de</strong> opera<strong>do</strong>res disponível atualmente.<br />
Esta característica e um <strong>do</strong>s pontos positivos da linguagem, já que C agrega aos<br />
opera<strong>do</strong>res comumente encontra<strong>do</strong>s nas linguagens <strong>de</strong> alto nível, os opera<strong>do</strong>res<br />
encontra<strong>do</strong>s frequentemente em linguagens <strong>de</strong> baixo nível como o Assembly.<br />
Po<strong>de</strong>mos classificar os opera<strong>do</strong>res da linguagem C em sete categorias principais:<br />
atribuição, aritméticos, relacionais, lógicos, lógicos bit a bit, <strong>de</strong> memoria e outros.<br />
Atribuição<br />
A primeira categoria <strong>de</strong> opera<strong>do</strong>res e também a mais utilizada. Em C, o opera<strong>do</strong>r <strong>de</strong><br />
atribuição "=" e utiliza<strong>do</strong> <strong>para</strong> atribuir um <strong>de</strong>termina<strong>do</strong> valor a uma variável. Um<br />
exemplo <strong>de</strong> atribuição:<br />
x = 10;<br />
y = x;<br />
Po<strong>de</strong>mos verificar no programa anterior duas operações <strong>de</strong> atribuição: na primeira foi<br />
atribuí<strong>do</strong> o valor 10 a variável "x", na segunda, foi atribuí<strong>do</strong> o valor <strong>de</strong> "x" (que e 10) a<br />
variável "y". Conclui-se então que ao final <strong>do</strong> programa, "y" será igual a 10.<br />
Repare que a atribuição e sempre avaliada da direita <strong>para</strong> a esquerda é não e possível<br />
realizar uma atribuição no senti<strong>do</strong> inverso.
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Aritméticos<br />
São utiliza<strong>do</strong>s <strong>para</strong> <strong>de</strong>terminar ao compila<strong>do</strong>r que efetue <strong>de</strong>terminada operação<br />
matemática em relação a um ou mais da<strong>do</strong>s:<br />
Tabela <strong>de</strong> opera<strong>do</strong>res<br />
Opera<strong>do</strong>r Ação<br />
+ Adição<br />
- Subtração<br />
* Multiplicação<br />
/ Divisão<br />
% Resto <strong>de</strong> divisão inteira<br />
++ Incremento<br />
-- Decremento<br />
Os opera<strong>do</strong>res <strong>de</strong> adição, subtração, multiplicação e divisão dispensam comentários.<br />
O opera<strong>do</strong>r % e utiliza<strong>do</strong> <strong>para</strong> retornar o resto <strong>de</strong> uma operação <strong>de</strong> divisão inteira.<br />
Vejamos um exemplo:<br />
5 / 2 = 2,5 em uma divisão real, ou 5 / 2 = 2, em uma divisão inteira, sen<strong>do</strong> o<br />
resto igual a 1.<br />
Assim, o resulta<strong>do</strong> <strong>de</strong> 5 / 2 é 2 e o resulta<strong>do</strong> <strong>de</strong> 5%2 e igual a 1.<br />
Os opera<strong>do</strong>res <strong>de</strong> incremento e <strong>de</strong>cremento são utiliza<strong>do</strong>s <strong>para</strong> somar 1 (incremento) ou<br />
subtrair 1 (<strong>de</strong>cremento) <strong>de</strong> uma variável.<br />
A forma geral <strong>para</strong> utilização <strong>de</strong>stes <strong>do</strong>is últimos opera<strong>do</strong>res é:<br />
variavel++; ou variavel--;<br />
Ou ainda por meio <strong>de</strong> uma atribuição:<br />
variavel_1 = variavel_2 ++; ou variavel_1 = variavel_2 --;<br />
Observe que em ambos os casos, a atribuição ocorre da seguinte forma: o valor da<br />
variável "variavel_2" e armazena<strong>do</strong> em variável_1 e apos isso o conteú<strong>do</strong> <strong>de</strong><br />
"variave_2" é incrementa<strong>do</strong> ou <strong>de</strong>crementa<strong>do</strong>.<br />
No entanto, em C e também possível escrever:<br />
variavel_1 = ++ variavel_2; ou variavel_1 = -- variavel_2;<br />
Nestes casos, a operação <strong>de</strong> Incremento/<strong>de</strong>cremento é realizada antes da atribuição<br />
propriamente dita.
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Vejamos um exemplo:<br />
int x, y, z;<br />
x = 0;<br />
y = x ++;<br />
z = ++ x;<br />
Neste caso, após a execução <strong>do</strong>s três coman<strong>do</strong>s, o valor da variável “x” será igual a 2, o<br />
valor da variável “y” será igual a 0 e o valor da variável z será igual a 2.<br />
Observação importante: Não e possível utilizar os opera<strong>do</strong>res <strong>de</strong> incremento ou<br />
<strong>de</strong>cremento com variáveis ou tipos <strong>de</strong> da<strong>do</strong>s complexos, tais como os tipos ponto<br />
flutuante.<br />
Note que ha uma diferença clara entre escrever "y = x + 1" e "y = ++x":<br />
Ambas produzirão o mesmo resulta<strong>do</strong> em “y”, no entanto, no primeiro caso, somente a<br />
variável "y", alvo da atribuição, é alterada. Já no segun<strong>do</strong> caso, tanto "y", como "x" são<br />
alteradas!<br />
Relacionais<br />
São utiliza<strong>do</strong>s em testes condicionais <strong>para</strong> <strong>de</strong>terminar a relação existente entre os da<strong>do</strong>s:<br />
Opera<strong>do</strong>r Ação<br />
> Maior que<br />
>= Maior ou igual a<br />
< Menor que<br />
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Os opera<strong>do</strong>res relacionais são elementos <strong>de</strong> suma importância na construção <strong>de</strong> testes<br />
condicionais. Com esses opera<strong>do</strong>res po<strong>de</strong>mos relacionar diversas condições diferentes<br />
em um mesmo teste logico.<br />
Vejamos um exemplo:<br />
int x, y;<br />
x = 10;<br />
if (x > 5 && x < 20) y = x;<br />
Como po<strong>de</strong>mos verificar a variável "y" somente será igual ao valor da variável "x" se o<br />
valor <strong>de</strong> "x" for maior que 5 e "x" for menor que 20. O que nos leva a concluir que ao<br />
final da execução <strong>do</strong> programa "y" será igual a 10.<br />
Lógicos Bit a Bit<br />
Os opera<strong>do</strong>res 1ogicos bit a bit são utiliza<strong>do</strong>s <strong>para</strong> realizar operações logicas entre<br />
elementos ou variáveis. No entanto, ao contrario <strong>do</strong>s opera<strong>do</strong>res lógicos simples, os<br />
opera<strong>do</strong>res lógicos bit a bit po<strong>de</strong>m resultar em um valor da mesma magnitu<strong>de</strong> <strong>do</strong>s<br />
elementos opera<strong>do</strong>s.<br />
Outros Opera<strong>do</strong>res<br />
Opera<strong>do</strong>r Ação<br />
& AND (E)<br />
| OR (OU)<br />
^ XOR (OU exclusivo)<br />
~ NOT (complemento <strong>de</strong> um)<br />
>> Deslocamento a direita<br />
Ponteiro <strong>de</strong> elemento <strong>de</strong> estrutura<br />
(tipo) Opera<strong>do</strong>r <strong>de</strong> Mo<strong>de</strong>lagem <strong>de</strong> da<strong>do</strong><br />
sizeof Retorna o tamanho da variável<br />
Tabela: Outros opera<strong>do</strong>res
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Exemplos:<br />
int liga_led(void)<br />
{<br />
output_high (pin_a0); // ativação <strong>do</strong> pino 0 da porta A<br />
}<br />
int <strong>de</strong>sliga_led(void)<br />
{<br />
output_low (pin_a0); // <strong>de</strong>slisa o pino 0 da porta A<br />
}<br />
main()<br />
{<br />
while (true)<br />
(input (pin_b0) == 1) ? liga_led() : <strong>de</strong>sliga led();<br />
}<br />
Associação <strong>de</strong> opera<strong>do</strong>res<br />
Para facilitar a vida <strong>do</strong> programa<strong>do</strong>r, a linguagem C inclui ainda outra característica que<br />
é a abreviação <strong>de</strong> opera<strong>do</strong>res em atribuições e funciona da seguinte forma:<br />
Forma Forma<br />
reduzida expandida<br />
x += y x = x + y<br />
x -= y x = x - y<br />
x *= y x = x * y<br />
Or<strong>de</strong>m Opera<strong>do</strong>r<br />
Maior ( ) [ ] -><br />
! ~ ++ -- .<br />
(tipo) * & sizeof<br />
* / %<br />
+ -<br />
><br />
=<br />
== !=<br />
&<br />
^<br />
|<br />
&&<br />
||<br />
?<br />
= += -= *= /=<br />
Menor ,
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Declarações <strong>de</strong> controle<br />
Coman<strong>do</strong> if<br />
De maneira geral, o coman<strong>do</strong> if (ou "se" em português) e utiliza<strong>do</strong> <strong>para</strong> executar um<br />
coman<strong>do</strong> ou bloco <strong>de</strong> coman<strong>do</strong>s no caso <strong>de</strong> uma <strong>de</strong>terminada condição ser avaliada<br />
como verda<strong>de</strong>ira. Opcionalmente, e também possível executar outro coman<strong>do</strong> ou bloco<br />
<strong>de</strong> coman<strong>do</strong>s no caso da condição seja avaliada como falsa.<br />
A forma geral <strong>do</strong> coman<strong>do</strong> if é:<br />
if (condição)<br />
coman<strong>do</strong>A;<br />
{ else coman<strong>do</strong>B; }<br />
Outra forma:<br />
if (condição)<br />
{<br />
coman<strong>do</strong>A1;<br />
coman<strong>do</strong>A2;<br />
. . .<br />
} else<br />
{<br />
coman<strong>do</strong>B1;<br />
coman<strong>do</strong>B2;<br />
. . .<br />
}<br />
Exemplo <strong>de</strong> código:<br />
#inclu<strong>de</strong> <br />
#use <strong>de</strong>lay(clock=4000000)<br />
#fuses INTRC, NOWDT, PUT, NOMCLR, NOLVP, NOBROWNOUT<br />
int x;<br />
main()<br />
{<br />
while (true)<br />
{<br />
x = input_a();<br />
output_b (0);<br />
if (x==0) output_high (pin_b0); else<br />
if (x==1) output_high (pin_b1); else<br />
if (x==2) output_high (pin_b2); else<br />
if (x==4) output_high (pin_b3); else<br />
output_high (pin_b4);<br />
}<br />
}
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Coman<strong>do</strong> Switch<br />
Em alguns casos, como na com<strong>para</strong>ção <strong>de</strong> uma <strong>de</strong>terminada variável a diversos valores<br />
diferentes, o coman<strong>do</strong> if po<strong>de</strong> tornar-se um pouco confuso ou pouco eficiente.<br />
A <strong>de</strong>claração switch permite a realização <strong>de</strong> com<strong>para</strong>ções sucessivas como a anterior,<br />
<strong>de</strong> uma forma muito mais elegante, clara e eficiente. Vejamos então o formato geral da<br />
<strong>de</strong>claração switch:<br />
switch (variável)<br />
{<br />
case constante1:<br />
coman<strong>do</strong>A;<br />
...<br />
break;<br />
case constante2:<br />
coman<strong>do</strong>B;<br />
...<br />
break;<br />
...<br />
...<br />
<strong>de</strong>fault: // a diretiva <strong>de</strong>fault po<strong>de</strong> ou não estar presente<br />
coman<strong>do</strong>Z;<br />
...<br />
}<br />
Exemplo <strong>de</strong> código:<br />
#inclu<strong>de</strong> <br />
#use <strong>de</strong>lay(clock=4000000)<br />
#fuses HS, NOWDT, PUT, NOBROWNOUT, NOLVP<br />
main()<br />
{<br />
while (true)<br />
{<br />
output port_b(0);<br />
switch (input_a())<br />
{<br />
case 0:<br />
output_high (pin_b0);<br />
break;<br />
case 1:<br />
output_high (pin_b1);<br />
break;<br />
case 2:<br />
output_high (pin_b2);<br />
break;<br />
case 3:<br />
output_high (pin_b3);
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
}<br />
}<br />
Laço For<br />
}<br />
break;<br />
<strong>de</strong>fault:<br />
output_high (pin_b4);<br />
O laço for é uma das mais comuns estruturas <strong>de</strong> repetição, sen<strong>do</strong> a versão c consi<strong>de</strong>rada<br />
uma das mais po<strong>de</strong>rosas e flexíveis <strong>de</strong>ntre todas as linguagens <strong>de</strong> <strong>programação</strong>.<br />
O laço for é da<strong>do</strong> por:<br />
for (inicialização; condição; incremento) coman<strong>do</strong>;<br />
ou,<br />
for (inicialização; condição; incremento)<br />
{<br />
//bloco <strong>de</strong> coman<strong>do</strong>s<br />
coman<strong>do</strong>1;<br />
coman<strong>do</strong>2;<br />
...<br />
}<br />
Cada uma das três seções <strong>do</strong> coman<strong>do</strong> for possui uma função distinta, conforme se<br />
segue:<br />
Inicialização: esta seção conterá uma expressão válida utilizada malmente <strong>para</strong><br />
inicialização da variável <strong>de</strong> controle <strong>do</strong> laço for<br />
Condição: esta seção po<strong>de</strong> conter a condição a ser avaliada Para <strong>de</strong>cidir pela<br />
continuida<strong>de</strong> ou não <strong>do</strong> laço <strong>de</strong> repetição. Enquanto a condição for avaliada como<br />
verda<strong>de</strong>ira, o laço for permanecera em execução.<br />
Incremento: esta seção po<strong>de</strong> conter uma ou mais <strong>de</strong>clarações <strong>para</strong> incremento da<br />
variável <strong>de</strong> controle <strong>do</strong> laço.<br />
Exemplo <strong>de</strong> código:<br />
#inclu<strong>de</strong> <br />
#fuses INTRC_IO, NOWDT, PUT, NOBROWNOUT, NOMCLR, NOLVP<br />
#use <strong>de</strong>lay(clock=4000000)<br />
#use rs232(baud=19200,parity=N,xmit=PIN_B2,rcv=PIN_ B1,bits=8)<br />
main()<br />
{<br />
int conta;<br />
for (conta=0; conta
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Laço While<br />
Outro tipo <strong>de</strong> laço disponível na linguagem é o coman<strong>do</strong> while e que possui a seguinte<br />
forma geral:<br />
while (condição) coman<strong>do</strong>;<br />
ou ainda:<br />
while (condição)<br />
{<br />
coman<strong>do</strong>l;<br />
coman<strong>do</strong>2;<br />
…<br />
}<br />
Break e Continue no Coman<strong>do</strong> While<br />
Também e possível utilizar as clausulas break e continue com o coman<strong>do</strong> while e for.<br />
Elas possuem a mesma função <strong>para</strong> os coman<strong>do</strong>s while e for.<br />
Vejamos um exemplo <strong>do</strong> funcionamento <strong>de</strong> break e continue com o coman<strong>do</strong> while:<br />
Exemplo <strong>de</strong> código<br />
#inclu<strong>de</strong> <br />
#use <strong>de</strong>lay(clock=4000000)<br />
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP<br />
#use rs232(baud=19200,parity=N,xmit=PIN_B2,rcv=PIN_B1)<br />
main()<br />
{<br />
port_b_pull-ups (true); // habilita pull-ups internos<br />
int x=0; // <strong>de</strong>clara a variável x como inteira <strong>de</strong> 8 bits<br />
//e a inicializa com 0<br />
}<br />
while (x
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Laço Do-While<br />
O último tipo <strong>de</strong> estrutura <strong>de</strong> repetição disponível na linguagem C é o coman<strong>do</strong> <strong>do</strong> (em<br />
português "faca").<br />
O coman<strong>do</strong> <strong>do</strong> e utiliza<strong>do</strong> juntamente com o coman<strong>do</strong> while <strong>para</strong> criar uma estrutura <strong>de</strong><br />
repetição com funcionamento ligeiramente diferente <strong>do</strong> while e for tradicionais.<br />
De fato, a diferença entre a estrutura while tradicional e a estrutura <strong>do</strong>-while é que esta<br />
ultima realiza a avaliação da condição <strong>de</strong> teste no final <strong>de</strong> cada ciclo <strong>de</strong> iteração <strong>do</strong> laço<br />
<strong>de</strong> repetição, ao contrario <strong>do</strong> que já estudamos sobre o while, o qual realiza o teste no<br />
inicio <strong>de</strong> cada ciclo.<br />
A forma geral da estrutura Do-While é:<br />
<strong>do</strong> coman<strong>do</strong> while (condição);<br />
ou,<br />
<strong>do</strong><br />
{<br />
coman<strong>do</strong>A;<br />
coman<strong>do</strong>B;<br />
...<br />
} while (condição);<br />
Constantes binárias, hexa<strong>de</strong>cimais e octais<br />
Função Printf<br />
Valor Base numérica<br />
99 Decimal<br />
099 Octal<br />
0x99 Hexa<strong>de</strong>cimal<br />
0b10011001 Binário<br />
Formatos aceitos <strong>de</strong> números pelo compila<strong>do</strong>r <strong>PIC</strong>C-CCS<br />
A função prinff e utilizada <strong>para</strong> possibilitar a saída <strong>de</strong> da<strong>do</strong>s na linguagem C. A saída <strong>de</strong><br />
da<strong>do</strong>s e direcionada <strong>para</strong> o dispositivo padrão <strong>de</strong> saída, que nos computa<strong>do</strong>res é<br />
normalmente o monitor <strong>de</strong> ví<strong>de</strong>o. No caso <strong>do</strong>s <strong>PIC</strong>s, o dispositivo <strong>de</strong> saída<br />
eventualmente disponível é a saída serial.<br />
Assim, a função printf é uma excelente forma <strong>de</strong> transmitir da<strong>do</strong>s serialmente <strong>do</strong> <strong>PIC</strong><br />
<strong>para</strong> outro dispositivo externo, como, por exemplo, um terminal <strong>de</strong> ví<strong>de</strong>o ou um<br />
microcomputa<strong>do</strong>r.<br />
O formato geral da função printf e:<br />
printf ( argumento(s) );
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Estes argumentos utilizam o código da barra invertida que se segue:<br />
Configuração <strong>do</strong> <strong>PIC</strong><br />
Código Caractere<br />
YYY Constante Octal yyy<br />
\xyyy Constante hexa<strong>de</strong>cimal yyy<br />
\0 Nulo (null)<br />
\a Campainha (BEL)<br />
\b Retrocesso (backspace)<br />
\t Tabulação horizontal<br />
\n Linha nova (line feed)<br />
\v Tabulação vertical<br />
\f Avanço <strong>de</strong> formulário<br />
\r Retorno <strong>de</strong> carro (Return)<br />
\” Aspas<br />
\’ Apóstrofo<br />
\\ Barra invertida “\”<br />
No início da <strong>programação</strong> <strong>do</strong> <strong>PIC</strong> <strong>de</strong>vemos configurar o <strong>PIC</strong> <strong>para</strong> começar a programar<br />
as tarefas <strong>do</strong> <strong>PIC</strong>, essas configurações <strong>de</strong>pen<strong>de</strong>m <strong>de</strong> <strong>PIC</strong> <strong>para</strong> <strong>PIC</strong> e as principais se<br />
seguem.<br />
Diretivas Fuses <strong>de</strong> configuração<br />
Fuses são diretivas <strong>para</strong> configuração inicial <strong>de</strong> diversos parâmetros <strong>de</strong> um <strong>PIC</strong>, essas<br />
configurações variam <strong>de</strong> <strong>PIC</strong> <strong>para</strong> <strong>PIC</strong> e <strong>de</strong>vem ser consultadas no Datasheet <strong>de</strong> cada<br />
<strong>PIC</strong> <strong>para</strong> correta configuração, também temos a <strong>de</strong>scrição da configuração <strong>do</strong>s Fuses na<br />
referência <strong>de</strong> linguagem <strong>do</strong> compila<strong>do</strong>r <strong>PIC</strong>C em inglês.<br />
#FUSES <strong>para</strong> o <strong>PIC</strong>16F877<br />
LP Oscila<strong>do</strong>r <strong>de</strong> baixa potencia < 200 khz<br />
XT Cristal oscila<strong>do</strong>r 4mhz)<br />
RC Resistor/Capacitor Oscila<strong>do</strong>r com CLKOUT (saída <strong>de</strong> clock)<br />
NOWDT Watch Dog Timer <strong>de</strong>sabilita<strong>do</strong><br />
WDT Watch Dog Timer habilita<strong>do</strong><br />
NOPUT Power Up Timer <strong>de</strong>sabilita<strong>do</strong><br />
PUT Power Up Timer habilita<strong>do</strong><br />
PROTECT Código protegi<strong>do</strong> <strong>de</strong> leitura<br />
PROTECT_5% Protejer 5% da ROM<br />
PROTECT_50% Protejer 50% da ROM<br />
NOPROTECT Código não protegi<strong>do</strong> <strong>de</strong> leitura<br />
NOBROWNOUT Brownout reset <strong>de</strong>sabilita<strong>do</strong><br />
BROWNOUT Reset quan<strong>do</strong> brownout <strong>de</strong>tecta<strong>do</strong><br />
LVP Low Voltage Programming on B3(<strong>PIC</strong>16) or B5(<strong>PIC</strong>18)<br />
Programação em baixa voltagem
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
NOLVP Desabilita Low Voltage Programming, B3(<strong>PIC</strong>16) ou B5(<strong>PIC</strong>18)<br />
usa<strong>do</strong> <strong>para</strong> I/O<br />
CPD Código protegi<strong>do</strong> da EEPROM <strong>de</strong> da<strong>do</strong>s<br />
NOCPD Proteção da EEPROM <strong>de</strong>sabilitada<br />
WRT Proteção <strong>de</strong> escrita da memória <strong>de</strong> programa<br />
NOWRT Proteção <strong>de</strong> escrita da memória <strong>de</strong> programa <strong>de</strong>sabilitada<br />
DEBUG Debug mo<strong>de</strong> <strong>para</strong> uso com ICD<br />
NODEBUG Debug mo<strong>de</strong> <strong>para</strong> uso com ICD <strong>de</strong>sabilita<strong>do</strong><br />
Fuses <strong>para</strong> o <strong>PIC</strong>16F628A<br />
LP Oscila<strong>do</strong>r <strong>de</strong> baixa potencia < 200 khz<br />
XT Cristal oscila<strong>do</strong>r 4mhz)<br />
EC_IO Clock externo<br />
INTRC_IO Oscila<strong>do</strong>r Interno RC, sem CLKOUT (RA6 I/O)<br />
RC Oscila<strong>do</strong>r Resistor/Capacitor com CLKOUT<br />
INTRC Oscila<strong>do</strong>r Interno RC<br />
RC_IO Oscila<strong>do</strong>r Resistor/Capacitor RA6 I/O<br />
WDT Watch Dog Timer (Proteção contra travamento)<br />
NOWDT Desabilita Watch Dog Timer<br />
PUT Power Up Timer habilita<strong>do</strong><br />
NOPUT Power Up Timer <strong>de</strong>sabilita<strong>do</strong><br />
NOMCLR Master Clear (RA5) usa<strong>do</strong> como entrada digital<br />
MCLR Master Clear (RA5) usa<strong>do</strong> como Reset <strong>do</strong> <strong>PIC</strong><br />
BROWNOUT Reset quan<strong>do</strong> brownout <strong>de</strong>tecta<strong>do</strong><br />
NOBROWNOUT Brownout reset <strong>de</strong>sabilita<strong>do</strong><br />
LVP Low Voltage Programming on B3(<strong>PIC</strong>16) or B5(<strong>PIC</strong>18)<br />
Programação em baixa voltagem<br />
NOLVP Desabilita Low Voltage Programming, B3(<strong>PIC</strong>16) ou B5(<strong>PIC</strong>18)<br />
usa<strong>do</strong> <strong>para</strong> I/O<br />
CPD Código protegi<strong>do</strong> da EEPROM <strong>de</strong> da<strong>do</strong>s<br />
NOCPD Proteção da EEPROM <strong>de</strong>sabilitada<br />
PROTECT Código protegi<strong>do</strong> <strong>de</strong> leitura<br />
NOPROTECT Código não protegi<strong>do</strong> <strong>de</strong> leitura<br />
Diretivas #use<br />
#use <strong>de</strong>lay<br />
Informa ao compila<strong>do</strong>r a velocida<strong>de</strong> <strong>do</strong> clock <strong>do</strong> sistema.<br />
Sintaxe: #use <strong>de</strong>lay (clock = valor)<br />
Esta diretiva é necessária <strong>para</strong> a utilização das funções <strong>de</strong> atraso <strong>de</strong> tempo (<strong>de</strong>lay_ms ou<br />
<strong>de</strong>lay_us) e também <strong>para</strong> as rotinas <strong>de</strong> comunicação serial.
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
#use satandard_io<br />
Seleciona o mo<strong>do</strong> padrão <strong>de</strong> entrada e saída.<br />
Sintaxe: #use standard_io (porta)<br />
On<strong>de</strong>: porta po<strong>de</strong> ser uma porta <strong>de</strong> saída, exemplo:<br />
#use standard_io (B)<br />
#use fast_io<br />
Seleciona o mo<strong>do</strong> rápi<strong>do</strong> <strong>de</strong> entrada e saída.<br />
Neste mo<strong>do</strong> o compila<strong>do</strong>r não irá inserir nenhuma instrução <strong>para</strong> controle <strong>do</strong>s<br />
registra<strong>do</strong>res TRIS <strong>do</strong> dispositivo, produzin<strong>do</strong> um código mais rápi<strong>do</strong> e eficiente,<br />
porém, <strong>de</strong>vemos alterar o registra<strong>do</strong>r TRIS pelo coman<strong>do</strong> set_tris (x) no início <strong>do</strong><br />
programa.<br />
Exemplo: #use fast_io (B)<br />
#use fixed_io<br />
Seleciona o mo<strong>do</strong> fixo <strong>de</strong> entrada e saída.<br />
Sintaxe: #use fixed_io (porta_outputs = pino, pino, ...)<br />
No mo<strong>do</strong> fixo o compila<strong>do</strong>r irá inserir código <strong>de</strong> configuração <strong>do</strong>s registra<strong>do</strong>res TRIS a<br />
cada utilização <strong>do</strong>s pinos especifica<strong>do</strong>s. Note que o registra<strong>do</strong>r TRIS é programa<strong>do</strong> com<br />
a configuração selecionada na diretiva e não pelo tipo <strong>de</strong> função executa<strong>do</strong>.<br />
Exemplo: #use fixed_io (B = pin_b0, pin_b1)<br />
#use i2c<br />
Habilita o uso da biblioteca interna <strong>de</strong> comunicação I2C.<br />
Sintaxe: #use i2c (opções)<br />
Exemplo:<br />
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Opção Descrição<br />
MASTER Seta o mo<strong>do</strong> mestre<br />
SLAVE Seta o mo<strong>do</strong> escravo<br />
SCL = pino Especifica qual o pino <strong>de</strong> clock I2C<br />
SDA = pino Especifica qual o pino <strong>de</strong> da<strong>do</strong>s I2C<br />
ADDRESS = nn Especifica o en<strong>de</strong>reço <strong>do</strong> dispositivo em mo<strong>do</strong> escravo<br />
FAST Utiliza a especificação <strong>de</strong> alta velocida<strong>de</strong> I2C<br />
SLOW Utiliza a especificação <strong>de</strong> baixa velocida<strong>de</strong> I2C<br />
RESTART_WDT Reinicia o watch<strong>do</strong>g enquanto aguarda da<strong>do</strong>s na função<br />
I2C_READ<br />
FORCE_HW Força a utilização <strong>do</strong> hardware interno (SSP ou MSSP) <strong>do</strong> <strong>PIC</strong><br />
#use rs232<br />
Ativa o suporte a comunicação RS232<br />
Sintaxe: #use rs232 (opções)<br />
Opções Descrição<br />
BAUD = valor Especifica a velocida<strong>de</strong> <strong>de</strong> comunicação serial.<br />
XMIT = pino Especifica o pino <strong>de</strong> transmissão <strong>de</strong> da<strong>do</strong>s.<br />
RCV = pino Especifica o pino <strong>de</strong> recepção <strong>de</strong> da<strong>do</strong>s.<br />
RESTART_WDT Determina qual a função getc() reset o watch<strong>do</strong>g enquanto<br />
aguarda a chegada <strong>de</strong> um caractere.<br />
INVERT Inverte a polarida<strong>de</strong> <strong>do</strong>s pinos <strong>de</strong> TX/RX. Não po<strong>de</strong> ser<br />
utilizada com o hardware interno.<br />
PARITY = x Seleciona a parida<strong>de</strong> (x po<strong>de</strong> ser: N (sem parida<strong>de</strong>), E<br />
(parida<strong>de</strong> par) ou O (parida<strong>de</strong> ímpar)).<br />
BITS = x Seleciona o número <strong>de</strong> bits <strong>de</strong> da<strong>do</strong>s (5 a 9 <strong>para</strong> o mo<strong>do</strong><br />
por software e, 8 e 9 <strong>para</strong> o mo<strong>do</strong> hardware).<br />
FLOAT_HIGH A saída não vai a nível lógico 1. Utiliza<strong>do</strong> com saídas em<br />
coletor aberto.<br />
ERRORS Solicita ao compila<strong>do</strong>r que armazene os erros <strong>de</strong> recepção<br />
na variável RS232_ERRORS, resetan<strong>do</strong> os flags <strong>de</strong> erro<br />
quan<strong>do</strong> eles ocorrerem.<br />
BRGH10K Permite a utilização das velocida<strong>de</strong>s disponíveis com o bit<br />
BRGH em 1 em chips que tenham bugs nesta<br />
configuração <strong>do</strong> hardware.<br />
ENABLE = pino Especifica um pino <strong>para</strong> atuar como saída <strong>de</strong> habilitação<br />
durante uma transmissão. Utiliza<strong>do</strong> no protocolo RS485.<br />
STREAM = i<strong>de</strong>ntifica<strong>do</strong>r Associa a interface RS232 a um i<strong>de</strong>ntifica<strong>do</strong>r <strong>de</strong> stream <strong>de</strong><br />
da<strong>do</strong>s. Os streams <strong>de</strong> da<strong>do</strong>s são utiliza<strong>do</strong>s em algumas<br />
funções internas <strong>do</strong> compila<strong>do</strong>r.
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Funções <strong>de</strong> entrada e saída<br />
Output_low()<br />
Coloca o pino especifica<strong>do</strong> em nível lógico 0.<br />
Sintaxe: output_low (pino)<br />
Exemplo:<br />
Output_low (pin_b0); // coloca pin_b0 em nível lógico 0.<br />
Output_high()<br />
Coloca o pino especifica<strong>do</strong> em nível lógico 1.<br />
Sintaxe: output_high (pino)<br />
Exemplo:<br />
Output_X()<br />
Output_high (pin_c1); // coloca pin_c1 em nível lógico 1.<br />
Escreve um byte complete emu ma <strong>de</strong>terminada porta <strong>do</strong> <strong>PIC</strong>.<br />
Sintaxe: output_A (valor)<br />
output_B (valor)<br />
output_C (valor)<br />
output_D (valor)<br />
Exemplo:<br />
Output_B (0x25); // Escreve o valor 0x25 no port B<br />
Output_toggle()<br />
Inverte o valor <strong>do</strong> pino especifica<strong>do</strong>.<br />
Sintaxe: output_toggle (pino)<br />
Exemplo:<br />
Output_toggle (pin_b4); // Inverte o nível lógico <strong>do</strong> pino pin_b4<br />
Input()<br />
Lê o esta<strong>do</strong> lógico <strong>de</strong> um pino <strong>do</strong> <strong>PIC</strong>.<br />
Sintaxe: res = input(pino)
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
On<strong>de</strong>: res é o esta<strong>do</strong> <strong>do</strong> pino<br />
pino é um pino <strong>do</strong> <strong>PIC</strong><br />
Exemplo:<br />
shot int x;<br />
x = input (pin_a0); // Lê o esta<strong>do</strong> <strong>do</strong> pino A0<br />
Input_X()<br />
Lê um byte complete <strong>de</strong> uma porta <strong>do</strong> <strong>PIC</strong>.<br />
Sintaxe: valor = input_A ()<br />
valor = input_B ()<br />
valor = input_C ()<br />
valor = input_D ()<br />
On<strong>de</strong>: valor é uma variável <strong>de</strong> 8 bits.<br />
Exemplo:<br />
int x;<br />
x = input_b(); // Lê o esta<strong>do</strong> da porta B<br />
Set_tris_X()<br />
Configura a direção <strong>do</strong>s pinos <strong>de</strong> uma porta <strong>do</strong> <strong>PIC</strong>.<br />
Sintaxe: set_tris_A ( valor )<br />
set_tris_B ( valor )<br />
set_tris_C ( valor )<br />
set_tris_D ( valor )<br />
On<strong>de</strong>: valor é uma variável inteira <strong>de</strong> 8 bits.<br />
Note que o uso <strong>de</strong>sta diretiva é <strong>de</strong>snecessária com as diretiva #use standard_io e #use<br />
fixed_io, já que nestes mo<strong>do</strong>s <strong>de</strong> IO o compila<strong>do</strong>r configura automaticamente a<br />
direção <strong>do</strong>s pinos.<br />
Exemplo:<br />
set_tris_b (0b00001111);<br />
// Configura os pinos B0 a B3 como entradas e B4 a B7 como saídas
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Exemplos <strong>de</strong> códigos<br />
/* RS232.h<br />
* Arquivo <strong>de</strong> Comunicação Serial RS232<br />
*/<br />
#inclu<strong>de</strong> <br />
#<strong>de</strong>vice adc=8<br />
#FUSES NOWDT //No Watch Dog Timer<br />
#FUSES XT //Crystal osc
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
{<br />
case 'a':<br />
printf ("Letra A\n\r");<br />
break;<br />
case 'b':<br />
printf ("Letra B\n\r");<br />
break;<br />
<strong>de</strong>fault:<br />
printf ("coman<strong>do</strong> nao existe...\n\r");<br />
break;<br />
}<br />
}<br />
}<br />
// Fim <strong>do</strong> arquivo<br />
/* Display 7 segmentos<br />
* Arquivo 7seg.h<br />
*/<br />
#inclu<strong>de</strong> <br />
#<strong>de</strong>vice adc=8 // Configuração <strong>do</strong> ADC<br />
#FUSES NOWDT //No Watch Dog Timer<br />
#FUSES XT //Crystal osc
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
0b10000111, // 7<br />
0b11111111, // 8<br />
0b11100111};// 9<br />
void main() // Função principal<br />
{<br />
setup_adc_ports(NO_ANALOGS); // Configura analógicos<br />
setup_adc(ADC_OFF); // ADC <strong>de</strong>sliga<strong>do</strong><br />
setup_psp(PSP_DISABLED); // PSP <strong>de</strong>sliga<strong>do</strong><br />
setup_spi(SPI_SS_DISABLED); // SPI <strong>de</strong>lsiga<strong>do</strong><br />
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Configura Timer 0<br />
setup_timer_1(T1_DISABLED);// Configura Timer 1<br />
setup_timer_2(T2_DISABLED,0,1);// Configura Timer 2<br />
while (true)<br />
{<br />
output_b(0);<br />
switch (input_a()) // Testa a porta A<br />
{<br />
case 0:<br />
output_b (digito[0]);<br />
//printf ("%u\n\r", digito[0]);<br />
break;<br />
case 1:<br />
output_b (digito[1]);<br />
printf ("%u\n\r", digito[1]);<br />
break;<br />
case 2:<br />
output_b (digito[2]);<br />
printf ("%u\n\r", digito[2]);<br />
break;<br />
case 3:<br />
output_b (digito[3]);<br />
printf ("%u\n\r", digito[3]);<br />
break;<br />
case 4:<br />
output_b (digito[4]);<br />
printf ("%u\n\r", digito[4]);<br />
break;<br />
case 5:<br />
output_b (digito[5]);<br />
printf ("%u\n\r", digito[5]);<br />
break;<br />
case 6:<br />
output_b (digito[6]);<br />
printf ("%u\n\r", digito[6]);<br />
break;<br />
case 7:<br />
output_b (digito[7]);<br />
printf ("%u\n\r", digito[7]);
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
break;<br />
case 8:<br />
output_b (digito[8]);<br />
printf ("%u\n\r", digito[8]);<br />
break;<br />
case 9:<br />
output_b (digito[9]);<br />
printf ("%u\n\r", digito[9]);<br />
break;<br />
case 10:<br />
output_b (digito[0]);<br />
printf ("%u\n\r", digito[0]);<br />
break;<br />
}<br />
}<br />
}<br />
// Fim <strong>do</strong> arquivo 7seg.c<br />
/* Arquivo mainT0.h<br />
* Trabalhan<strong>do</strong> com Timer 0 e interrupção */<br />
#inclu<strong>de</strong> <br />
#<strong>de</strong>vice adc=8<br />
#FUSES NOWDT //No Watch Dog Timer<br />
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)<br />
#FUSES NOPUT //No Power Up Timer<br />
#FUSES NOPROTECT //Co<strong>de</strong> not protected from reading<br />
#FUSES NODEBUG //No Debug mo<strong>de</strong> for ICD<br />
#FUSES NOBROWNOUT//No brownout reset<br />
#FUSES NOLVP //No low voltage prgming, B3(<strong>PIC</strong>16) or B5(<strong>PIC</strong>18) used for I/O<br />
#FUSES NOCPD //No EE protection<br />
#FUSES NOWRT //Program memory not write protected<br />
#use <strong>de</strong>lay(clock=20000000)<br />
// Fim <strong>do</strong> arquivo mainT0.h<br />
/* Arquivo mainT0.c<br />
* Trabalhan<strong>do</strong> com Timer0 e interrupção <strong>para</strong> pisca <strong>de</strong> 1 segun<strong>do</strong> */<br />
#inclu<strong>de</strong> "mainT0.h"<br />
#<strong>de</strong>fine led pin_b0<br />
#int_TIMER0 // Tratamento <strong>de</strong> interrupção<br />
void TIMER0_isr(void)<br />
{<br />
static int conta;<br />
// reinicia o timer 0 em 131 mais a contagem que já passou<br />
set_timer0(131 + get_timer0());<br />
conta++;<br />
if (conta == 125) // se já ocorreram 125 interrupções
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
{<br />
conta = 0;<br />
output_toggle (led); // inverte o esta<strong>do</strong> <strong>do</strong> led<br />
}<br />
}<br />
void main()<br />
{<br />
setup_adc_ports(NO_ANALOGS);<br />
setup_adc(ADC_OFF);<br />
setup_psp(PSP_DISABLED);<br />
setup_spi(SPI_SS_DISABLED);<br />
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64);<br />
setup_timer_1(T1_DISABLED);<br />
setup_timer_2(T2_DISABLED,0,1);<br />
setup_com<strong>para</strong>tor(NC_NC_NC_NC);<br />
setup_vref(FALSE);<br />
// habilita interrupções<br />
enable_interrupts(INT_TIMER0);<br />
enable_interrupts(GLOBAL);<br />
set_timer0(131); // inicia o timer 0 em 131 (256 - 125) <strong>para</strong><br />
// dividir por 125<br />
while (true); // espera interrupção<br />
}<br />
// Fim <strong>do</strong> arquivo mainT0.c<br />
// Arquivo ADC.h<br />
#inclu<strong>de</strong> <br />
#<strong>de</strong>vice adc=10 // ADC em 10bits<br />
#FUSES NOWDT //No Watch Dog Timer<br />
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)<br />
#FUSES NOPUT //No Power Up Timer<br />
#FUSES NOPROTECT //Co<strong>de</strong> not protected from reading<br />
#FUSES NODEBUG //No Debug mo<strong>de</strong> for ICD<br />
#FUSES NOBROWNOUT//No brownout reset<br />
#FUSES NOLVP //No low voltage prgming, B3(<strong>PIC</strong>16) or B5(<strong>PIC</strong>18) used for I/O<br />
#FUSES NOCPD //No EE protection<br />
#FUSES NOWRT //Program memory not write protected<br />
#use <strong>de</strong>lay(clock=20000000)<br />
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=5)<br />
// Fim <strong>do</strong> arquivo ADC.h<br />
// Arquivo ADC.C<br />
// Conversão Analógico Digital<br />
#inclu<strong>de</strong> "adc.h"<br />
#inclu<strong>de</strong> "mod_lcd.c" // Biblioteca <strong>do</strong> LCD <strong>de</strong>ve estar junto <strong>do</strong> arquivo principal
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
void main()<br />
{<br />
long int valor; // variavel <strong>de</strong> 16 bits<br />
int32 val32; // variavel <strong>de</strong> 32 bits<br />
setup_adc_ports(AN0_AN1_AN3); // Configura ADC <strong>para</strong> 3 canais<br />
setup_adc(ADC_CLOCK_INTERNAL);// ADC clock interno<br />
setup_psp(PSP_DISABLED);<br />
setup_spi(SPI_SS_DISABLED);<br />
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);<br />
setup_timer_1(T1_DISABLED);<br />
setup_timer_2(T2_DISABLED,0,1);<br />
setup_com<strong>para</strong>tor(NC_NC_NC_NC);<br />
setup_vref(FALSE);<br />
lcd_ini(); // inicializa o LCD<br />
set_adc_channel(0); // seleciona o canal 0 <strong>do</strong> ADC<br />
while (true)<br />
{<br />
lcd_escreve ('\f'); // apaga o display<br />
// O escalonamento é realiza<strong>do</strong> da seguinte forma:<br />
// resulta<strong>do</strong> = (5000 * valor li<strong>do</strong>) / 1023<br />
// Para facilitar os cálculos, somamos um ao<br />
// valor li<strong>do</strong>:<br />
// resulta<strong>do</strong> = (5000 * (valor + 1)) / 1024<br />
// simplifican<strong>do</strong>:<br />
// resulta<strong>do</strong> = ((valor + 1) * 4) + ((valor + 1) * 113) / 128<br />
// Repare que é necessário converter a segunda parte da<br />
// equação <strong>para</strong> 32 bits <strong>para</strong> que o compila<strong>do</strong>r efetue o<br />
// cálculo corretamente<br />
valor = read_adc(); // efetua a conversão A/D<br />
// Se o valor é > 0, soma 1 ao valor li<strong>do</strong><br />
if (valor) valor += 1;<br />
val32 = valor * 4 + ((int32)valor * 113) / 128;<br />
// imprime o valor da tensão no display<br />
// 5000 = 5,000 Volts ou 5000 milivolts<br />
printf (lcd_escreve,"Tensao = %lu mV", val32);<br />
// se a tecla enter for pressionada<br />
if (kbhit()) if (getc() == 13)<br />
{<br />
// imprime os resulta<strong>do</strong>s na serial<br />
printf ("Tensao = %lu miliVolts\r\n",val32);<br />
printf ("Valor = %lu\r\n",valor);<br />
}<br />
<strong>de</strong>lay_ms (250); // aguarda 250 ms<br />
}<br />
}<br />
// Fim <strong>do</strong> arquivo ADC.c
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
// Arquivo LCD.h<br />
// Tratamento <strong>de</strong> LCD alfanumérico<br />
#inclu<strong>de</strong> <br />
#<strong>de</strong>vice adc=8<br />
#FUSES NOWDT //No Watch Dog Timer<br />
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)<br />
#FUSES NOPUT //No Power Up Timer<br />
#FUSES NOPROTECT //Co<strong>de</strong> not protected from reading<br />
#FUSES NODEBUG //No Debug mo<strong>de</strong> for ICD<br />
#FUSES NOBROWNOUT//No brownout reset<br />
#FUSES NOLVP //No low voltage prgming, B3(<strong>PIC</strong>16) or B5(<strong>PIC</strong>18) used for I/O<br />
#FUSES NOCPD //No EE protection<br />
#FUSES NOWRT //Program memory not write protected<br />
#use <strong>de</strong>lay(clock=20000000)<br />
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=5)<br />
//Fim <strong>do</strong> arquivo LCD.h<br />
// Arquivo LCD.c<br />
// Tratamento <strong>de</strong> LCD<br />
// arquivo mod_lcd.c <strong>de</strong>ve estar no mesmo diretório <strong>do</strong> arquivo principal<br />
#inclu<strong>de</strong> "LCD.h"<br />
#inclu<strong>de</strong> "mod_lcd.c"<br />
void main()<br />
{<br />
setup_adc_ports(NO_ANALOGS);<br />
setup_adc(ADC_OFF);<br />
setup_psp(PSP_DISABLED);<br />
setup_spi(SPI_SS_DISABLED);<br />
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);<br />
setup_timer_1(T1_DISABLED);<br />
setup_timer_2(T2_DISABLED,0,1);<br />
setup_com<strong>para</strong>tor(NC_NC_NC_NC);<br />
setup_vref(FALSE);<br />
lcd_ini(); // Inicializa o LCD<br />
lcd_escreve ('\f'); // limpa o display<br />
// Função lcd_escreve<br />
//lcd_escreve ("Curso <strong>de</strong> <strong>PIC</strong>");<br />
// Imprime menssagem no LCD<br />
printf (lcd_escreve, "Curso <strong>de</strong> <strong>PIC</strong>");<br />
int conta = 0; // Variavel <strong>de</strong> contagem
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
while (true)<br />
{<br />
lcd_pos_xy (1, 2); // Pasiciona <strong>curso</strong>r no LCD<br />
printf (lcd_escreve, "Conta: %3u.", conta);<br />
if (conta != 100)<br />
conta++;<br />
else<br />
conta = 0;<br />
<strong>de</strong>lay_ms (100);<br />
}<br />
}<br />
/* Funções importantes da biblioteca mod_lcd<br />
lcd_ini() // inicializa LCD<br />
lcd_pos_xy( byte x, byte y) // posição <strong>de</strong> texto x, y<br />
lcd_escreve( char c) // função <strong>de</strong> escrita no LCD<br />
*/<br />
// Fim <strong>do</strong> arquivo LCD.c<br />
Configuração <strong>de</strong> novos projetos no ambiente <strong>PIC</strong>C-CCS<br />
Assistente <strong>de</strong><br />
novos projetos
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Inicialmente o assistente pe<strong>de</strong> <strong>para</strong> salvarmos o projeto. Dica: como o compila<strong>do</strong>r gera<br />
muitos arquivos é interessante que guar<strong>de</strong>mos cada projeto novo em uma pasta<br />
se<strong>para</strong>da, assim certificamos que cada arquivo (.hex) seja facilmente encontra<strong>do</strong> <strong>para</strong><br />
gravação.<br />
Pasta<br />
<strong>de</strong>stino<br />
Nome <strong>do</strong><br />
Projeto<br />
Botão Salvar<br />
Em seguida, encontramos as telas <strong>de</strong> configuração <strong>do</strong> Projeto que vamos <strong>de</strong>senvolver,<br />
seguem diversas telas <strong>de</strong> configuração <strong>de</strong> cada periférico <strong>do</strong> <strong>PIC</strong>.
Guias <strong>de</strong><br />
configuração<br />
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
No MPLab temos algumas configurações:<br />
Assistente <strong>de</strong><br />
Projeto<br />
Selecione o <strong>PIC</strong><br />
Programa exemplo<br />
Nome <strong>do</strong> Projeto<br />
Frequência <strong>de</strong><br />
funcionamento<br />
<strong>do</strong> <strong>PIC</strong><br />
Configuração<br />
<strong>do</strong>s Fuses
Foi<br />
encontra<strong>do</strong>?<br />
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Bem-vin<strong>do</strong>! Qual <strong>PIC</strong>?<br />
Se já existir um arquivo<br />
adicione ao projeto, senão,<br />
<strong>de</strong>vemos criar um novo.<br />
Compila<strong>do</strong>r<br />
Buscar<br />
compila<strong>do</strong>r<br />
Selecione o Programa<strong>do</strong>r, no caso MPLab ICD2<br />
Nome <strong>do</strong> Projeto<br />
Selecione o<br />
<strong>PIC</strong><br />
Salvar na<br />
pasta?<br />
Detalhes <strong>do</strong><br />
novo projeto
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Arquivo fonte, no caso<br />
em linguagem C<br />
Barra <strong>de</strong> ferramentas <strong>do</strong><br />
grava<strong>do</strong>r<br />
Dentro <strong>do</strong> ambiente MPLab, o programa<strong>do</strong>r já grava no <strong>PIC</strong> o arquivo .hex, se for<br />
utiliza<strong>do</strong> outro grava<strong>do</strong>r externo, <strong>de</strong>vemos carregar o arquivo .hex <strong>para</strong> ser grava<strong>do</strong>, este<br />
arquivo está junto com os arquivos gera<strong>do</strong>s na criação <strong>do</strong> projeto, por isso a necessida<strong>de</strong><br />
<strong>de</strong> gravarmos cada projeto em uma pasta se<strong>para</strong>da.<br />
Utilizan<strong>do</strong> o Proteus <strong>para</strong> simular nossos projetos<br />
Abrimos o Proteus (ISIS) e inserimos os componentes:<br />
Para inserir os<br />
componentes<br />
Botão compilar<br />
Caixa <strong>de</strong> comunicação <strong>do</strong><br />
grava<strong>do</strong>r mostran<strong>do</strong> que está<br />
pronto <strong>para</strong> próxima operação!
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Selecione o<br />
componente, clican<strong>do</strong><br />
duas vezes com o<br />
botão esquer<strong>do</strong>.<br />
Insira os componentes e<br />
faça as ligações, o<br />
hardware <strong>de</strong>pen<strong>de</strong> <strong>do</strong><br />
software!
Arquivo<br />
fonte <strong>do</strong> <strong>PIC</strong><br />
Frequência<br />
<strong>do</strong> <strong>PIC</strong><br />
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Tu<strong>do</strong> configura<strong>do</strong>, vamos simular!<br />
Altere os<br />
elementos como<br />
se fosse real<br />
Clique <strong>para</strong> simular<br />
Configuração <strong>do</strong><br />
Terminal Serial Virtual
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Se o componente sumiu, clique <strong>para</strong> vê-lo novamente.<br />
Glossário <strong>de</strong> termos relaciona<strong>do</strong>s a microcontrola<strong>do</strong>res <strong>PIC</strong><br />
PORT : Agrupamento <strong>de</strong> pinos. Ex : PORT A : Pinos RA0 a RA5. PORT B : Pinos<br />
RB0 a RB7.<br />
PWM : Modulação por largura <strong>de</strong> pulso. Permite simular uma saída analógica através<br />
<strong>de</strong> pulsos digitais rápi<strong>do</strong>s e <strong>de</strong> tamanho regulável.<br />
ADC : Conversor digital / analógico.<br />
ICSP : In-Circuit Serial Programming (Programação Serial In-Circuit) Re<strong>curso</strong> <strong>de</strong><br />
<strong>programação</strong> serial embutida, permitin<strong>do</strong> que um grava<strong>do</strong>r seja construí<strong>do</strong> com custo<br />
relativamente baixo.<br />
RAM : Memória <strong>de</strong> acesso aleatório, volátil e <strong>de</strong> alta velocida<strong>de</strong> <strong>de</strong> acesso.<br />
ROM : Memória <strong>de</strong> programa, gravada quan<strong>do</strong> se transfere o programa <strong>para</strong> o<br />
microcontrola<strong>do</strong>r.<br />
EEPROM : Memória fixa que po<strong>de</strong> ser gravada e apagada em tempo <strong>de</strong> execução.<br />
SERIAL : Dispositivo <strong>de</strong> comunicação on<strong>de</strong> um bit é envia<strong>do</strong> <strong>de</strong> cada vez.<br />
I2C : Padrão <strong>de</strong> comunicação serial <strong>de</strong>senvolvi<strong>do</strong> pela PHILIPS.<br />
SPI : Serial Peripheral Interface – Interface periférica serial : Padrão <strong>de</strong> comunicação<br />
serial que usa 4 fios.
Introdução à <strong>programação</strong> <strong>de</strong> microcontrola<strong>do</strong>res – www.pictronics.com.br<br />
Bibliografia e referências:<br />
• PEREIRA, Fábio, <strong>PIC</strong> Programação em C, Editora Érica, 3ª Ed.<br />
• PEREIRA, Fábio, Microcontrola<strong>do</strong>res <strong>PIC</strong> Técnicas Avançadas, Editora Érica, 6ª Ed.