28.04.2013 Views

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

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!