Sei sulla pagina 1di 85

Curso Microcontroladores PIC e Linguagem C

Prof. Fagner de Araujo Pereira


1


O Mundo dos
Microcontroladores

A situao que nos encontramos hoje no campo de microcontroladores teve seu incio
a partir do desenvolvimento da tecnologia de circuitos integrados. Esse desenvolvimento
permitiu que pudssemos instalar centenas de milhares de transistores em um nico chip, que
foi a precondio para a possibilidade de fabricao de microprocessadores. Os primeiros
computadores foram ento desenvolvidos a partir dos microprocessadores, adicionando
perifricos externos, tais como memrias, linhas de entrada e sada, temporizadores e outros
circuitos. Aumentando ainda mais a densidade de elementos dentro dos chips resultou no
desenvolvimento de circuitos que continham ambos, processador e perifricos. Isto mostra
como o primeiro chip contendo um microcomputador chamado mais tarde de microcontrolador
foi desenvolvido.


1.1 Introduo

Novatos em eletrnica geralmente pensam que o microcontrolador o mesmo
que microprocessador. Isso no verdade. Eles diferem entre si em muitos aspectos. A
diferena primeira e mais importante em favor do microcontrolador a sua
funcionalidade. Para que o microprocessador possa ser usado, outros componentes,
como a memria por exemplo, devem ser adicionados a ele. Mesmo sendo considerada
uma poderosa mquina de computao, no capaz, por si s, de se comunicar com o
ambiente externo. A fim de permitir que o microprocessador se comunique com o
ambiente externo, circuitos especiais devem ser usados. Isto como era no princpio e
continua sendo at hoje.
Por outro lado, o microcontrolador foi projetado para ser tudo isso em um nico
chip. No so necessrios outros componente externos para a sua aplicao, pois todos
os circuitos necessrios j esto includos no mesmo, dentro de um nico chip. Isso
economiza tempo e espao necessrios para projetar um dispositivo.
Na figura 1.1 podem ser vistos os componentes perifricos inclusos no chip de
um microcontrolador de uso geral. Observe que o microcontrolador formado
basicamente pelo microprocessador, responsvel pelo controle de todo o funcionamento
do chip, e dos circuitos perifricos como memrias, conversores A/D, circuito oscilador,
etc.



Captulo
1
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
2




Figura 1.1 Elementos construtivos de um microcontrolador de uso geral.

Dispositivos eletrnicos capazes de controlar um pequeno submarino, um
guindaste ou um elevador j so construdos em um nico chip. Os microcontroladores
oferecem uma ampla gama de aplicaes e, normalmente, apenas algumas delas so
usadas. critrio do projetista decidir o que ele quer que o microcontrolador faa no seu
produto. Para isso, o projetista descarrega um programa contendo instrues adequadas
para que o microcontrolador execute a ao desejada. Antes de conceber o seu produto
final, seu funcionamento deve ser testado por um simulador. Se tudo funcionar bem, o
microcontrolador inserido no dispositivo. Se h necessidade de alteraes no
comportamento do produto, melhorias ou atualizaes, basta faz-lo. At quando? At
que sinta-se satisfeito.
Na figura 1.2 pode ser observado, de uma forma cmica, o fluxo de
desenvolvimento de um projeto que utiliza microcontroladores como principal
elemento. A rigor, um projeto baseado em microcontroladores consiste no estudo do
dispositivo a ser controlado pelo microcontrolador. Baseado nas caractersticas desse
dispositivo, o projetista deve identificar as necessidades de hardware tais como nmero
de entradas/sadas, temporizadores, conversores A/D, etc, para o seu controle. Com as
necessidades de hardware identificadas, o projetista deve escolher um microcontrolador
que possua aqueles requisitos e que satisfaa s suas necessidades. Usando um
computador pessoal e uma linguagem de programao de alto nvel, deve-se escrever
um programa para rodar no microcontrolador. Enquanto programa, usa-se o computador
para fazer simulaes e testar o seu funcionamento. O programa escrito deve ser
convertido em cdigo que pode ser interpretado pelo microcontrolador. Com o auxlio
de um programador, esse cdigo deve ser descarregado dentro da memria do
microcontrolador. Uma vez que o microcontrolador possua em sua memria as
instrues a serem executadas, basta instal-lo no dispositivo a ser controlado.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
3


Figura 1.2 Fluxo de desenvolvimento de um projeto utilizando microcontroladores.






Diga tchau para a
sua famlia por
alguns dias
Alimente seus
animais de
estimao
Estude a mquina a ser
controlada pelo microcontrolador
Procure pelas
caractersticas
disponveis em cada
microcontrolador
Escolha as que atendem
suas necessidades
Projete e construa um
hardware para
conectar o
microcontrolador ao
mundo externo
Use um
computador
para escrever o
programa a ser
executado
Converta o programa em
cdigo de mquina e
descarregue esse cdigo na
memria do microcontrolador
Insira o microcontrolador j programado
no dispositivo a ser controlado
Aproveite o sucesso e comece a
pensar em novos projetos

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
4
1.2 Sistemas numricos

Sistema de Numerao Decimal

O sistema decimal um sistema de numerao posicional que utiliza a base dez.
Baseia-se em uma numerao de posio, onde os dez algarismos indo-arbicos:
0 1 2 3 4 5 6 7 8 9 servem para contar unidades, dezenas, centenas, etc. da direita para a
esquerda. Contrariamente numerao romana, o algarismo rabe tem um valor
diferente segundo sua posio no nmero: assim, em 111, o primeiro algarismo
significa 100, o segundo algarismo 10 e o terceiro 1, enquanto que em VIII (oito em
numerao romana) os trs I significam todos 1.
Assim:



Da direita para esquerda, o primeiro dgito representa as unidades, o segundo as
dezenas, o terceiro as centenas e assim sucessivamente.
No sistema decimal o smbolo 0 (zero) posicionado esquerda do nmero
escrito no altera seu valor representativo. Assim: 1; 01; 001 ou 0001 representam a
mesma grandeza, neste caso a unidade. O smbolo zero posto direita implica
multiplicar a grandeza pela base, ou seja, por 10 (dez).

Sistema de Numerao Binrio

O que aconteceria se apenas dois dgitos fossem usados - 0 e 1? Ou se no
soubssemos como determinar se algo 3 ou 5 vezes maior do que qualquer outra
coisa? Ou se estivssemos restritos a comparar dois tamanhos, ou seja, se s podemos
afirmar que algo existe (1) ou no existe (0)? A resposta "nada de especial".
Gostaramos de continuar a usar os nmeros da mesma forma como o fazemos agora,
mas seria um pouco diferente. Por exemplo: 11011010. Quantas pginas de um livro so
representadas pelo nmero 11011010? A fim de aprender isso, voc apenas tem que
seguir a mesma lgica que no exemplo anterior, mas em ordem inversa. Tenha em
mente que tudo isso sobre matemtica apenas com dois dgitos, 0 e 1, ou seja, a base
do sistema de nmero 2 (sistema de nmeros binrios).
O sistema binrio ou base 2, um sistema de numerao posicional em que
todas as quantidades se representam com base em dois nmeros, com o que se dispe
das cifras: zero e um (0 e 1).
Os computadores digitais, e tambm os microcontroladores trabalham
internamente com dois nveis de tenso, visto que o seu sistema de numerao natural
o sistema binrio (ligado, desligado). O sistema binrio a base para a lgebra
booleana (de George Boole - matemtico ingls), que permite fazer operaes lgicas e
aritmticas usando-se apenas dois dgitos ou dois estados (sim e no, falso e verdadeiro,
tudo ou nada, 1 e 0, ligado e desligado). Toda a eletrnica digital e computao esto
baseadas nesse sistema binrio e na lgica de Boole, que permite representar por
circuitos eletrnicos digitais (portas lgicas) os nmeros, caracteres, realizar operaes
lgicas e aritmticas.


Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
5
Sistema de Numerao Hexadecimal

No incio do desenvolvimento dos computadores foi percebido que as pessoas
tinham muitas dificuldades em lidar com nmeros binrios. Por esta razo, um novo
sistema, com 16 smbolos diferentes foi criado. chamado sistema de numerao
hexadecimal, consistindo de dez dgitos que estamos acostumados a usar(0, 1, 2, 3, ... 9)
e mais seis letras do alfabeto A, B, C, D, E e F.
O maior nmero que pode ser representado por 4 dgitos binrios o nmero
1111. Ele corresponde ao nmero 15 no sistema decimal, enquanto que no sistema
hexadecimal representado por um nico dgito, F. o maior nmero de 1 dgito no
sistema hexadecimal. O maior nmero escrito com oito dgitos binrios , ao mesmo
tempo o maior nmero de 2 dgitos hexadecimais. Na figura 1.3 pode ser observado um
exemplo da correlao existente entre nmeros no sistema binrio e no sistema
hexadecimal.



Figura 1.3 Mesmo nmero sendo representado por 8 dgitos binrios e 2 dois dgitos
hexadecimais.


Converso entre Sistemas de Numerao

O sistema numrico binrio mais comumente usado, o sistema decimal mais
compreensvel, enquanto o sistema hexadecimal algo entre eles. Portanto, muito
importante aprender como converter nmeros de um sistema numrico para outro, ou
seja, como transformar uma sequncia de zeros e uns em valores compreensveis.

Converso binrio-decimal

Dgitos em um nmero binrio tm valores diferentes dependendo da posio
que eles ocupam no nmero. Alm disso, cada posio pode conter 1 ou 0 e seu valor
pode ser facilmente determinado atravs da contagem de sua posio da direita para
esquerda. Para fazer a converso de um nmero binrio para decimal necessrio
multiplicar os valores dos dgitos correspondentes (0 ou 1) pelo seu respectivo peso na
base binria e adicionar todos os resultados. Veja o exemplo abaixo:


Note-se que, para representar nmeros decimais de 0 a 3, voc precisar usar
apenas dois dgitos binrios. Para nmeros maiores, dgitos binrios extras devem ser
usados. Assim, a fim de representar nmeros decimais 0-7 voc precisa de trs dgitos
Binrio de 8 dgitos
Mesmo nmero no sistema hexadecimal
Nmero binrio Mesmo nmero no sistema decimal
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
6
binrios, conforme o exemplo acima. Para os nmeros 0-15 voc precisa de quatro
dgitos, etc.
Com n dgitos binrios possvel representar 2
n
valores decimais. Para saber
qual o maior nmero decimal que pode ser representado com n dgitos binrios,
simplesmente calcule o valor de 2
n
-1. Assim, por exemplo, se n= 4:

2
4
-1 = 16-1 = 15

Assim, usando 4 dgitos binrios, possvel representar nmeros decimais de 0 a
15, o que equivale a 16 diferentes valores no total.


Converso hexadecimal-decimal

A fim de fazer a converso de um nmero hexadecimal em decimal, cada dgito
hexadecimal deve ser multiplicado pelo nmero 16 elevado pelo seu valor de posio,
semelhante ao que foi feito na base binria. Aps isto, somam-se os valores obtidos
individualmente. Por exemplo:


Converso hexadecimal-binrio

No necessrio realizar nenhum clculo a fim de converter nmeros de
hexadecimal para binrio. Os dgitos hexadecimais so simplesmente substitudos por
dgitos binrios adequados. Desde que o mximo valor representado por um dgito
hexadecimal equivalente ao nmero decimal 15, ns precisamos usar quatro dgitos
binrios para representar um dgito hexadecimal. Por exemplo:

Um quadro comparativo a seguir contm os valores dos nmeros de 0-255 em
trs diferentes sistemas numricos. Esta provavelmente a maneira mais fcil de
entender a lgica comum aplicado a todos os sistemas.
Observe que para representar os valores 0-255 nesses sistemas so necessrios:

* 3 dgitos decimais no sistema decimal;
* 8 dgitos binrios no sistema binrio;
* 2 dgitos hexadecimais no sistema hexadecimal.

Nmero hexadecimal
Mesmo nmero no sistema decimal
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
7
O sistema numrico decimal, juntamente com os sistemas binrio e hexadecimal,
so considerados os sistemas numricos mais importantes para ns. fcil fazer a
converso de um nmero hexadecimal em binrio e tambm fcil de lembrar. No
entanto, essas converses podem causar confuso. Por exemplo, o que significa a frase
preciso contar at 110 produtos na linha de montagem. Dependendo se tratar de um
valor binrio, decimal ou hexadecimal, o resultado poderia ser 6, 110 ou 272 produtos,
respectivamente! Assim, a fim de evitar mal-entendidos, diferentes prefixos e sufixos
so adicionados diretamente aos nmeros. O prefixo $ ou 0x, bem como o sufixo h
marcam os nmeros no sistema hexadecimal. Por exemplo, o nmero hexadecimal
10AF pode ser escrito como $10AF, ou 0x10AF, ou ainda 10AFh. Da mesma forma, os
nmeros binrios geralmente usam os prefixos % ou 0b. Se um nmero no tem nem o
prefixo nem sufixo considerado decimal. Infelizmente, esta maneira de marcar os
nmeros no padronizada, assim, isto depende da concreta aplicao

.

Tabela comparativa mostrando os valores 0-255 escritos em trs diferentes sistemas numricos:
decimal, binrio e hexadecimal.

Conceito de BIT

Um bit nada mais que um dgito binrio. Semelhante ao sistema de
numerao decimal em que os dgitos de um nmero no tm o mesmo valor (por
exemplo, os dgitos do nmero decimal 444 so os mesmos, mas tm valores
diferentes), a significncia de um bit depende de sua posio no nmero binrio . Como
no h sentido falar de unidades, dezenas etc, em nmeros binrios, seus dgitos so
referidos como o bit zero (bit mais direita), primeiro bit (o segundo da direita),
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
8
segundo bit, terceiro bit, etc. Alm disso, uma vez que o sistema binrio utiliza dois
dgitos apenas (0 e 1), o valor de um bit pode ser 0 ou 1.


Conceito de BYTE

Um byte composto por oito bits agrupados. Se um bit um dgito, lgico
dizer que bytes representam nmeros. Todas as operaes matemticas podem ser
realizadas sobre eles, os bytes, igualmente aos nmeros decimais. Semelhante a dgitos
de um nmero qualquer, os dgitos de um bytes no tem o mesmo significado. O bit
mais esquerda tem o maior valor, e chamado o bit mais significativo (MSB Most
Significant Bit). O bit mais direita tem o menor valor e por isso chamado o bit
menos significativo (LSB Least Significant bit). Os 8 bits de um byte podem assumir
valores 0 ou 1, independentemente. Assim, esses 8 bits podem ser combinados em 256
formas diferentes, o maior nmero decimal que pode ser representado por um byte
255.
Um nibble referido como metade de um byte. Dependendo de que metade do
byte estivermos falando (esquerdo ou direito), dizemos que h 'alto' e 'baixo' nibble,
respectivamente.
Os conceitos de bit, byte e nibble podem ser entendidos observando a figura 1.4.

Figura 1.4 Representao dos conceitos de bit, byte e nibble.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
9


Conceitos de
Eletrnica Digital

Alguma vez voc j se perguntou o que h dentro de circuitos eletrnicos integrados
digitais como microcontroladores e processadores? O que faz estes circuitos realizarem
operaes matemticas complexas e tomar decises? Sabia que essa aparente complexidade
inclui apenas alguns elementos diferentes chamados circuitos lgicos ou portas lgicas?



2.1 lgebra de Boole

A operao dos circuitos lgicos baseada em princpios estabelecidos por um
matemtico britnico, George Boole em meados do sculo XIX, antes mesmo da
primeira lmpada ter sido inventada. Originalmente, a idia principal era expressar
formas lgicas atravs de funes algbricas. Tal pensamento foi logo transformado em
um produto prtico, que hoje conhecido como circuitos lgicos E (AND), OU (OR) e
NO (NOT), ou inversor. O princpio de sua operao conhecida como lgebra
booleana.
Algumas instrues encontradas nos programas de microcontroladores do o
mesmo resultado que portas lgicas. Sua operao ser discutida em seguida.

Porta lgica E (AND)

A porta lgica E tem duas ou mais entradas e uma sada. Suponha que a porta
usada neste exemplo tem apenas duas entradas. A lgica um (1) ir aparecer em sua
sada apenas se as duas entradas (A e B) so acionadas com nvel lgico alto (1). A
tabela seguir, chamada de tabela da verdade, mostra a dependncia mtua entre as
entradas e sada.

Captulo
2
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
10
Quando usado em um programa, uma operao lgica E realizada por uma
instruo do programa, que ser discutida posteriormente. Por ora, basta lembrar que a
lgica E num programa refere-se operao lgica AND aplicada aos bits
correspondentes a dois registradores, que so posies de memria onde so
armazanados valores binrios, conforme se pode ver no quadro abaixo.





Porta lgica OU (OR)

Da mesma forma, portas lgicas OU tambm tem duas ou mais entradas e uma
sada. Se a porta tem apenas duas entradas, uma lgica um (1) ir aparecer em sua sada
se uma entrada (A ou B) acionada com nvel lgico alto (1). Ou seja, uma lgica um
(1) aparece em sua sada, se pelo menos uma entrada mantida alta (1). Se todas as
entradas esto lgica zero (0), a sada tambm apresenta lgica zero (0). Em seguida,
pode ser visto a tabela da verdade para a porta lgica OU assim como uma operao OU
realizada com os valores de dois registradores.





Porta lgica NO (NOT)

A porta lgica NO (not) tem apenas uma entrada e uma nica sada. Ela
opera de maneira extremamente simples. Quando a lgica zero (0) aparece em sua
entrada, uma lgica de um (1) aparece em sua sada e vice-versa. Isso significa que esta
porta inverte o sinal e freqentemente chamada de inversora.
No programa, essa operao lgica feita sobre um byte, ou apenas um bit. O
resultado um byte com bits invertidos. Se o byte considerado como um nmero, o
valor invertido na verdade um complemento do mesmo. O complemento de um
nmero um valor que adicionado ao nmero faz com que ele alcance o maior nmero
de 8 dgitos binrios. Em outras palavras, a soma de um nmero de 8 dgitos e seu
complemento sempre 255.
Em seguida, pode ser visto a tabela da verdade para a porta lgica NO assim
como uma operao NO realizada com o valor de um registrador.


Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
11




Porta lgica OU-EXCLUSIVO (XOR)

A porta OU EXCLUSIVO (XOR) um pouco complicado em comparao
com outras portas. Ela representa uma combinao de todos eles. A lgica um (1)
aparece em sua sada somente quando suas entradas tm estados lgicos diferentes.
No programa, esta operao comumente usada para comparar dois bytes. A
subtrao pode ser utilizada para o mesmo fim (se o resultado for 0, os bytes so
iguais). Ao contrrio de subtrao, a vantagem desta operao lgica que no
possvel a obteno de resultados negativos.
Em seguida, pode ser visto a tabela da verdade para a porta lgica OU
EXCLUSIVO assim como uma operao realizada com os valores de dois registradores.






Registradores

Em suma, um registrador, ou uma clula de memria, um circuito eletrnico
que pode memorizar o estado de um byte. Dentro de um microcontrolador h vrios
registradores que so usados para armazenar as informaes do programa. Essas
informaes podem ser variveis de controle do programa, estado das entradas ou
sadas, resultado de uma operao matemtica, etc.
Graficamente, podemos ver como funciona um registrador atravs da figura 2.1.
Nessa figura, a unidade central de processamento (CPU) pode armazenar um byte numa
posio de memria, ou registrador. Esse valor armazenado, pode em seguida ser
utilizado pela prpria CPU para um novo clculo ou processamento.



Figura 2.1 CPU comunicando-se com um registrador.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
12
Alm de registradores de uso geral como o mostrado na figura 2.1, que no tem
nenhuma funo especfica e determinada, cada microcontrolador possui um nmero de
registradores especiais (Special Function Registers-SFR), cuja funo pr-determinada
pelo fabricante. Seus bits so conectados (literalmente) com os circuitos internos do
microcontrolador, tais como temporizadores, conversores A/D, osciladores e outros, o
que significa que eles so usados diretamente no comando da operao destes circuitos.
O estado dos bits do registrador alterado a partir do programa. O estado dos bits
controla pequenos circuitos dentro do microcontrolador.
Imagine oito interruptores que controlam o funcionamento de um pequeno
circuito dentro do microcontrolador: registradores especiais fazem exatamente isso,
como pode ser observado na figura 2.2.



Figura 2.2 CPU comunicando-se com um registrador de funo especial.


Portas de Entrada/Sada

A fim de tornar o microcontrolador til, este tem que ser ligado a uma eletrnica
adicional, ou seja, aos perifricos. Cada microcontrolador tem um ou mais registradores
(chamados portas) conectados aos pinos do microcontrolador. Por que entrada / sada?
Porque voc pode mudar a funo do pino que desejar. Por exemplo, suponha que voc
deseja que o seu dispositivo ligue/desligue trs LEDs de sinal e, simultaneamente,
monitore o estado lgico de cinco sensores ou teclas. Algumas das portas precisam ser
configuradas de modo que hajam trs sadas (ligadas LEDs) e cinco entradas (ligadas
a sensores). Esta configurao simplesmente realizada por software, ou seja, atravs
do programa que o projetista escreve, o que significa que a funo do pino pode ser
alterada durante a operao. Podemos observar o funcionamento de uma porta de um
microcontrolador atravs da figura 2.3.



Figura 2.3 CPU comunicando-se com uma porta de entrada/sada.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
13
Uma importante especificao dos pinos de entrada/sada (I/O) a corrente
mxima que estes podem suportar. Para a maioria dos microcontroladores atuais, a
corrente obtida a partir de um pino suficiente para ativar um LED ou algum outro
dispositivo de baixa corrente (1-20 mA). Quanto mais pinos de I/O, menor corrente
mxima de um pino. Em outras palavras, a corrente mxima indicada na folha de
especificaes de dados para o microcontrolador compartilhada entre todas as portas
de I/O.
Outra funo importante de um pino de I/O que estes podem ter resistncias de
pull-up. Essas resistncias conectam os pinos tenso positiva de alimentao que pode
ser diferente daquela que usada para alimentar o chip do microcontrolador. Isto til
quando se deseja trabalhar com tenses distintas no mesmo circuito
Cada porta de I/O est normalmente sob o controle de um registrador especial, o
que significa que cada bit do registrador determina o estado do pino correspondente. Por
exemplo, escrevendo uma lgica (1) para um bit do registrador de controle (SFR), o
pino apropriado da porta automaticamente configurado como entrada e a tenso
presente nele pode ser lida como nvel lgico 0 ou 1. Caso contrrio, ao escrever zero a
um bit desse SFR, o pino apropriado da porta configurado como uma sada.


Unidade de Memria

A memria a parte do microcontrolador utilizado para armazenamento de
dados. A maneira mais fcil de explicar compar-la com um armrio de arquivo com
muitas gavetas. Suponha-se, as gavetas esto claramente identificadas para que seu
contedo possa ser encontrada com facilidade atravs da leitura da etiqueta na parte
frontal da gaveta.
Da mesma forma, cada endereo de memria corresponde a um local de
memria. O contedo de qualquer lugar pode ser acessado e lido pelo seu
endereamento. Memria pode ser escrita ou lida. Na figura 2.4 temos um representao
de uma memria que pode ser escrita ou lida. Do lado esquerdo, temos o endereo de
cada posio de memria, do lado direito, temos os dados. Ao enderear uma posio
especfica, a linha de dados apresenta o contedo presente naquela posio endereada.
Esse contedo pode ser lido para ser usado em algum processamento, ou ainda, esse
contedo pode ser alterado mediante a escrita de um novo dado naquele endereo.



Figura 2.4 Memria de escrita/leitura de um microcontrolador.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
14
Existem vrios tipos de memria dentro do microcontrolador, tais como:

Memria apenas de leitura (Read Only Memory-ROM) - usado para salvar
permanentemente o programa sendo executado. O tamanho do programa que pode ser
escrito depende do tamanho da memria. Microcontroladores atuais costumam usar 16
bits de endereamento, o que significa que eles so capazes de enderear at 64 Kb de
memria, ou seja, 65.535 localidades. Para iniciantes, o programa ir raramente exceder
o limite de vrias centenas de instrues. Existem vrios tipos de ROM.

Memria Flash - Este tipo de memria foi inventado nos anos 80 nos laboratrios da
Intel e foi apresentada como o sucessor da EPROM UV (tipo de memria ROM que usa
luz ultravioleta para ser apagada). Como o contedo dessa memria pode ser escrito e
apagado praticamente um nmero ilimitado de vezes, microcontroladores com memria
Flash ROM so ideais para a aprendizagem, experimentao e produo em pequena
escala. Devido sua grande popularidade, a maioria dos microcontroladores so
fabricados com tecnologia flash. Ento, se voc estiver pensando em comprar um
microcontrolador, o tipo definitivamente o Flash!

Memria de acesso aleatrio (Random Access Memory-RAM) - Uma vez que a
alimentao desligada, o contedo da RAM apagado. Ela usada para armazenar
dados temporrios e resultados intermedirios criados e utilizados durante a operao do
microcontrolador. Por exemplo, se o programa realiza uma adio (de tudo),
necessrio ter um registro que representa o que na vida cotidiana a chamada "soma".
Por esta razo, podemos ter um dos registros de memria RAM chamado de 'soma' e
usado para armazenar os resultados da adio.

Memria ROM eletricamente apagvel e programvel (Electrically Erasable
Programable ROM-EEPROM) L-se E 2 PROM. O contedo da EEPROM pode ser
alterado durante a operao (semelhante RAM), mas permanente, mesmo aps a
perda de alimentao (similar a ROM). Assim, EEPROM freqentemente usado para
armazenar valores, criados durante a operao, que deve ser permanentemente
guardados. Por exemplo, se voc criar uma fechadura eletrnica ou um alarme, seria
timo que este permitisse ao usurio criar e digitar uma senha. Mas intil se essa
senha for perdida cada vez que a alimentao se apaga. A soluo ideal um
microcontrolador com uma EEPROM embutida.


Interrupes

A maioria dos programas usam interrupes em sua execuo normal. O
objetivo do microcontrolador principalmente responder s mudanas no seu entorno.
Em outras palavras, quando um evento ocorre, o microcontrolador faz alguma coisa. Por
exemplo, quando voc aperta um boto em um controle remoto, o microcontrolador ir
registr-lo e responder pela alterao de um canal, aumentar o volume para cima ou
para baixo, etc. Se o microcontrolador passasse a maior parte de seu tempo
infinitamente verificando alguns botes por horas ou dias, isso no seria prtico.
por isso que o microcontrolador possui uma tcnica de resposta a certos
estmulos. Em vez de verificar cada pino ou bit constantemente, o microcontrolador
delega essa funo a circuitos especficos que s respondero quando algo especfico
acontece, por exemplo, o pressionamento de um boto.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
15
O sinal que informa a unidade de processamento central quando um evento
como esse ocorre chamado de uma interrupo. Quando a interrupo ocorre, o
microcontrolador para de executar o programa e atende aquele evento em especial.
As interrupes so recursos extremamente poderosos e prticos para o
desenvolvimento de sistemas microcontrolados.


Unidade Central de Processamento (CPU)

Como o prprio nome sugere, esta uma unidade que monitora e controla todos
os processos dentro do microcontrolador. constituda por vrias subunidades, das
quais as mais importantes so:

Decodificador de Instrues (Instruction Decoder) uma parte da eletrnica
embutida no microcontrolador que decodifica as instrues do programa e ativa
outros circuitos com base nisso. O "conjunto de instrues" que diferente para
cada famlia de microcontroladores expressa a capacidade do circuito;
Unidade Lgica Aritmtica (ULA) realiza todas as operaes matemticas e
lgicas sobre os dados;
Acumulador um registrador de uso especial intimamente relacionada com a
operao da ULA. uma espcie de mesa de trabalho usada para armazenar
todos os dados em que uma operao deve ser realizada (transferncia,
adio/mover etc.) Ele tambm armazena os resultados prontos para uso no
tratamento posterior. Um dos SFR, chamado de Registrador de Status (Status
Register), est intimamente relacionado com o acumulador. Ele mostra, em
determinado momento o 'status' de um nmero armazenado no acumulador (se
nmero maior ou menor que zero, etc.). O acumulador tambm chamado de
registrador de trabalho e est marcado como registrador W, ou apenas W.

Na figura 2.5 podem ser vistas as subunidades da CPU citadas.



Figura 2.5 Unidade Central de Processamento e suas subunidades.

Na figura 2.5, temos setas representando os fios que levam a informao de
endereamento de memria (Address), dos dados (Data) e das linhas de controle
(Control Line). Cada seta, dependendo do tipo de microcontrolador, pode conter 8, 16
fios ou at mais. Cada conjunto de fios que carregam uma informao do mesmo tipo
chamado de Barramento. Assim, temos os barramentos de endereo, de dados e de
controle.

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
16
Oscilador

Para que o microcontrolador execute as instrues armazenadas em sua
memria, necessrio a presena de um sinal pulsante, normalmente uma onda
quadrada, para que as instrues sejam executadas a cada pulso. Esse sinal chamado
de sinal de relgio (clock), e proveniente de um circuito oscilador. O circuito oscilador
normalmente configurado de modo a utilizar um cristal de quartzo ou ressonador
cermico, conectado a dois pinos do microcontrolador, para a estabilidade de
freqncia, mas tambm pode operar como um circuito stand-alone (como um oscilador
RC interno). importante dizer que as instrues no so executadas ao ritmo imposto
pelo oscilador em si, mas vrias vezes mais lento. Isso acontece porque cada instruo
executada em vrias etapas. Em alguns microcontroladores, o mesmo nmero de ciclos
necessrio para executar todas as instrues, enquanto em outros, o nmero de ciclos
diferente para diferentes instrues. Assim, se o sistema usa um cristal de quartzo com
uma frequncia de 20 Mhz, o tempo de execuo de uma instruo no 50ns, mas 200,
400 ou 800 ns, dependendo do tipo de microcontrolador!


Circuito de alimentao

H duas coisas que merecem ateno sobre o circuito de alimentao do
microcontrolador:

Brown out uma condio potencialmente perigosa que ocorre no momento em
que o microcontrolador desligado ou quando a tenso cai para um valor
mnimo devido a rudo eltrico. Como o microcontrolador composto por vrios
circuitos, com diferentes nveis de tenso de funcionamento, este estado pode
provocar um funcionamento fora de controle. Para evitar isso, normalmente o
microcontrolador possui um circuito de reset que reinicia todos os circuitos
assim que o microcontrolador incorre em um estado de emergncia.
Pino de reset normalmente marcado como MCLR (Master Clear Reset).
utilizado para reiniciar o microcontrolador atravs da aplicao de uma lgica de
zero (0) ou um (1) nesse pino, o que depende do tipo do microcontrolador.


Temporizadores/Contadores

O oscilador do microcontrolador utiliza cristal de quartzo para o seu
funcionamento. Mesmo no sendo a soluo mais simples para a obteno de um sinal
de relgio, existem muitas razes para us-lo. A freqncia do oscilador precisamente
definida e muito estvel, de modo que gera pulsos sempre da mesma largura, o que os
torna ideais para a medio do tempo. Tais osciladores tambm so usados em relgios
de quartzo. Se necessrio medir o tempo entre dois eventos, basta contar os pulsos
gerados por este oscilador. Isto exatamente o que o temporizador, ou timer, faz.
A maioria dos programas usam este cronmetro eletrnico em miniatura. Estes
so geralmente registradores de funes especiais de 8 ou 16-bits, cujo contedo
automaticamente incrementado por cada impulso vindo do circuito oscilador. Uma vez
que um registrador completamente carregado, uma interrupo pode ser gerada.
Se o timer usa um oscilador de quartzo para o seu funcionamento interno, ento
ele pode ser usado para medir o tempo entre dois eventos (se o valor do registrador T1
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
17
no momento em que se inicia a medio, e T2, no momento em que termina, ento o
tempo decorrido igual a o resultado da subtrao T2-T1). Se os registradores usam
pulsos provenientes de fontes externas conectados a um pino do microcontrolador,
ento o timer transformado em um contador. Esta apenas uma explicao simples da
operao em si. No entanto, um pouco mais complicado na prtica.


Conversor Analgico/Digital (A/D)

Sinais externos normalmente so fundamentalmente diferentes daqueles que o
microcontrolador entende (zeros e uns) e tm de ser convertidos em valores
compreensveis para o microcontrolador. Um conversor analgico/digital um circuito
eletrnico que converte os sinais contnuos para discretos nmeros digitais. Em outras
palavras, este circuito converte um valor analgico em um nmero binrio e o transfere
para a CPU para processamento adicional. Este mdulo utilizado para a medio de
tenso analgica em um pino de entrada (valor analgico).
Na figura 2.6, por exemplo, temos uma representao do conversor A/D sendo
controlado pela CPU. O grfico ao lado mostra a relao de converso de sinais
analgicos de 0V at 5V em nmeros binrios que vo de 0x000 a 0x3FF.



Figura 2.6 Operao de um conversor analgico/digital.


Arquitetura Interna

Todos os microcontroladores usam um dos dois modelos de projeto bsicos
chamados arquitetura Harvard e arquitetura von-Neumann.
Eles representam duas formas diferentes de troca de dados entre a CPU e a
memria.
Os microcontroladores com a arquitetura von-Neumann tem apenas um bloco de
memria e um barramento de 8 bits de dados. Como todos os dados so trocados atravs
dessas 8 linhas, o barramentos fica sobrecarregado e a comunicao muito lenta e
ineficiente. A CPU pode apenas executar uma instruo de leitura ou gravao de dados
para a memria. Ambas no podem ocorrer ao mesmo tempo, uma vez que instrues e
dados usam o mesmo barramento.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
18

Figura 2.7 arquitetura Von-Neumann.

Os microcontroladores com arquitetura Harvard tem dois barramentos
diferentes. Um deles conecta a CPU com a memria RAM. O outro consiste em linhas
de 12, 14 ou 16 bits e conecta a CPU com a memria ROM. Assim, a CPU pode ler
uma instruo e ter acesso a dados da memria, ao mesmo tempo. Como todos os
registradores da memria RAM so de 8 bits, todos os dados sendo trocados so da
mesma largura. Durante o processo de escrita, um programa apenas manipula os dados
de 8 bits. Em outras palavras, tudo o que voc pode mudar a partir do programa e tudo o
que pode influenciar de 8 bits. Todos os programas escritos para estes
microcontroladores sero armazenado na ROM do microcontrolador interno depois de
serem compilados em cdigo de mquina. No entanto, posies de memria ROM no
tem 8, mas 12, 14 ou 16 bits. O resto dos bits 4, 6 ou 8 representa a instruo
especificando para a CPU o que fazer com os dados de 8 bits.



Figura 2.8 arquitetura Harvard.


O Conjunto de Instrues

Todas as instrues compreensveis para o microcontrolador so chamadas de o
conjunto (Set) de instrues. Quando voc escreve um programa em linguagem
assembly, na verdade voc especifica instrues na ordem em que devem ser
executadas. A principal restrio aqui o nmero de instrues disponveis. Os
fabricantes costumam considerar uma das duas abordagens abaixo:

Conjunto reduzido de instrues (RISC-Reduced Instruction Set Computer)
Neste caso, o microcontrolador reconhece e executa apenas as operaes bsicas
(adio, subtrao, cpia, etc.) Outras operaes mais complicadas so realizadas
atravs da combinao delas. Por exemplo, a multiplicao feita atravs da realizao
de sucessivas adies. Os microcontroladores da linha PIC so do tipo RISC.

Conjunto complexo de instrues (CISC-Complex Instruction Set Computer)
CISC o oposto ao RISC. Microcontroladores concebidos para reconhecer mais de 200
instrues diferentes, podendo realizar inmeras tarefas em alta velocidade. No entanto,
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
19
preciso entender como aproveitar tudo o que estas instrues oferecem, o que no
nada fcil. Processadores, como Pentium, Core 2 Duo so do tipo CISC.


Modelo genrico de um microcontrolador

Todos os elementos de hardware vistos at agora, e tantos outros no
apresentados aqui, fazem parte da eletrnica embutida em um microcontrolador. Esses
elementos esto todos interligados para desempenhar diferentes tarefas, dependendo das
necessidades do projetista. A figura 2.9 mostra como esses elementos esto interligados
para potencializar o uso de um microcontrolador



Figura 2.9 Elementos de um microcontrolador.


Como fazer a escolha certa?

Ok, voc novato e tomou a deciso de se aventurar em trabalhar com os
microcontroladores. Parabns pela sua escolha! No entanto, no to fcil escolher o
correto microcontrolador, como pode parecer. O problema no um nmero limitado de
dispositivos, mas o oposto!
Antes de comear a projetar um dispositivo baseado no microcontrolador, pense
o seguinte: quantas linhas de entrada/sada eu preciso para a operao? Deve realizar
algumas operaes alm de simplesmente acionar rels? Ser que preciso de algum
mdulo especializado, tal como comunicao serial, etc. Um conversor A/D? Quando
voc cria uma imagem clara do que voc precisa, o intervalo de seleco bastante
reduzido e hora de pensar em preos.
Se voc pensar em todas essas coisas pela primeira vez, ento, tudo parece um
pouco confuso. Primeiro, selecione o fabricante, ou seja, a famlia do microcontrolador.
Estude um modelo especfico. Saiba quanto voc precisa, no entre em detalhes.
Resolva um problema especfico por vez. Em seguida, voc vai perceber que
aprendendo um modelo daquela famlia, voc estar apto a trabalhar com qualquer outro
modelo.
Os microcontroladores PIC, desenvolvidos pela Microchip Technology
provavelmente so a melhor escolha para iniciantes.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
20


O Microcontrolador
PIC 16F877

O PIC16F877 um produto bem conhecido da Microchip. Ele possui todos os
componentes que os microcontroladores modernos normalmente tm. Por seu baixo preo,
ampla gama de aplicaes de alta qualidade e fcil acesso, uma soluo ideal em aplicaes
como o controle de diferentes processos na indstria, dispositivos de controle de mquinas, a
medio de valores de tenso, etc. Algumas de suas principais caractersticas esto listadas
abaixo.


3.1 Introduo

O PIC16F877 um microcontrolador que teve suas origens no ano de 1965,
quando a companhia GI (General Instruments), formou a Diviso de Microeletrnica.
Na dcada de 70, a GI criou um dos primeiros processadores de 16 bits, chamado
CP16000. Como este microprocessador tinha uma certa deficincia no processamento
de entradas/sadas, a GI projetou e construiu um Controlador de Interface Perifrica (em
ingls, Peripheral Interface Controller, ou PIC). Este controlador foi projetado tendo
em vista a rapidez, pois devia processar as operaes de E/S de uma mquina de 16 bits,
e tinha um conjunto de instrues muito pequeno. O CP16000 no teve muito sucesso,
porm o PIC evoluiu para a arquitetura PIC16C5x. Como era disponvel somente nas
verses em ROM, permaneceu como uma boa soluo para grandes usurios, que
podiam encomendar diretamente da fbrica um grande volume de circuitos j pr-
programados.
Na dcada de 80, a diviso de microeletrnica da GI foi reestruturada e se
transformou na GI Microeletrnica, uma empresa subsidiria. Esta empresa foi vendida
para investidores e transformada na Arizona Microchip Technology, dedicada
especificamente ao desenvolvimento de produtos utilizados em sistemas dedicados.
Como parte desta estratgia, grande esforo da companhia foi direcionado ao
desenvolvimento de vrias verses do PIC, sendo que a verso com EEPROM (eprom
apagvel eletricamente) a mais indicada para o desenvolvimento rpido de aplicaes,
devido ao baixo custo do sistema de desenvolvimento necessrio e do hardware de
processamento.
O dispositivo mais flexvel disponvel hoje da srie PIC de 14 bits de palavra de
controle, e que ao mesmo tempo rene um conjunto de caractersticas adequadas ao uso
em pequenas sries de produtos e estudo de microcontroladores o PIC16F877A. Na
Captulo
3
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
21
figura 3.1 pode-se ver o encapsulamento DIP de 40 pinos, um dos encapsulamentos
disponveis para esse microcontrolador.
Como o microcontrolador PIC16F877A se utiliza da arquitetura Harvard, isto
possibilita que as palavras de instrues tenham um nmero de bits (14 bits de
comprimento) diferente do tamanho da palavra de dados (8 bits para este
microcontrolador). Com este tamanho de palavra de instruo possvel codificar todas
as instrues, com exceo dos desvios para outras posies de programas, como
instrues de uma nica palavra, resultando em uma grande velocidade de execuo,
como 200ns para a verso de 20Mhz.

Figura 3.1 Microcontrolador PIC 16F877A com encapsulamento DIP de 40 pinos.

Estes dispositivos podem enderear direta e indiretamente seus arquivos de
registros ou memria de dados. O conjunto de instrues foi projetado de tal forma que
se pode realizar qualquer operao em qualquer registro utilizando qualquer modo de
endereamento.
A unidade lgica aritmtica do PIC16F877 pode realizar operaes de adio,
subtrao, deslocamento e operaes lgicas.
Os microcontroladores da srie PIC16F877 so dispositivos computacionais
extremamente adequados para experimentao e pequenos projetos. Devido ao seu
baixo custo e facilidade de programao, podem ser empregados em aplicaes onde at
recentemente se utilizavam componentes discretos, como por exemplo, os
temporizadores e controladores de temperatura, adicionando novas funes at ento
no implementadas devido a complexidade do circuito necessrio.
O projeto com microcontroladores traz uma diferena fundamental de paradigma
para o projetista de circuitos. Ao invs de um bem sortido estoque de componentes
discretos que realizam vrias funes diferentes cada um, e de um conceito de projeto
que consiste em interligar estas diferentes funes de forma que o sistema como um
todo tenha o comportamento adequado, utilizamos agora praticamente um mesmo tipo
de hardware para todas as aplicaes. A diferena de funcionalidade fica por conta do
software. Alteraes de funcionalidade podem ser feitas, em grande parte das vezes,
atravs da modificao apenas do software, sem ser necessria alterao do hardware.
Os microcontroladores da srie PIC16F87X so mquinas RISC. Isto significa
que so mquinas com um reduzido conjunto de instrues. Para ser exato, so apenas
35 instrues para serem compreendidas, cada uma ocupando uma palavra (14 bits ).
O PIC16F877 possui as seguintes caractersticas bsicas:
5 conjuntos de portas de entrada e sada (total de 33 entradas/sadas);
Conversor analgico/digital de 10 bits de resoluo e 8 canais de entrada;
Perifrico de comunicao paralela e serial (USART e MSSP);
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
22
2 Mdulos CCP (Comparao, Captura e PWM);
3 Timers (1 de 16 bits e 2 de 8 bits);
Watchdog timer (temporizador especial).
Na figura 3.2 temos uma representao da arquitetura interna do PIC16F877, ou
seja, uma representao da forma como os recursos esto ligados internamente no chip.



Figura 3.2 Arquitetura interna do PIC microcontrolador PIC 16F877.

Na figura 3.3 temos a descrio dos pinos no encapsulamento. Observe que
alguns pinos apresentam mais de uma funo. Isso significa que o projetista deve
escolher qual a funo que o pino vai assumir quando estiver fazendo a sua
programao. A descrio de cada pino do microcontrolador mostrada na tabela que
segue:


Figura 3.3 Pinagem do microcontrolador PIC 16F877.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
23


Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
24
A fim de que o microcontrolador funcione adequadamente necessrio fornecer:

Alimentao eltrica;
Sinal de reset, e
Sinal de clock.

Mesmo que o PIC16F877 possa operar em tenses de alimentao diferentes,
uma fonte de alimentao DC de 5V a mais adequada. O circuito mostrado na figura
3.4 utiliza um circuito integrado de trs terminais LM7805, um regulador positivo que
oferece alta qualidade de estabilidade de tenso e corrente suficiente para permitir que o
microcontrolador e perifricos eletrnicos funcionem normalmente (o suficiente, aqui,
significa 1A).
Para que o microcontrolador possa operar corretamente, uma lgica (VCC) deve
ser aplicado sobre o pino de reset (pino 1). O boto conectando o pino MCLR ao GND
no necessrio. No entanto, quase sempre fornecido, pois permite que o
microcontrolador seja resetado manualmente, fazendo com que este retorne s
condies normais de funcionamento, caso algo d errado. Ao pressionar este boto, o
pino levado a 0V, o microcontrolador reiniciado e comea a execuo do programa
desde o incio. Um resistor de 10K usado para permitir que o pino MCLR v a 0V,
atravs do boto, sem curto-circuitar com o nvel de 5V DC. Esse resistor chamado de
resistor de pull-up, pois conectado entre o VCC e o pino.
Mesmo que o microcontrolador possua um oscilador interno, ele no pode
operar sem componentes externos que estabilizam o seu funcionamento e determinem
sua freqncia (velocidade de operao do microcontrolador). Dependendo do elemento
em uso para estabilizar a frequncia, bem como suas freqncias, o oscilador pode
operar em quatro modos diferentes:

LP - Cristal de Baixa Potncia;
XT - Cristal/Ressonador;
HS - Cristal de Alta Velocidade e
RC - Resistor/Capacitor.

Quando o cristal de quartzo utilizado para a estabilizao da freqncia, o
oscilador funciona com uma frequncia precisa, que no afetado por mudanas na
temperatura e tenso de alimentao. Esta frequncia geralmente indicada na
embalagem do crysal. Alm do cristal, os capacitores C1 e C2 tambm devem ser
conectados conforme esquema abaixo. Os valores previstos para C1 e C2 na tabela a
seguir devem ser considerados como uma recomendao e no como uma regra rgida.



Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
25


Figura 3.4 Circuito de alimentao, reset e oscilador para o PIC 16F877.

Como visto na figura acima, trata-se de um circuito simples, mas nem sempre
assim. Se o dispositivo de destino utilizado para controlar grandes mquinas ou
dispositivos de suporte a vida, tudo fica cada vez mais complicado. No entanto, esta
soluo suficiente por enquanto.
Independentemente do fato de que o microcontrolador um produto de
tecnologia moderna, este intil se no estiver ligado a alguns componentes adicionais.
Simplificando, o aparecimento de tenses nos pinos do microcontrolador no significa
nada se no for utilizado para a realizao de determinadas operaes, tais como ligar
ou desligar LEDS, rels, ler botes ou chaves, exibir dados em um display de 7
segmentos ou display de LCD etc.
Nos captulos que se seguem, sero abordadas as tcnicas de programao em
linguagem C, bem como a utilizao do micocontrolador para realizar tarefas que vo
desde acender/apagar um LED, at tarefas mais complexas como escrita em um LCD ou
mesmo a comunicao entre dois microcontroladores.
No final desta apostila, encontra-se o datasheet resumido do PIC16F877,
contendo as principais informaes necessrias para o desenvolvimento de aplicaes
utilizando esse microcontrolador.

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
26


Introduo
Linguagem C

Assim como o uso de uma linguagem no est limitada apenas a livros e revistas, as
Linguagens de Programao no esto estritamente relacionadas com algum tipo especial de
computador, processador ou Sistema Operacional. C atualmente uma linguagem de
programao de alto nvel e de uso geral. Entretanto, o fato da no associatividade da
linguagem C a nenhuma mquina pode causar problemas durante a sua utilizao,
dependendo das peculiaridades de cada mquina em que est se programando (isto poderia
ser comparado ao uso de diferentes dialetos de uma linguagem).


4.1 Introduo

A idia associada a escrever um programa na linguagem C quebrar um grande
problema em vrios problemas menores, mais simples de serem resolvidos. Suponha,
por exemplo, que necessrio escrever um programa para o microcontrolador para
realizar a medio de temperatura e mostrar o resultado em um display de cristal
lquido. O processo de medir feito com o uso de um sensor apropriado, que converte a
temperatura em uma tenso proporcional. O microcontrolador usa seu conversor A/D
para converter essa tenso (analgica) em um nmero (digital) que ento enviado para
o LCD atravs de vrios fios. Assim, o programa dividido em quatro partes que
precisam ser executadas na ordem correta, como seguem:




1. Ativar e ajustar o conversor A/D;
2. Realizar a medio do valor analgico;
3. Calcular a temperatura;
4. Enviar os dados de forma apropriada para o display.






Captulo
4
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
27
Para facilitar a compreenso da linguagem C, vejamos primeiramente um
exemplo de programa:
















Vejamos o significado de cada linha do programa.
A primeira linha do programa:

// Primeiro exemplo

chamada de comentrio. Os comentrios no so interpretados pelo compilador, mas
so apenas descries inseridas no cdigo-fonte pelo programador com o intuito de
documentar o programa e para facilitar o seu entendimento por parte de outros
programadores que eventualmente faro alteraes ou atualizaes no programa
original.
Os comentrios podem ser de linha simples, como foi mostrado no exemplo
anterior, e so iniciados por uma barra dupla. Os comentrios de linha simples podem
ser iniciados em qualquer ponto de uma linha e so muito utilizados para descrever o
funcionamento ao final de cada linha de cdigo.
Os comentrios tambm podem ser de mltiplas linhas. Nesse caso, so
compostos por uma ou mais linhas. Iniciam sempre com os caracteres /* para iniciar o
comentrio, e a sequncia */ para terminar o comentrio, como mostra o exemplo
abaixo:

/*
Este um exemplo
de comentrio de
mltiplas linhas
*/

Na prxima linha temos:

#include <16F877A.h>

O comando #include uma diretiva do compilador. Neste caso, est
determinando ao compilador que anexe ao programa o arquivo especificado:
16F877A.h, que um arquivo que contm todas as informaes sobre o
microcontrolador utilizado, no caso, o PIC 16F877A. Arquivos com extenso do tipo
.h so chamados de arquivos de cabealho e so utilizados em C para definir
variveis, tipos, smbolos e funes teis ao programa.
// Primeiro exemplo

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
output_high(pin_b0); //seta o pino rb0
delay_ms(500); //aguarda 500ms
output_low(pin_b0); //reseta o pino rb0

}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
28
Na prxima linha encontramos:

#fuses HS

Esta uma diretiva que especifica o estado dos fusveis da palavra de
configurao do dispositivo. No caso, estamos indicando ao processador que opere com
a opo HS ou High Speed, isto , com um cristal de alta velocidade. Existem vrias
outras opes para configurar os fuses, como por exemplo, proteger o cdigo gravado
no microcontrolador contra leitura, modos de programao, proteo para evitar
travamentos no caso de uma queda de tenso, etc.
Em seguida temos:

#use delay(clock=20M)

Esta outra diretiva do compilador. Esta diretiva especifica o clock, ou a
velocidade do cristal usado para sincronizar as operaes dentro do dispositivo. No
caso, estamos indicando ao compilador que o dispositivo opera com um cristal de
20MHz. Este valor utilizado para a gerao de cdigos de atraso e outras rotinas que
dependam do tempo.
Na prxima linha do programa encontramos:

main()

A declarao main( ) especifica o nome de uma funo. No caso, a funo
main( ) padronizada na linguagem C e utilizada para definir a funo principal, ou o
corpo principal do programa.
Uma funo em C um conjunto de instrues que pode ser executado a partir
de qualquer ponto do programa. O sinal de abertura da chave { utilizado para
delimitar o incio da funo e o sinal de fechamento da chave } indica o final da
funo. Na realidade, as chaves delimitam o que chamamos de bloco de programa ou
bloco de cdigo.
O bloco de programa dentro da funo main( ) formado por 3 instrues. Cada
instruo terminada por um ponto e vrgula (;).
A instruo output_high(pin_b0) uma chamada a uma funo interna do
compilador. Esta funo utilizada para setar (ou seja, colocar em nvel lgico 1) um
pino do microcontrolador, identificado entre os parnteses. Isto significa que o pino rb0
(da porta B) ser setado. Note que (pin_b0) um smbolo predefinido para especificar o
pino rb0. Este smbolo est localizado no arquivo de cabealho do processador
utilizado, e que foi adicionado com a diretiva #include. O contedo presente entre os
parnteses de uma funo chamado de argumento da funo. Assim, pin_b0 o
argumento da funo output_high( ).
A prxima funo a ser executada :

delay_ms(500);

Esta tambm uma funo interna do compilador e utilizada para gerar um
atraso de X milissegundos, indicado entre os parnteses. No caso, o atraso ser igual a
500ms.
A instruo output_low(pin_b0) uma chamada a uma outra funo interna
do compilador. Esta funo utilizada para resetar (ou seja, colocar em nvel lgico 0)
um pino do microcontrolador, identificado entre os parnteses. Isto significa que o pino
rb0 (da porta B) ser resetado.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
29
Desta forma, ao programarmos o PIC com o programa anterior e se tivermos
conectado um LED (com o devido resistor de limitao de corrente) ao pino rb0, ns o
veremos acender, permanecer aceso por 500ms, apagar e depois permanecer apagado.
Obviamente este um programa bem simples, mas que til para o
entendimento inicial da estrutura de um programa escrito em linguagem C.
Podemos dizer que um programa em C constitudo por um ou mais dos
seguintes elementos:

*Operadores so elementos utilizados para comandar interaes entre variveis e dados
em C;

*Variveis que so usadas para armazenamento temporrio ou permanente de dados. A
linguagem C dispe de uma variedade de tipos de variveis e dados;

*Comandos de controle so elementos essenciais escrita de programas em C. So
utilizados para controlar, testar e manipular dados e informaes dentro de programas
em C;

*Funes so estruturas de programa utilizadas para simplificar, otimizar ou apenas
tornar mais claro o funcionamento do programa.

Vejamos outro exemplo de programa em C:

















As quatro primeiras linhas do programa acima constituem o que podemos
chamar de cabealho do programa, onde temos alguns comentrios acerca do programa
e tambm as diretivas de controle do compilador. Observe que as diretivas no
necessitam (e nem permitem) o uso do ponto e vrgula como delimitador.
O primeiro comando, int tempo, chamado de declarao de varivel. Este
comando determina que o compilador crie uma varivel do tipo inteira int chamada
tempo. Esta operao, na realidade ir reservar uma posio de memria no
microcontrolador para o armazenamento do valor relativo varivel. O tipo inteiro int
especifica um tipo de dados de 8 bits com valores compreendidos entre 0 e 255 decimal.
Veremos mais sobre variveis e tipos de dados em seguida.
// Segundo exemplo

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
int tempo;
tempo=100;
output_high(pin_b0); //seta o pino rb0
delay_ms(tempo); //aguarda 100ms
output_low(pin_b0); //reseta o pino rb0
delay_ms(tempo);

}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
30
O nome dado varivel um identificador e pode ser composto de letras,
nmeros e o caractere sublinhado _. Veremos mais sobre identificadores vlidos na
linguagem C.
Em seguida, temos a linha tempo=100 que constitui em uma operao de
atribuio. As atribuies em C so executadas pelo operador de igualdade =. Desta
forma, a linha tempo=100 far com que o compilador gere uma sequncia de instrues
para fazer com que o valor 100 decimal seja armazenado na varivel tempo.
As linhas com output_high( ) e output_low( ) so funes internas ao
compilador e so utilizadas para setar e resetar, respectivamente, algum pino do
microcontrolador, nesse caso, o pino b0 (da porta B).
As outras duas linhas restantes so as linhas com a instruo delay_ms(tempo).
Esta tambm uma funo interna do compilador e utilizada para gerar um atraso de
X milissegundos. O valor X o parmetro dessa funo, no caso, X igual ao contedo
da varivel tempo, que foi previamente carregada com o valor 100. Logo, o atraso
gerado ser de 100ms.
Maiores detalhes sobre o funcionamento das funes internas do compilador
podem ser vistas no manual do usurio do compilador PIC C (CCS).


4.2 Palavras reservadas na Linguagem C

Toda linguagem de programao possui um conjunto de palavras ou comandos
para os quais j existe interpretao interna prvia. Tais palavras no podem ser
utilizadas para outras finalidades que no as definidas pela linguagem.
A linguagem C ANSI estipula as seguintes palavras reservadas:

auto break case char const
continue default do double else
enum extern float for goto
if int long register static
return short signed sizeof
struct switch typedef union
void volatile while unsigned


4.3 Identificadores

Identificadores so nomes dados pelo programador a variveis, funes e outros
elementos da linguagem C. No permitido utilizar palavras reservadas como
identificadores.
Um identificador pode ser composto de caracteres numricos e alfanumricos,
alm do caractere sublinhado _. Alm disso, um identificador somente pode ser
iniciado por uma letra ou sublinhado, nunca por um nmero, como nos exemplos:

varivel
variavel1
_teste
_teste1
_13_abc
abc_def
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
31
4.4 Variveis e tipos de dados

Variveis e constantes so os elementos bsicos que um programa manipula.
Uma varivel um espao reservado na memria do microcontrolador para armazenar
um tipo de dado determinado. Variveis devem receber nomes para poderem ser
referenciadas e modificadas quando necessrio. Muitas linguagens de programao
exigem que os programas contenham declaraes que especifiquem de que tipo so as
variveis que ele utilizar e s vezes um valor inicial. Tipos podem ser, por exemplo:
inteiros, reais, caracteres, etc. As expresses combinam variveis e constantes para
calcular novos valores.
Os dados podem assumir cinco tipos bsicos em C que so:

Tipo Tamanho em bits Intervalo
char 8 0 a 255
int 8 0 a 255
float 32 3.4*10
-38
a 3.4*10
38

void 0 Nenhum valor

char: (Caractere) O valor armazenado um caractere (letras dgitos e smbolos
especiais). Caracteres geralmente so armazenados em cdigos (usualmente o
cdigo ASCII).
int: Nmero inteiro o tipo padro e o seu tamanho normalmente depende da mquina
em que o programa est rodando. No caso do PIC16F877, seu tamanho de 8 bits.
float: Nmero em ponto flutuante de preciso simples. So conhecidos normalmente
como nmeros reais.
void: Este tipo serve para indicar que um resultado no tem um tipo definido. Uma das
aplicaes deste tipo em C criar um tipo vazio que pode posteriormente ser
modificado para um dos tipos anteriores.

O intervalo especifica qual a faixa de valores que podem ser representados por
uma varivel daquele tipo.
Modificadores podem ser aplicados a estes tipos. Estes modificadores so
palavras que alteram o tamanho do intervalo de valores que o tipo pode representar. Por
exemplo, um modificador permite que possam ser armazenados nmeros inteiros
maiores. Outro modificador obriga que s nmeros sem sinal possam ser armazenados
pela varivel. Deste modo no necessrio guardar o bit de sinal do nmero e somente
nmeros positivos so armazenados. O resultado prtico que o conjunto praticamente
dobra de tamanho. A Tabela abaixo mostra todos os tipos bsicos definidos no
compilador CCS

Tipo Tamanho em bits Intervalo
short int, int1, boolean 1 0 ou 1
char 8 0 a 255
signed char 8 -128 a 127
unsigned char 8 0 a 255
int, int8, byte 8 0 a 255
signed int, signed byte 8 -128 a 127
unsigned int, unsigned 8 0 a 255
long int, int16 16 0 a 65535
signed long int 16 -32768 a 32767
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
32
unsigned long int 16 0 a 65535
int32 32 0 a 4294967295
signed int32 32 -2147483648 a
unsigned int32 32 0 a 4294967295
float 32 3.4*10
-38
a 3.4*10
38



4.4 Declarao de variveis

Para serem usadas, as variveis precisam ser declaradas de modo que o
compilador possa reservar espao na memria para o valor a ser armazenado. Declarar
uma varivel nada mais do que informar ao compilador o nome dessa varivel, atravs
de um identificador e o seu tipo, conforme a tabela anterior.
A forma geral de uma declarao :

tipo lista_de_variaveis ;

Exemplos:

int i;
unsigned int a, b, c;
unsigned long int dia, mes, ano;
float salario;

Outro aspecto importante da declarao de variveis o local onde elas so
declaradas. A importncia do local onde a varivel declarada relaciona-se
acessibilidade ou no dessa varivel por outras partes do programa. Basicamente,
podemos declarar as variveis em dois pontos distintos do programa, a saber:

No corpo principal do programa, (fora de qualquer funo, inclusive da funo
main() . Variveis declaradas dessa forma so chamadas de variveis globais,
porque podem ser acessadas de qualquer ponto do programa;

Dentro de uma funo. As variveis declaradas dentro de um funo somente
podem ser acessadas de dentro da funo em que foram declaradas. Variveis
declaradas dessa forma so chamadas de variveis locais. Isto significa que uma
varivel local somente existe enquanto a funo est sendo executada.

Em seguida, temos um exemplo de um programa com variveis locais e globais.












// terceiro exemplo (variveis locais e globais)

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

int var_global; //declarao de varivel global (fora das funes)

main()
{
int tempo, var_local;
var_global=3;
var_local=5;
}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
33
O programa, apesar de no produzir nenhum efeito sobre os pinos do
microcontrolador, ilustra a forma de declarao de uma varivel global e local.
Abaixo da diretiva #use delay temos a declarao de uma varivel do tipo
inteiro cujo nome atribudo foi var_global. Essa uma varivel do tipo global, pois
est fora de qualquer funo.
Dentro da funo main( ) temos a declarao de duas variveis do tipo inteiras,
cujos nomes so tempo e var_local. Essas variveis so locais, pois foram declaradas
dentro do corpo da funo main( ). As variveis locais devem sempre ser declaradas
no incio de cada funo, antes do chamado a qualquer comando.
No final da funo main( ) as variveis local e global so carregadas pela
atribuio do valor 3 varivel global e do valor 5 varivel local.


4.5 Operadores

Operadores so elementos da linguagem que realizam aes sobre variveis.
Podemos classificar os operadores da linguagem C nas categorias principais que seguem
abaixo:

Operador de atribuio (igualdade): comum maioria das linguagens, este operador
(=) faz a varivel da esquerda assumir o valor da varivel, constante ou expresso da
direita. Exemplo:

var = var + 2;

Portanto, o contedo de var aumentado de 2.

Operadores aritmticos: realizam operaes aritmticas sobre os valores das variveis,
constantes ou expresses associadas.

Operador Descrio
* Multiplicao
/ Diviso
% Resto
+ Adio
- Subtrao

Exemplo:

var = 10 % 3; (o valor de var ser 1).

Operadores relacionais

Eles avaliam o relacionamento entre duas expresses e do o resultado 1 se
verdadeiro ou 0 se falso.
Operador Descrio
< Menor que
<= Menor ou igual
> Maior que
>= Maior ou igual
== Igual
!= Diferente
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
34

Exemplo:

var = 2;
if( var>2 )
var = 3;

Ou seja, o valor de var continua 2.
Um lapso comum confundir o operador de comparao (= =) com o operador
de igualdade (=). Exemplo:

var = 1;
if( var=2 )
var = 3;

E o valor de var ser 3, o que certamente no era esperado. Isso ocorre
porque var=2 atribui 2 a var e, desde que foi executado, a expresso retornar um valor
verdadeiro para a declarao if, permitindo a execuo da linha seguinte. Portanto, o
correto seria

if( var==2 )

Deve ser lembrado que, mesmo sem operadores, a linguagem C considera
verdadeiro qualquer valor no nulo. Por exemplo, aps a execuo das linhas

var = 2;
if( -50 )
var = 3;

o valor de var ser 3.


Operadores de incremento e decremento

So dois operadores bastante teis para simplificar expresses:

++ (incremento de 1)
-- (decremento de 1)

Podem ser colocados antes ou depois da varivel a modificar. Se inseridos antes,
modificam o valor antes de a expresso ser usada e, se inseridos depois, modificam
depois do uso. Alguns exemplos:

x = 2;
var = ++x;

No caso acima, o valor de var ser 3 e o de x ser 3.



Operadores de bits

Manipulam bits em valores inteiros. Nos exemplos a seguir, so considerados
dados de 8 bits de valores inteiros e sem sinal.

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
35

~ (complemento): Atuando em apenas um valor, muda os bits de valor 1 para 0 e vice-
versa. Exemplo: se a varivel var tem o valor 170 (10101010), aps ~var, ela ter 85
(01010101).

<< (deslocamento esquerda): Desloca, para a esquerda, os bits do operando esquerdo
no valor dado pelo operando direito. Equivale multiplicao pela potncia de 2 dada
por este ltimo. Exemplo: se a varivel var tem o valor 3 (00000011), aps var << 2, ela
ser 12 (00001100).

>> (deslocamento direita): Desloca, para a direita, os bits do operando esquerdo no
valor dado pelo operando direito. Equivale diviso pela potncia de 2 dada por este
ltimo. Exemplo: se a varivel var tem o valor 12 (00001100), aps var >> 2, ter 3
(00000011).

& (E): Faz o valor do bit igual a 1 se ambos os bits correspondentes nos operandos so
1 e 0 nos demais casos. Exemplo: se a varivel var tem o valor 12 (00001100) e fazendo
a operao com 6 (00000110), o resultado, var & 6, ser 4 (00000100).

^ (OU exclusivo): Faz o valor do bit igual a 1 se apenas um dos bits correspondentes nos
operandos 1 e 0 nos demais casos. Exemplo: se a varivel var tem o valor 12
(00001100) e fazendo a operao com 6 (00000110), o resultado, var ^ 6, ser 10
(00001010).

| (OU inclusivo): Faz o valor do bit igual a 1 se um ou ambos os bits correspondentes
nos operandos 1 e 0 nos demais casos. Exemplo: se a varivel var tem o valor 12
(00001100) e fazendo a operao com 6 (00000110), o resultado, var | 6, ser 14
(00001110).

Operadores lgicos

Usados normalmente com expresses booleanas, isto , expresses que retornam
verdadeiro ou falso (1 ou 0), para fins de testes em declaraes condicionais.


&& (E lgico): Retorna verdadeiro se ambos os operandos so verdadeiros e falso nos
demais casos. Exemplo:

if( a>3 && b<4).

|| (OU lgico): Retorna verdadeiro se um ou ambos os operandos so verdadeiros e
falso se ambos so falsos. Exemplo:

if( a>3 || b<4).


! (NO lgico): Usado com apenas um operando. Retorna verdadeiro se ele falso e
vice-versa. Exemplo:

if( !var ). Notar que essa expresso equivalente a if( var = =0 ).


Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
36
4.6 Declaraes de controle

As declaraes ou comandos de controle so uma parte muito importante de uma
linguagem de programao. Podemos classificar as declaraes de controle em duas
categorias bsicas:

1. Declaraes de teste condicional: so utilizadas para testar determinadas
condies/variveis e executar um cdigo para cada caso. A linguagem C dispe de dois
tipos de declaraes condicionais: o comando if-else e o comando switch;

2. Declaraes de estrutura de repetio: so utilizadas para provocar a execuo de um
bloco de comandos enquanto uma determinada condio for verdadeira. Em C
dispomos de trs declaraes de repetio: for, while e do-while.

4.7 O lao While

O comando while um comando de repetio. Ele possui a seguinte forma
geral:

while(condio)
{
Comando1;
Comando2;
...
}

A filosofia de funcionamento do comando while : primeiramente a condio
avaliada, caso seja verdadeira, ento o comando ou o bloco de comandos associado
executado e a condio novamente avaliada, reiniciando o lao. Caso a condio seja
falsa, o comando ou o bloco de comandos no executado e o programa tem sequncia
a partir da declarao seguinte ao bloco while.
A condio testada pelo comando while pode ser qualquer expresso da
linguagem C que possa ser avaliada como verdadeira ou falsa.
Podemos alterar o programa visto no incio do captulo a fim de fazer com que o
LED fique piscando indefinidamente. Para isso, basta introduzir os comandos que esto
dentro da funo main( ) em um lao do tipo while. Para que o lao seja
indefinidamente repetido, o teste da condio deve resultar sempre num valor
verdadeiro. Assim, o programa fica como segue abaixo:













// quarto exemplo

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
while(true) //lao de repetio
{
output_high(pin_b0); //seta o pino rb0
delay_ms(500); //aguarda 500ms
output_low(pin_b0); //reseta o pino rb0
delay_ms(500); //aguarda 500ms
}
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
37
A palavra true usada entre os parnteses do lao while garante que a condio
sempre verdadeira, uma vez que a palavra true, em ingls, significa verdadeiro. A
palavra true definida como tendo o valor 1 no arquivo de cabealho .h do
dispositivo usado. Assim, os comandos dentro do lao while sero sempre executados
na ordem em que aparecem.
Imaginemos agora que no desejamos mais que o LED fique piscando
indefinidamente, mas gostaramos que ele piscasse apenas uma quantidade de vezes
definida, digamos, dez vezes, e em seguida ele deve permanecer aceso. O programa que
executa esta funo mostrado abaixo, e uma explicao dada em seguida.






















Na linha:

int contador;

temos uma declarao de varivel. Este comando determina que o compilador crie uma
varivel do tipo inteiro int chamada contador. Esta operao ir na realidade reservar
uma posio na memria RAM do PIC para armazenar valores relativos a essa varivel.
Durante a execuo do programa, esse valor pode ser alterado pelo programa, da essa
posio ser chamada de varivel. O tipo inteiro int especifica um tipo de dado de 8 bits
com valores compreendidos entre 0 e 255 decimal.
Em seguida temos a linha:

contador=0;

que se constitui numa operao de atribuio. As atribuies em C so executadas pelo
operador de igualdade =. Desta forma, essa linha far com que o compilador gere uma
sequncia de instrues para fazer com que o valor zero decimal seja armazenado na
posio de memria do PIC nomeada como contador.
No lao while, a condio agora que a varivel contador seja menor que dez.
Isso verdadeiro, j que a varivel contador possui o valor zero. Assim, o bloco de
// Quinto exemplo

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{

int contador; //definio da varivel contador
contador=0; //inicializao da varivel com zero

while(contador<10) //lao de repetio
{
output_high(pin_b0); //seta o pino rb0
delay_ms(500); //aguarda 500ms
output_low(pin_b0); //reseta o pino rb0
delay_ms(500); //aguarda 500ms
contador=contador+1;
}

output_high(pin_b0); //seta o pino rb0
}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
38
comandos dentro das chaves executado, fazendo com que o LED acenda, espere
500ms, apague, espere mais 500ms e, depois de feito isso, temos a linha:

contador=contador+1;

que uma operao de atribuio, fazendo com que a varivel contador seja modificada
para o valor atual do contador mais uma unidade, ou seja, o contador agora passa a ter o
valor de 1, j que antes possua o valor zero.
Aps essa instruo, a condio do lao while mais uma vez testada. Nesse
caso, o contador possui o valor 1, e menor do que 10, fazendo com que o teste da
condio seja verdadeiro (contador<10). Ento, mais uma vez o bloco dentro das chaves
executado, fazendo o LED acender e piscar mais uma vez. No final, a varivel
contador novamente incrementada, passando a ter o valor 2, j que deve assumir o
valor atual mais uma unidade. O teste da condio do lao while feito mais uma vez,
resultado em verdadeiro, j que 2<10, e o processo se repete at que a varivel contador
assuma o valor 9. Quando a varivel contador assume o valor 10, o teste da condio
while no mais verdadeiro, ou seja, 10 no menor do que 10. Com isso, o bloco de
comandos dentro do lao while no mais executado, e o programa passa direto para o
comando que vem em seguida, que no caso o comando output_high(pin_b0), que
seta o pino rb0, fazendo com que o LED se acenda e fique permanentemente aceso. O
LED ento piscou dez vezes e em seguida ficou permanentemente aceso, como era o
nosso interesse.


4.4 O lao For

O lao for uma das mais comuns estruturas de repetio, sendo a verso em C
considerada uma das mais poderosas e flexveis dentre todas as linguagens de
programao.
O formato geral do lao for :

for(inicializao; condio; atualizao)
{
Comando1;
Comando2;
...
}

Cada uma das trs sees do comando for possui uma funo distinta, conforme
em seguida:

1. Inicializao: esta seo conter uma expresso vlida utilizada normalmente para
inicializao da varivel de controle do lao for;
2. Condio: esta seo pode conter a condio a ser avaliada para decidir pela
continuidade ou no do lao de repetio, semelhante ao lao while;
3. Atualizao: esta seo pode conter uma ou mais declaraes para atualizao da
varivel de controle do lao.

O funcionamento bsico do comando o seguinte: primeiramente a seo de
inicializao do comando executada, em seguida, a condio de teste avaliada e caso
seja verdadeira executado o comando ou bloco de comandos compreendido entre as
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
39
chaves. Em seguida a seo de atualizao executada e o lao repetido, voltando a
avaliar a condio, no havendo mais inicializao. Ou seja, a inicializao ocorre
apenas uma vez, no incio da lao for.
O programa anterior poderia ser escrito, sem alterar seu funcionamento,
conforme mostrado abaixo:
























4.5 O Exemplo do LED Andante

Consideremos que temos 8 LEDS conectados a uma das portas do PIC, digamos
a porta B. Ao acender o primeiro LED e fazendo com que o LED aceso se desloque do
primeiro ao ltimo, ou seja, se o primeiro est aceso, em seguida apaga-se esse LED
enquanto acende-se o segundo, e assim sucessivamente at o oitavo LED, teremos um
efeito conhecido como LED andante. Em outras palavras, estaremos fazendo o
deslocamento do LED. Ao chegar ao oitavo LED, podemos fazer ainda com que este se
desloque no sentido reverso, ou seja, do oitavo para o primeiro LED.
A seguir temos uma implementao em C para este problema. Ambas as
implementaes utilizam os comandos for e while. As implementaes poderiam ter
sido feitos apenas usando o comando for, ou apenas o comando while. critrio do
programador escolher qual a opo mais simples, ou a mais clara no que diz respeito ao
entendimento do programa.
Observe cada um dos cdigos e identifique as semelhanas e diferenas.
Verifique como feito o teste no lao for. Verifique ainda qual o artifcio usado para
proporcionar o deslocamento do LED nos dois casos.
Em ambos os programas ocorre o uso da funo interna output_B(contador).
Essa funo envia para os pinos da porta B uma palavra digital de 8 bits correspondente
ao valor do argumento, ou seja, o valor da varivel contador. Mais informaes sobre
as portas de entrada/sada do PIC sero vistas no prximo captulo.
// Quinto exemplo modificado

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{

int contador; //definio da varivel contador

for(contador=0; contador<10; contador=contador+1)
{
output_high(pin_b0); //seta o pino rb0
delay_ms(500); //aguarda 500ms
output_low(pin_b0); //reseta o pino rb0
delay_ms(500); //aguarda 500ms
}

output_high(pin_b0); //seta o pino rb0
}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
40


















































// LED andante primeira implementao

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
int contador; //definio da varivel contador

while(true)
{
for(contador=1; contador!=0b10000000; contador=contador*2)
{
output_B(contador); //atualiza a porta B
delay_ms(100); //aguarda 100ms
}

while(contador>1)
{
output_B(contador); //atualiza a porta B
delay_ms(100); //aguarda 100ms
contador=contador/2;
}
}
}

// LED andante segunda implementao

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
int contador; //definio da varivel contador
int tempo=100;

while(true)
{
for(contador=1; contador!=128; contador=contador<<1)
{
output_B(contador); //atualiza a porta B
delay_ms(tempo); //aguarda 100ms
}

while(contador>1)
{
output_B(contador); //atualiza a porta B
delay_ms(tempo); //aguarda 100ms
contador=contador>>1;
}
}
}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
41


Portas de
Entrada/Sada

Embora o fato dos microcontroladores serem produtos de alta tecnologia, eles acabam
ficando sem uso prtico se no forem conectados a outros dispositivos adicionais. O
aparecimento de tenso nos pinos do microcontrolador no til se no for para ligar/desligar
dispositivos tais como displays, rels, LEDs, etc.
Uma das caractersticas mais importantes dos microcontroladores o nmero de
entradas e sadas que permitem ao projetista conectar dispositivos de entrada e sada. O
PIC16F877 tem 35 pinos de entrada e sada de propsito geral, que mais que suficiente para
vrias aplicaes.

5.1 Introduo

Uma das mais importantes caractersticas dos microcontroladores o nmero de
pinos de entrada/sada, ou, pinos de I/O (Input/Output). O PIC 16F877 possui 33 pinos
de I/O que podem ser configurados para funcionar como entradas e/ou sadas.
De modo a fazer com que o funcionamento dos pinos de I/O se adque
arquitetura de 8 bits do microcontrolador, os 33 pnos de I/O so agrupados em
estruturas fsicas denominadas PORT.
O PIC 16F877 possui 5 portas denominadas A, B, C, D e E. Idealmente, cada
porta deveria possuir 8 pinos de I/O. Entretanto, devido a algumas limitaes fsicas de
hardware, algumas portas so incompletas, possuindo apenas 6 ou mesmo 3 pinos de
I/O. Na tabela abaixo encontramos o nmero de pinos de I/O disponveis em cada porta
do PIC 16F877.

PORT Nmero de pinos de I/O
A 6
B 8
C 8
D 8
E 3

Por razes prticas, a maioria dos pinos de I/O tem vrias funes. Se um pino
usado para qualquer uma das funes, ele no pode ser usado para outra. Na verdade, a
funo de um pino de I/O pode ser alterada enquanto o microcontrolador estiver em
funcionamento, mas o hardware externo ao microcontrolador deve estar preparado para
se adequar mudana da nova funcionalidade do pino de I/O.
Captulo
5
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
42
5.2 Componentes adicionais

Esta seo cobre a maioria dos componentes mais utilizados na prtica que se
conectam ao microcontrolador, tais como chaves, botes, transistores, LEDs, rels, etc.
Chaves e botes de pulso (push-buttons) so provavelmente os mais simples
dispositivos que possibilitam a deteco do aparecimento de tenso em um pino do
microcontrolador. Entretanto, isto no to simples quanto parece. A razo para isso o
que se conhece por bounce, ou oscilao, ou ainda, rudo eltrico.




A oscilao nos contatos de uma chave mecnica um problema comum que
deve ser tratado pelo projetista de circuitos com microcontroladores.
Esta oscilao causa problemas em alguns circuitos analgicos e digitais, como
os microcontroladores, que respondem rapidamente s variaes de tenso em seus
pinos.
Na figura anterior, por exemplo, temos a representao da tenso em um pino de
I/O do PIC, no qual foi conectada uma chave conforme mostra a figura abaixo. Quando
a chave est em repouso, ela est fechada e a tenso no pino de I/O de 5V. Ao se
pressionar a chave, a tenso no cai para zero volt e permanece l. Em vez disso, ela cai
e volta a subir enquanto o chaveamento do contato da chave no se estabilizar. Isso
ocorre rapidamente, e quase imperceptvel. Mas no para o microcontrolador, que
percebe todas essas variaes de tenso. Assim, por exemplo, ao usar o
microcontrolador para contar a quantidade de vezes que uma chave pressionada,
podem ocorrer erros devido a tais oscilaes.
Este problema pode ser facilmente resolvido simplesmente conectando um
circuito RC simples para suprimir essas rpidas mudanas de tenso. Uma vez que o
perodo de durao das oscilaes no definido, os valores dos componentes no so
precisamente determinados. Em muitos casos, recomendado usar os valores mostrados
na figura abaixo.



Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
43
Em adio a esta soluo por hardware, h tambm uma soluo simples por
software. Quando o programa testa o estado lgico (nvel de tenso) de um pino de
entrada e detecta uma mudana, o teste deve ser feito mais uma vez depois de um certo
tempo. Se o programa confirmar a mudana, significa que o boto, ou a chave mudou
sua posio, e ento o programa executa a tarefa associada.


5.3 O comando IF e o comando switch na linguagem C

De uma maneira geral, o comando if (ou se em portugus) utilizado para
executar um comando ou bloco de comandos no caso de uma determinada condio ser
avaliada como verdadeira. Opcionalmente, tambm possvel executar outro comando
ou bloco de comandos no caso da condio ser avaliada como falsa.
A forma geral do comando if

if(condio) comandoA; else comando B;

Ele pode ser um comando ou declarao qualquer da linguagem C, ou um bloco
de comandos na seguinte forma:

if(condio)
{
comandoA1;
comandoA1;
...
} else
{
comandoB1;
comandoB2;
...
}

Em ambos os casos, a clusula else no obrigatria para o funcionamento do
comando.
O princpio de funcionamento do comando muito simples: se a condio for
verdadeira, ser executado apenas o comandoA (ou o bloco de comandos A). Caso a
condio seja avaliada como falsa, ento ser executado apenas o comandoB (ou o
bloco de comandos B). Um detalhe muito importante a ser observado que nunca, no
mesmo teste, os dois comandos ou blocos de comandos sero executados, apenas um ou
outro.
Em seguida, observe um exemplo de programa que faz a leitura de teclas e usa o
comando if para testar qual das teclas foi pressionada.
Nesse programa, o comando input(pin_d0), l o valor de tenso presente no
pino d0 (pino 0 da porta D). Se o pino tem 5V, ento a leitura do pino igual a 1, se a
tenso no pino for de 0V, ento a leitura no pino igual a 0. A exclamao que vem
antes desse comando , conforme foi visto no captulo anterior, um operador lgico de
negao. Ele inverte o valor da leitura de tenso no pino. Assim, se o pino tem 5V, ele
l como se existisse 0V no pino, e vice versa.
Considerando ainda que os botes estejam ligados no PIC conforme a figura
anterior, ento, nos pinos d0, d1 e d2 h 5V de tenso. Porm a leitura dos pinos ser
feita como 0V, devido ao operador de negao citado anteriormente. Assim, nenhum
comando dentro dos comandos if ser executado. Entretanto, ao se pressionar um dos
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
44
botes, a leitura feita como 1, e a o comando dentro do if correspondente ser
executado, alterando o valor da varivel value.
























Aps a alterao da varivel value, seu contedo enviado porta B atravs do
comando output_B(value), fazendo com que os pinos da porta B sejam ativados de
acordo com o contedo dessa varivel. Por exemplo, caso o boto conectado ao pino d1
seja pressionado, a varivel value assume o valor 0b00001111, e os pinos da porta B,
em seguida, so acionados conforme este valor, ou seja, os quatro primeiros pinos so
setados e os quatro ltimos pinos so resetados. Esse valor permanece sendo exibido na
porta B por um perodo de 1 segundo, e em seguida a porta B totalmente resetada.
Se nenhum boto pressionado, a porta B permanece resetada.
O programa ento permanece dentro do loop infinito do lao while, sempre
lendo o estado dos pinos dos botesna porta D e atualizando a porta B com o valor
correspondente do boto pressionado, ou resetando a porta B caso nenhum boto seja
pressionado.
Observe que estamos usando 3 pinos da porta D como pinos de entrada, uma vez
que estamos lendo o estado desses pinos. Ao mesmo tempo, estamos usando os 8 pinos
da porta B como sada, uma vez que neles estamos escrevendo.
Em princpio, qualquer pino de qualquer porta pode ser usado como entrada ou
sada. A escolha feita automaticamente pelo software. Ao usarmos instrues do tipo
input( ), o pino ou a porta correspondente configurado como entrada. Ao usarmos
instrues do tipo output( ), o pino ou a porta correspondente configurada como
sada.
Ao conectarmos LEDs na porta B, podemos observar o valor da varivel value
sendo escrito na porta B ao pressionarmos algum dos botes.


// Leitura de teclas

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
int value=0; //definio da varivel value

while(true)
{
if(!input(pin_d0))
value=0b11110000;
if(!input(pin_d1))
value=0b00001111;
if(!input(pin_d2))
value=0b10101010;

output_B(value);
delay_ms(1000);
output_B(0);
}
}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
45
Poderamos implementar a mesma funo do programa anterior com o uso do
comando switch.
Em alguns casos, como na comparao de uma determinada varivel a diversos
valores diferentes, o comando if pode torna-se um pouco confuso, ou pouco eficiente.
A declarao switch permite a realizao de comparaes sucessivas, de uma
forma muito mais elegante, clara e eficiente. Vejamos ento o formato geral da
declarao switch:

switch(varivel)
{
case constante1:
ComandoA;
...
Break;
case constante2:
ComandoB;
...
Break;
case constante3:
ComandoC;
...
Break;
default:
ComandoZ;
...
Break;
}

Observe que o valor da varivel testado contra as constantes especificadas pela
clusula case. Caso a varivel e a constante possuam o mesmo valor, ento os
comandos seguintes quela clusula case sero executados. Caso o valor no encontre
correspondentes nas constantes especificadas pelas cases, ento os comandos
especificados pela clusula default so executados.
Repare que cada sequncia de comandos da clusula case encerrada por uma
clusula break. Caso esta clusula seja omitida, ento todos os comandos subseqentes
ao case especificado sero executados, at que seja encontrada uma outra clusula
break, ou atingindo o final do bloco switch.

















// Leitura de teclas segunda implementao

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
int value=0; //definio da varivel value

while(true)
{
switch(input_D())
{
Case 0b11111110: value=0b11110000; break;
Case 0b11111101: value=0b00001111; break;
Case 0b11111011: value=0b10101010; break;
}

output_B(value); delay_ms(1000); output_B(0);
}
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
46
O comando input_b(), l o valor de tenso presente nos pinos da porta D. O
resultado dessa leitura um byte que explicita o estado lgico dos pinos da porta D. Se
nenhuma chave est pressionada, ento a leitura dos pinos da porta D 0b11111111,
onde todos os pinos esto em 5V. Se o boto do pino d0 for pressionado, ento o valor
lido 0b11111110.
O comando switch testa ento a possibilidade das chaves em d0, d1 e d2 estarem
pressionadas, e executa o programa conforme mostrado anteriormente.


5.4 Rels

Um rel um interruptor eltrico que abre e fecha sob o controle de um outro
circuito eltrico. , portanto, ligado aos pinos de sada do microcontrolador e usado para
ativar/desativar dispositivos de alta potncia, como motores, transformadores,
aquecedores, lmpadas, etc. Estes dispositivos so quase sempre colocados longe de
componentes sensveis. Existem vrios tipos de rels, mas todos eles funcionam da
mesma maneira. Quando a corrente flui atravs da bobina, o rel operado por um
eletrom para abrir ou fechar um ou mais conjuntos de contatos. Similarmente aos
acopladores pticos, no h nenhuma conexo galvnica (contato eltrico) entre os
circuitos de entrada e sada.
Rels normalmente demandam uma maior tenso e corrente mais alta para
iniciar a operao, mas h tambm aqueles em miniatura que podem ser ativados por
baixa corrente obtidas diretamente de um pino do microcontrolador.




A figura a seguir mostra a soluo mais comumente empregada para se conectar
um rel a pino do microcontrolador.

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
47
Uma vez que as correntes e tenses fornecidas diretamente nos pinos de sada de
um microcontrolador so normalmente bem pequenas, isso poderia ser insuficiente para
ativar diretamente o rel. Assim, o transistor T1 utilizado como driver para ativar o
rel.
A fim de prevenir o aparecimento de alta tenso, auto-induo, causada por uma
interrupo brusca do fluxo de corrente atravs da bobina, um diodo inversamente
polarizado, chamado diodo de roda livre, ligado em paralelo com a bobina. O
objetivo deste diodo "cortar" o pico de tenso.
Como exerccio de aplicao, deixado o seguinte desafio:

Implementar o hardware e desenvolver o software para uma fechadura eletrnica
codificada. A estrutura de hardware e software deve obedecer aos seguintes critrios:

8 chaves devem ser conectadas porta D.
1 rel deve ser conectado no pino b1.
1 LED vermelho deve ser conectado nopino b2.
As chaves sero usadas como interface com o usurio. por elas que a senha
deve ser inserida no circuito.
Escolha uma senha de 4 dgitos apropriada. Se a senha digitada nas chaves for
a correta, ento o rel deve ser ativado para liberar a fechadura. Se a senha
estiver errada, ento o led vermelho deve acender, indicando ao usurio que a
senha fornecida est incorreta. Aps 3 segundos, o led se apaga e o usurio
pode entrar com uma nova tentativa de acesso.

Outras implementaes podem ser feitas a seu critrio. Por exemplo, se aps 3
tentativas de acesso o usurio no obtiver sucesso, a fechadura deve ser bloqueada
durante algum tempo, para evitar novas tentivas de acesso. Alm disso, aps uma
tentativa falha, alm do LED vermelho ser ativado, um pequeno beep pode ser emitido
atravs de um buzzer conectado em algum outro pino de I/O.
Como foi dito anteriormente, os pinos de I/O do PIC16F877 possui diversas
funes, que vo muito alm de simples entradas e sadas. Por exemplo, existem pinos
que fornecem sinais PWM para o controle de velocidade de motores, intensidade
luminosa de lmpadas incandescentes. Existem outros pinos responsveis por fazer a
comunicao do PIC com outros PICs, ou ainda do PIC com um microcomputador.
Existem tambm pinos que so responsveis por tratar sinais analgicos conectados ao
microcontrolador, entre outros.
Essas funcionalidades especiais sero avaliadas nos prximos captulos.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
48


LCD e Displays de 7
Segmentos

Um display de sete segmentos um tipo de display (mostrador) barato usado como
alternativa a displays de matriz de pontos, mais complexos e dispendiosos. Displays de sete
segmentos so comumente usados em eletrnica como forma de exibir uma informao
numrica sobre as operaes internas de um dispositivo. Uma evoluo dos displays de 7
segmentos so os displays alfanumricos, que podem exibir nmeros e letras. Atualmente, os
displays de cristal lquido alfa-numrico so a melhor opo como interface de exibio de
sada.


6.1 Displays de 7 segmentos

Um display de sete segmentos, como seu nome indica, composto de sete
elementos (LEDs), os quais podem ser ligados ou desligados individualmente. Eles
podem ser combinados para produzir representaes simplificadas de algarismos
arbicos. Freqentemente, os sete segmentos so dispostos de forma oblqua ou itlica,
o que melhora a legibilidade.
Os sete segmentos so dispostos num retngulo com dois segmentos verticais em
cada lado e um segmento horizontal em cima e em baixo. Em acrscimo, o stimo
segmento bissecta o retngulo horizontalmente. Tambm existem displays de catorze
segmentos e de dezesseis segmentos (para exibio plena de caracteres alfanumricos;
todavia, estes tm sido substitudos em sua maioria por displays de matriz de pontos, ou
LCDs alfanumricos)
Para simplificar as conexes, os anodos, ou catodos, de todos os segmentos so
conectados a um terminal comum do display. Assim, dependendo de quais terminais
dos diodos so conectados em comum, temos displays de anodo comum e displays de
catodo comum.
Os segmentos de um display de sete segmentos so definidos pelas letras de A a
G, conforme indicado na figura 6.1, onde o ponto decimal opcional DP (um "oitavo
segmento") usado para a exibio de nmeros no-inteiros.
Captulo
6
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
49

Figura 6.1 - Display de 7 segmentos e sua representao.

Displays de sete segmentos podem usar LCD, matrizes de LEDs e outras
tcnicas de controle ou gerao de luz, tais como descarga de gs de catodos frios,
vcuo fluorescente, filamentos incandescentes, entre outros. Para totens de preos em
postos de combustvel e outros painis de grande porte, segmentos refletores de luz
eletromagneticamente acionveis ainda so comumente utilizados.
Um fato decepcionante que indica que o microcontrolador apenas um tipo
miniaturizado de computador, projetado para s entender a linguagem de zeros e uns,
expresso plenamente ao tentar exibir qualquer dgito. Ou seja, o microcontrolador no
sabe o que so unidades, dezenas ou centenas, nem tampouco conhece a aparncia dos
dez dgitos que estamos acostumados a usar no sistema arbico. A formao e exibio
dos caracteres so feitas acionando-se determinados segmentos e apagando-se outros.
Por esta razo, cada nmero a ser apresentado deve seguir alguns procedimentos:
Antes de tudo, um nmero de mltiplos dgitos deve ser dividido em unidades,
dezena, centenas, etc. Ento, cada um destes dgitos deve ser armazenado em bytes
especficos. Os dgitos obtm aparncia reconhecvel atravs da realizao de um
processo chamado "mascaramento". Em outras palavras, o formato binrio de cada
dgito substitudo por uma combinao diferente de bits. Por exemplo, o nmero de 8
bits (0b0000 1000) substitudo pelo nmero binrio 0b01111111, a fim de ativar todos
os LEDs, exibindo o dgito 8. O nico bit remanescente inativo aqui reservado para o
ponto decimal.
Se uma porta do microcontrolador conectado ao display de tal forma que o bit
0 ativa o segmento a, o bit 1 ativa o segmento b, e assim sucessivamente, ento a
tabela abaixo mostra a mscara para cada dgito, considerando que o display seja do tipo
catodo comum. Para displays do tipo anodo comum, todos os uns (1) da tabela devem
ser substitudos por zeros (0), e vice versa. O termo PD o ponto decimal.

Dgitos Decimais Segmentos do display
PD a b c d e f g
0 0 1 1 1 1 1 1 0
1 0 0 1 1 0 0 0 0
2 0 1 1 0 1 1 0 1
3 0 1 1 1 1 0 0 1
4 0 0 1 1 0 0 1 1
5 0 1 0 1 1 0 1 1
6 0 1 0 1 1 1 1 1
7 0 1 1 1 0 0 0 0
8 0 1 1 1 1 1 1 1
9 0 1 1 1 1 0 1 1

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
50
Um exemplo de aplicao mostrado na figura 6.2, onde o nmero 5, em
binrio, mascarado com o valor 0b01101101 e em seguida exibido no display de 7
segmentos.



Figura 6.2 Mascaramento e exibio do dgito 5 no display de sete segmentos.

Um circuito de controle para um display de sete segmentos mostrado na figura
abaixo. Os resistores de 470R limitam a corrente que circula pelos LEDs de cada
segmento do display.



Na pgina seguinte, temos um exemplo simples de decodificao do display de
sete segmentos.
O programa exibe, continuamente, os dgitos decimais de 0 a 9,
sequencialmente, espaados por um intervalo de 1 segundo, criando uma espcie de
contador.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
51





























Percebe-se que so necessrios 7 terminais do microcontrolador para fazer o
correto controle de cada display. Imagine ento a situao em que necessrio fazer o
controle de 4 displays. Seriam ento necessrios 28 terminais para fazer o controle.
Entretanto, existe uma tcnica de multiplexao de displays que consiste em usar os
mesmos 7 terminais para todos os displays, alm de usar terminais extras para
selecionar um dos displays por vez. Esta uma tcnica que se beneficia de uma
propriedade do olho humano, chamada persistncia luz, para criar uma iluso de tica.
Assim, se a seleo do display for suficientemente rpida, o efeito obtido como
se os 4 displays estivessem ligados ao mesmo tempo, embora apenas um esteja ativo.
Um circuito que executa tal tarefa mostrado na figura 6.3.
Aqui est uma explicao sobre o funcionamento deste circuito:

* Inicialmente, um byte representando as unidades enviado ao PORT2 o transistor T1
ativado ao mesmo tempo. Depois de um curto intervalo de tempo o transistor T1
desligado, um segundo byte, representando as dezenas, enviado ao PORT2 e o
transistor T2 ativado. Esse processo repetido ciclicamente em alta velocidade para
todos os dgitos e transistores correspondentes.




// Decodificao de display de 7 segmentos

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

main()
{
while(true)
{
output_B(0b00111111); //dgito 0
delay_ms(1000);
output_B(0b00000110); //dgito 1
delay_ms(1000);
output_B(0b01011011); //dgito 2
delay_ms(1000);
output_B(0b01001111); //dgito 3
delay_ms(1000);
output_B(0b01100110); //dgito 4
delay_ms(1000);
output_B(0b01101101); //dgito 5
delay_ms(1000);
output_B(0b01111101); //dgito 6
delay_ms(1000);
output_B(0b00000111); //dgito 7
delay_ms(1000);
output_B(0b01111111); //dgito 8
delay_ms(1000);
output_B(0b01101111); //dgito 9
delay_ms(1000);
}
}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
52


Figura 6.3 Multiplexao de quatro displays de sete segmentos.



6.2 Matrizes de dados

Uma matriz um conjunto de dados homogneos referenciado por um
identificador nico. Por dados homogneos entendem-se variveis ou dados do mesmo
tipo. Assim, uma matriz ser um conjunto de variveis ou dados do mesmo tipo e
referenciados por um nico identificador.
A linguagem C suporta a criao de matrizes unidimensionais at matrizes
multidimensionais.
No nosso cotidiano, estamos acostumados a trabalhar com diversos tipos de matrizes:
unidimensionais, como, por exemplo, listas (uma lista de nomes), bidimensionais (como
um tabuleiro de xadrez, ou uma planilha de dados) e as multidimensionais com trs ou
mais dimenses.
Para declarar uma matriz na linguagem C, utilizamos os colchetes [ ]. Uma
matriz declara da seguinte forma:

tipo_de_dado nome_da_matriz[tamanho];


tipo_de_dado um especificador do tipo de dado utilizado em cada um dos
elementos da matriz. Podemos criar matrizes com qualquer dos tipos de dados
disponveis em C.
nome_dd_matriz um identificador da matriz. Todas as referncias matriz
sero realizadas pelo uso deste identificador.
tamanho o nmero de elementos que pode ser armazenado na matriz.

Vejamos o exemplo em seguida:
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
53
int nota[40]; //define uma matriz de 40 nmeros inteiros
char nome[20]; //define uma matriz de 20 caracteres
long int outra[5]; //define uma matriz de 5 nmeros do tipo long int


Ao declarar uma varivel do tipo matriz, o compilador reserva espao na
memria RAM do microcontrolador para armazenas aquelas variveis ou dados.
Vejamos a representao grfica da matriz outra:

outra[0]
outra[1]
outra[2]
outra[3]
outra[4]

O primeiro elemento da matriz acessado pela declarao outra[0] e o ltimo
elemento pela declarao outra[4]. Em C, o primeiro elemento de uma matriz
sempre o de ndice zero.

Poderamos reescrever o programa anterior atravs do uso de matrizes. Vejamos
ento o programa reescrito.






























// Decodificao de display de 7 segmentos com uso de matrizes

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)

int const tabela[10]={0b00111111, //0 - 0
0b00000110, //1 - 1
0b01011011, //2 - 2
0b01001111, //3 3
0b01100110, //4 4
0b01101101, //5 5
0b01111101, //6 6
0b00000111, //7 7
0b01111111, //8 8
0b01101111 //9 9
};

main()
{
int value=0; //definio da varivel valor

while(true)
{
output_B(tabela[value]);
delay_ms(1000);
++value;
if(value>9)
value=0;
}
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
54
No corpo do programa, antes da funo main( ), temos uma declarao de uma
matriz de constantes.
Constantes so valores (numricos ou no) fixos e que no podem ser alterados
pelo programa durante a sua execuo. Uma constnate declarada precedida da palavra
reservada const. A diferena entre uma varivel e uma constante que nas variveis, o
contedo pode ser alterado durante a execuo do programa, enquanto que nas
constantes isso no ocorre. Outra diferena prtica que as variveis so armazenadas
na memria RAM e as constantes so armazenadas na memria de programa do
microcontrolador. Uma vez que a memria RAM de pequeno tamanho, o uso de
constantes ajuda o programador a economizar espao em memria.
A constante tabela do tipo int e possui 10 elementos, referenciados como
tabela[0] at tabela[9]. Alm da declarao da matriz, esse comando tambm faz a
inicializao dessa matriz, ou seja, define os valores armazenados em cada elemento da
matriz. Por exemplo, o elemento tabela[0] iniciado com o valor 0b00111111.
Ao analisarmos os 10 valores armazenadas na matriz tabela, podemos perceber
que se tratam das mscaras dos dez dgitos decimais para o display de sete segmentos.
Na funo main( ), inicialmente declarada uma varivel do tipo int chamada
value. Essa varivel inicializada com o valor 0.
No lao while, estamos escrevendo na porta B o contedo do elemento da tabela
referenciado pela varivel value. Ou seja, inicialmente, o comando
output_B(tabela[value]) escreve na porta B o valor tabela[0], que no caso a
mscara do dgito 0. Em seguida, espera-se um segundo, a varivel value
incrementada, assumindo o valor 1 e um teste if feito para verificar se a varivel value
maior que 9. Como a varivel value no maior que 9, o programa volta a escrever na
porta B o valor tabela[value], que agora tabela[1], ou seja, a mscara do dgito 1.
Isso se repete at que sejam escritos as 9 mscaras dos dgitos decimais na porta
B. Nesse instante, o teste if resulta em verdadeiro, pois aps o ltimo incremento da
varivel value ela assume o valor 10, fazendo com que o comando value=0 seja
executado, e ento todo o processo repetido.

* Como exerccio de aplicao, altere o programa anterior para que o display exiba
sequencialmente todos os dgitos hexadecimais.
* Altere tambm o programa anterior para que sejam exibidos sequencialmente, em
dois displays distintos, todos os dgitos hexadecimais, segundo o critrio: em um dos
displays, a exibio deve ser na ordem crescente. No outro display, a exibio deve ser
em ordem decrescente.


6.3 Displays de Cristal Lquido (LCD)

Este componente fabricado especificamente para ser usado com
microcontroladores, o que significa que no pode ser ativado por circuitos discretos
comuns. O modelo aqui descrito devido ao seu baixo preo e grande capacidade e o
mais utilizada na prtica. baseado no controlador de displays HD44780 (Hitachi), ou
equivalentes, e podem exibir mensagens em duas linhas com 16 caracteres cada. Ele
pode exibir todas as letras do alfabeto, letras gregas, sinais de pontuao, smbolos
matemticos, etc Tambm possvel exibir smbolos feitos pelo usurio. Outras
caractersticas teis incluem mudana automtica de mensagem (esquerda e direita),
diodo emissor de luz de fundo (backlight), etc.

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
55



Este LCD pode exibir duas linhas com 16 caracteres cada. Cada caractere
composto por 5x8 ou 5x11 pontos.




O contraste da tela depende da tenso de alimentao e se as mensagens so
exibidas em uma ou duas linhas. Por esta razo, variando a tenso de 0-VCC aplicada
ao pino identificado como VEE, variamos o contraste do display. Um trimpot
normalmente usado para este fim.
Alguns dos displays LCD tm embutido o backlight (LEDs de cor azul ou
verde). Quando usado durante a operao, um resistor limitador de corrente deve ser
conectado em srie a um dos pinos para a fonte de luz de fundo (semelhante ao dodos
LED). O circuito de controle do contraste e do backlight mostrado abaixo.



Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
56
Dependendo de quantas linhas so usadas para conectar um LCD com o
microcontrolador, existem os modos de 8 bits e o de 4-bits. O modo apropriado
selecionado no incio da operao no processo chamado de "inicializao". O modo de 8
bits usa as linhas D0-D7 para transferir dados para o LCD.
O objetivo principal do modo de 4 bits economizar pinos do microcontrolador.
Apenas os 4 bits superiores (D4-D7) so usados para a comunicao, enquanto os
outros podem ser deixados desligados. A inicializao permite que o LCD ligue e
interprete os bits recebidos corretamente.
O circuito completo de controle de um LCD no modo de 4 bits mostrado
abaixo.



Os demais terminais (RS, R/W e E) mostrados na figura acima so usados no
controle da comunicao com o LCD.
Para a utilizao do display necessrio usarmos funes especiais que fazem
todo o controle da comunicao com o display e permitem a escrita no LCD. Essas
funes especiais devem ser includas no programa atravs da diretiva #include,
conforme se pode ver no exemplo abaixo.














#include <16f877A.h>
#fuses HS
#use delay(clock=20M)

#include "LCD_BLIO.h"

main(){

ini_lcd_16x2(); //funo de inicializao do LCD

printf(exibe_lcd,"\f CURSO DE PIC \n PIC 16F877");
delay_ms(2000);
printf(exibe_lcd,"\f Escrita no LCD ");
while(true);
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
57
As funes referentes ao controle do LCD esto dentro do arquivo chamado
LCD_BLIO.h, e foram includas no programa com a diretiva #include.
A funo ini_lcd_16x2() deve sempre ser chamada ao usarmos LCDs, pois
esta inicia o LCD, preparando-o para receber textos do microcontrolador. Essa funo
pertence biblioteca de funes especiais contidas no arquivo LCD_BLIO.
Basicamente, ela faz com que o microcontrolador envie comandos de inicializao ao
LCD. A forma como esses comandos devem ser enviados pode ser verificada no manual
do display.
A funo printf(exibe_lcd,"\f CURSO DE PIC \n PIC 16F877A")
escreve no LCD o texto que est entre as aspas. A funo printf uma funo interna
do compilador. Essa no faz parte da biblioteca LCD_BLIO.h. Entretanto, essa funo
opera em conjunto com uma funo interna biblioteca LCD_BLIO.h (funo
exibe_lcd).
Existem alguns caracteres especiais que no so visveis no display, mas que
servem para controlar a escrita de textos no LCD. No exemplo anterior, os caracteres \f
e \n so caracteres especiais que no sero impressos no LCD. Tais caracteres so
conhecidos como cdigos de barra invertida Os cdigos mais comumente utilizados
esto mostrados abaixo:

Caractere especial Funo
\f Apaga o que est escrito no LCD
\n Pula para a prxima linha
\t Insere um espao de tabulao
\ Escreve o caractere



* Altere o programa acima para que o LCD exiba o seu nome no centro da primeira
linha, espere um segundo, e em seguida apague seu nome e reescreva-o no centro da
segunda linha, permanecendo executando estas aes em um loop infinito.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
58


Conversores
Analgico-Digitais

Alm de um grande nmero de linhas de entrada/sada usado para comunicao com
perifricos, o PIC16F877 contm 8 entradas analgicas. Eles permitem que o microcontrolador
reconhea no apenas se um pino est em lgica zero ou um (0 ou 5 V), mas tambm
permitem medir com preciso a sua tenso e convert-la em valor numrico, ou seja, o formato
digital.


7.1 Conversores Analgico/Digitais

O conversor analgico-digital (frequentemente abreviado por conversor A/D ou
ADC) um dispositivo eletrnico capaz de gerar uma representao digital a partir de
uma grandeza analgica, normalmente um sinal representado por um nvel de tenso ou
intensidade de corrente eltrica.
Os ADCs so muito teis na interface entre dispositivos digitais
(microprocessadores, microcontroladores, DSPs, etc) e dispositivos analgicos e so
utilizados em aplicaes como leitura de sensores, digitalizao de udio e vdeo, etc.
Por exemplo, um conversor A/D de 10 bits, preparado para um sinal de entrada
analgica de tenso varivel de 0V a 5V pode assumir os valores binrios de 0
(0000000000) a 1023 (1111111111), ou seja, capaz de capturar 1024 nveis discretos
de um determinado sinal. Se o sinal de entrada do suposto conversor A/D estiver em
2,5V, por exemplo, o valor binrio gerado ser 512.
O mdulo conversor analgico digital do PIC16F877 tem as seguintes
caractersticas:

O conversor gera um resultado binrio de 10 bits usando o mtodo de
aproximaes sucessivas e armazena os resultados das converses;
H 8 entradas analgicas individuais multiplexadas;
A resoluo mnima ou a qualidade da converso pode ser ajustada s vrias
necessidades selecionando as tenses de referncia Vref- e Vref +.

Considerando que as tenses de referncia para a converso so 0V e +5V, o
conversor A/D tem o comportamento mostrado no grfico a seguir, onde no eixo Y
temos a tenso analgica presente em uma das entradas do conversor e no eixo X temos
os valores binrios fornecidos pelo conversor.
Captulo
7
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
59




A grosso modo, a medio de tenso no conversor baseada na comparao da
tenso de entrada com uma escala interna, que tem 1024 pontos (2
10
= 1024). A marca
mais baixa da escala representa a tenso de referncia inferior Vref-, enquanto que a sua
maior marca representa a tenso de referncia superior Vref+. A figura abaixo mostra as
tenses de referncia selecionveis, bem como os valores mnimo e mximo.





O uso do conversor A/D bem simples, sendo um dos perifricos mais simples
de serem utilizados nos microcontroladores.
Para exemplificar o uso do conversor A/D, consideraremos o exemplo mostrado
a seguir que faz a medio de temperatura ambiente atravs do sensor LM35.




Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
60


























Na segunda linha do programa anterior temos a diretiva #device ADC=10, que
especifica que o conversor A/D ir fornecer o resultado da converso em 10 bits. O
conversor pode fornecer o resultado com uma quantidade menor de bits, acelerando o
processo de converso, porm deixando o sistema menos preciso.
Na funo principal temos a declarao de duas variveis. A primeira do tipo
long int, que capaz de armazenar valores inteiros de 16 bits, ou seja, capaz de
armazenar valores de 0 at 65535. A segunda do tipo float, ou ponto flutuante. Essa
varivel capaz de armazenar valores negativos e positivos com pontos decimais.
A instruo setup_adc(adc_clock_internal) indica ao microcontrolador
que o conversor A/D vai trabalhar com o clock interno. Para que o conversor A/D
realize a converso, necessrio um sinal de clock. O PIC16F877 permite selecionar
outras fontes de clock.
A instruo setup_adc_ports(AN0) indica que apenas a entrada analgica A0
vai ser usada pelo conversor.
A instruo setup_adc_channel(0) seleciona o canal 0 (pino A0) para fazer a
leitura analgica.
Dentro do loop infinito, a primeira instruo a leitura do conversor A/D pela
funo read_adc( ). O microcontrolador faz a converso do valor analgico presente
no pino A0 e armazena o resultado na varivel valor. Nesse momento, a varivel valor
possui um nmero compreendido entre 0 e 1023, uma vez que o valor binrio resultante
da converso de 10 bits.
Como a sada do conversor um nmero binrio proporcional tenso medida,
e no o prprio valor binrio da tenso, necessrio utilizar tcnicas conhecidas como
escalonamento, de forma a calcular o valor equivalente entrada do conversor. O
#include <16f877A.h>
#device ADC=10
#fuses HS
#use delay(clock=20M)
#include "LCD_BLIO.h"

void main()
{
unsigned long int valor; //armazena o valor lido do conversor
float temperatura; //armazena a temperatura atual

ini_lcd_16x2();
printf(exibe_lcd,"\f Medio de\n Temperatura");
delay_ms(2000);
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);

//Loop infinito

while(true)
{
valor=read_adc();
temperatura=((int32)valor*500/1023);
printf(exibe_lcd,"\f Temp= %1.1f", temperatura);
delay_ms(1000);
}
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
61
escalonamento feito pelo clculo mostrado na atribuio da varivel temperatura. Esse
escalonamento ser explicado mais detalhadamente em seguida. Assim, a varivel
temperatura agora possui o valor da temperatura atual.
Para finalizar, o valor da temperatura atual mostrado no LCD com o uso da
funo printf(exibe_lcd,"\f Temp= %1.1f", temperatura), com taxa de
atualizao de um segundo.
Observe na funo de escrita do LCD que a impresso do valor da temperatura
tem um formato especfico. Quando o programador deseja imprimir o valor numrico de
uma varivel, esse valor deve ser formatado conforme est mostrado na funo. O termo
%1.1f especifica ao compilador que substitua esse termo pelo valor numrico da
varivel explicitada no final da funo printf, que no caso a varivel temperatura. O
f no final desse termo especifica que a impresso deve ocorrer no formato float,
levando-se em considerao o ponto decimal. Alm disso, os nmeros 1.1 indicam ao
compilador que a impresso deve ser feita com apenas um dgito aps o ponto decimal.
O circuito que implementa a funo de leitura de temperatura ambiente
mostrado na figura abaixo.


O sensor LM35 um sensor de temperatura que fornece 10mV/C. Assim, se a
tenso de sada fornecida por ele de 0V ento a temperatura ambiente de 0C, e se a
tenso de sada for de 5V, a temperatura ambiente ser de 500C.
Essa tenso fornecida pelo LM35 ligada ao pino A0 do PIC, que a entrada
analgica para o conversor A/D. A relao entre a tenso fornecida pelo sensor, o valor
lido pelo conversor A/D e o valor da temperatura mostrado abaixo:










0 mV
5V
0
1023
0 C
500C
X T
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
62
Analisando a relao acima, consegue-se chegar a concluso que
T=(500*X)/1023, que a relao existente entre o valor lido pelo conversor A/D e o
valor da temperatura atual, ou seja, esse deve ser o escalonamento feito para que o LCD
exiba corretamente o valor de temperatura ambiente. A varivel valor convertida para
32 bits, atravs do prefixo (int32) para que o microcontrolador possa efetuar o clculo
corretamente, sem truncamentos ou perda de preciso.

* Modifique o programa anterior para que o mesmo exiba um alarme quando a
temperatura for superior a 100C.
* Modifique o programa anterior para que o mesmo exiba uma mensagem de zona
segura quando a temperatura estiver entre 30C e 40C, zona inferior quando abaixo de
30C e zona de perigo quando acima de 40C.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
63


Memria EEPROM
interna e Interrupes

A memria EEPROM interna uma poderosa ferramenta de armazenamento no PIC
16F877. Essa memria garante o armazenamento permanente de dados, mesmo na falta de
energia, o que garante continuidade de operao em sistemas que precisam voltar a operar
automaticamente aps o restabelecimento de energia. As interrupes so tambm outra
ferramenta poderosa que permitem que o microcontrolador realize outras tarefas enquanto
espera por um evento especfico.


8.1 Memria EEPROM Interna

Em alguns casos, existe a necessidade do armazenamento permanente de dados
referentes ao processo que se deseja controlar, mesmo com a falta de energia. Por
exemplo, em uma fechadura eletrnica codificada, ao se cadastrar uma senha deseja-se
que esta senha no seja esquecida pelo sistema no caso de uma falta de energia. Isso
garante que, aps o restabelecimento da alimentao do microcontrolador, o sistema
volte a operar normalmente, tendo como base a senha previamente cadastrada. Essa
senha deve ser armazenada na memria EEPROM interna.
A memria EEPROM interna possui 256 bytes que podem ser usados livremente
pelo projetista.
Para escrever um dado em uma posio de memria qualquer usa-se a instruo
write_eeprom(endereo,dado), onde endereo um nmero de 0 a 255,
correspondendo ao endereo de memria no qual se deseja escrever algo, e dado um
valor de 8 bits, correspondendo informao que se deseja armazenar.
Para ler uma palavra em uma posio de memria qualquer usa-se a instruo
read_eeprom(endereo), onde endereo um nmero de 0 a 255, correspondendo ao
endereo de memria no qual se deseja ler o seu contedo.
O exemplo a seguir faz a leitura de 6 chaves. Quatro delas (SW1 a SW4) so
usadas como entrada de senha, as outras duas realizam a operao de escrita e leitura na
memria EEPROM interna. Ao ser pressionada a chave escrever, o estado das chaves
SW armazenado na memria EEPROM. Ao ser pressionada a chave ler, o estado
das chaves, gravado na memria, exibido nos 4 leds conectados porta D.




Captulo
8
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
64
O circuito usado mostrado na figura abaixo, e o programa mostrado em
seguida.































#include <16f877A.h>
#fuses HS
#use delay(clock=20M)

#define LER input(pin_b1)
#define ESCREVER input(pin_b0)

void main()
{
int valor; //armazena o valor lido

//Loop infinito

while(true){


if(ESCREVER){ //escrever
valor=input_B();
valor=valor & 0b00111100;
valor=valor>>2;
write_eeprom(0, valor);
}

if(LER){ //ler
valor=read_eeprom(0);
output_D(valor);
while(LER);
}

output_D(0);
}
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
65
No programa, temos uma nova diretiva do compilador, a diretiva #define. Essa
diretiva informa ao compilador para substituir o identificador pelo texto especificado
imediatamente depois dele. No exemplo do programa, a primeira diretiva #define
substituir todas as ocorrncias do identificador LER pelo texto input(pin_b1), j a
segunda diretiva substituir todas as ocorrncias do identificador ESCREVER pelo texto
input(pin_b0). Na funo principal, percebe-se que foram usados os identificadores LER
e ESCREVER nos comandos if.
Esta diretiva pode ser utilizada para criar substituies simples de texto, ou ainda
para a criao de macro comandos em linguagem C.
O programa testa continuamente se alguma das chaves, ler ou escrever foi
pressionada.
O comando if(LER) testa se a chave ler foi pressionada. Caso essa chave
tenha sido pressionada, o bloco de comandos seguinte ao if executado. Inicialmente
ocorre a leitura da porta B, que l o estado das chaves SW1 a SW4, alm do prrpio
estado das chaves ler e escrever, pois estas chaves tambm esto conectadas porta
B. O resultado da leitura armazenado na varivel valor. Para levar em considerao
apenas o estado das chaves SW, o programa executa a operao valor=valor &
0b00111100. Essa operao faz um AND bit a bit com o valor binrio 0b00111100 e a
varivel valor. Isso mascara o estado das chaves ler e escrever, fazendo com que a
varivel valor assuma o contedo 0b00XXXX00, onde XXXX representa o estados das
chaves SW. Em seguida, esse valor deslocado dois bits direita, passando ento a
varivel valor a assumir o contedo binrio 0b0000XXXX. Finalmente, esse contedo
escrito no endereo 0 (zero) da memria EEPROM com o uso do comando
write_eeprom(0, valor).
O comando if(ESCREVER) testa se a chave escrever foi pressionada. Caso
essa chave tenha sido pressionada, o bloco de comandos seguinte ao if executado.
Inicialmente ocorre a leitura do contedo do endereo 0 (zero) da memria EEPROM
pelo uso do comando valor=read_eeprom(0). A varivel valor assume o contedo
dessa posio de memria. Finalmente, o contedo da varivel valor escrito na porta
D. O contedo da varivel valor exatamente o ltimo estado lido das chaves SW.
O comando while(LER) faz com que o programa fique parado nessa linha
enquanto a chave ler estiver pressionada.


8.2 Interrupes

Como o prprio nome sugere, uma interrupo serve para interromper
imediatamente o fluxo regular de um programa. Desta maneira, podemos tomar atitudes
instantneas. As interrupes so aes tratadas diretamente pelo hardware, o que as
tornam muito rpidas e disponveis em qualquer ponto do sistema. Assim sendo, quando
uma interrupo acontece, o programa paralisado, uma funo especfica (definida
pelo programador) executada e depois o programa continua a ser executado no mesmo
ponto em que estava.
Interrupes de hardware foram introduzidas como forma de evitar o desperdcio
de tempo valioso do processador em polling loops, a espera de eventos externos. Por
exemplo, quando voc pressiona um boto em um controle remoto, o microcontrolador
registrar essa ao e responder mudando o canal ou aumentando o volume, etc. Se o
microcontrolador gastar a maior parte do tempo verificando se cada um dos botes foi
pressionado, isso no seria nada prtico.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
66
Existem diversas fontes de interrupo que podem ser habilitadas no PIC
16F877. Apenas para citar algumas, podemos destacar as interrupes dos timers
(temporizadores), interrupes de fim de escrita na memria EEPROM, interrupes de
fim de converso no mdulo conversor A/D, interrupes de mudana de estado em
alguns pinos do microcontrolador, etc.


8.3 Interrupo externa em RB0

Essa interrupo gerada por um sinal externo ligado a um pino especfico do
PIC, que no caso o pino RB0. Desta maneira, podemos identificar e processar
imediatamente um sinal externo. Ela utilizada para diversas finalidades, como, por
exemplo, a comunicao entre microcontroladores, garantindo sincronismo, o
reconhecimento de um boto ou outro sinal do sistema que necessite de uma ao
imediata.
O pino RB0 a nica fonte de interrupo externa verdadeira. A interrupo
ocorre quando h uma mudana de nvel lgico nesse pino, e identificada pela borda
de transio do sinal. Ela pode ser configurada para reagir a uma borda de subida
(transio do nvel baixo para nvel alto), ou a uma borda de descida (transio do nvel
alto para o nvel baixo).
O exemplo a seguir caracteriza o uso desse tipo de interrupo. O circuito usado
mostrado na figura abaixo. O programa faz com que um LED ligado em RD0 fique
oscilando com uma frequncia de 2 Hz. Ao ser pressionada a chave ligada em RB0
(fonte da interrupo), o programa altera o estado lgico do pino RD1, fazendo com que
o LED ligado a esse pino tambm altere o seu estado a cada pressionamento da chave.



Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
67


























A instruo ext_int_edge(L_TO_H) especifica qual a borda do sinal externo
vai caracterizar a interrupo. Nesse caso, a borda do tipo L_TO_H, ou seja, Low To
High (nvel baixo para o nvel alto). Isso ocorre quando o boto pressionado.
A instruo enable_interrupts(int_ext) habilita a interrupo externa. A
instruo enable_interrupts(global) permite que todas as interrupes previamente
habilitadas ocorram. No caso, habilitamos apenas a interrupo externa em RB0.
A execuo do programa permanece todo o tempo dentro do lao while, que
permite a oscilao do estado do LED ligado em RD0. Ao ocorrer uma transio do
nvel lgico baixo para o alto em RB0 (que ocorre ao pressionarmos a chave em RB0),
o programa pra o fluxo de execuo do lao while e executa a funo especificada logo
em seguida diretiva #INT_EXT, que especifica ao compilador que a prxima funo
deve ser executada quando ocorrer uma interrupo em RB0. Cada tipo de interrupo
possui uma diretiva especfica.
A funo especificada a funo altera_estado( ). Essa funo poderia
receber qualquer nome. O corpo da funo chama a funo interna
output_toggle(pin_d1), que faz com que o estado lgico do pino D1 se inverta,
fazendo com que o LED conectado a esse pino tambm inverta seu estado a cada
execuo da funo, ou seja, a cada pressionamento da chave em RB0.

* Modifique o primeiro programa deste captulo para que no seja necessrio fazer
com que o microcontrolador fique continuamente lendo se as chaves ler ou
escrever foram pressionadas. Enquanto nenhuma chave for pressionada, o
microcontrolador deve ficar oscilando um LED conectado ao pino RD7 com uma
frequncia de 4 Hz.
#include <16F877A.h>
#fuses HS
#use delay(clock=20M)


void main()
{
ext_int_edge(L_TO_H);
enable_interrupts(int_ext);
enable_interrupts(global);
output_low(pin_d1);

//Loop infinito
while(true){

output_high(pin_d0);
delay_ms(250);
output_low(pin_d0);
delay_ms(250);
}
}


#INT_EXT

void altera_estado()
{
output_toggle(pin_d1);
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
68


Timers Internos


O oscilador do microcontrolador utiliza cristal de quartzo para a gerao do sinal de
clock para o seu funcionamento. Embora esta no seja a soluo mais simples, existem muitas
razes para us-la. A freqncia de osciladores com cristais de quartzo precisamente
definida e muito estvel, de modo que gera pulsos sempre da mesma largura, o que os torna
ideais para a medio do tempo. Tais osciladores tambm so usados em relgios de quartzo.
Se for necessrio medir o tempo entre dois eventos, basta contar a quantidade de pulsos
gerados por este oscilador no intervalo desejado. Isto exatamente o que os timers internos ao
microcontrolador fazem.


9.1 Introduo

A maioria dos programas usa uma espcie de relgio em miniatura. Na
prtica, esses relgios, conhecidos como timers, ou ainda contadores, so na verdade
registradores de 8 ou 16 bits cujo contedo automaticamente incrementado por cada
pulso do oscilador do microcontrolador. Uma vez que o contedo do registrador estiver
completamente preenchido, um evento de interrupo pode ser gerado, a fim de
executar uma determinada ao.
Se o timer usa um oscilador de quartzo para o seu funcionamento interno, ento
ele pode ser usado para medir o tempo entre dois eventos (se o valor do registrador T1
no momento em que se inicia a medio, e T2, no momento em que termina, ento o
tempo decorrido igual a o resultado da subtrao T2-T1).
Se os registradores usam pulsos provenientes de fontes externas conectados a um
pino do microcontrolador, ento o timer transformado em um contador. Obviamente,
o mesmo circuito eletrnico, capaz de operar em dois modos diferentes. A nica
diferena que neste caso os pulsos a serem contados provm de um pino de entrada do
microcontrolador e sua durao (largura) mais indefinida. por isso que eles no
podem ser usados para medir o tempo, mas para outros fins, tais como contagem de
produtos em uma linha de montagem, o nmero de rotao do eixo de um motor, etc
(dependendo do sensor em uso).
Na prtica, os impulsos gerados pelo oscilador de quartzo so levados para o
circuito que incrementa o nmero armazenado no registrador associado ao timer. Estes
pulsos podem ser levados diretamente, uma vez por cada ciclo de mquina, ou ainda
atravs de um divisor. Por exemplo, Se um clico de mquina tem a durao de quatro
perodos do oscilador de quartzo, funcionando a 4Mhz, ento, o contador ser
incrementado um milho de vezes por segundo.
A figura 9.1 mostra de forma simplificada como funciona um timer interno ao
microcontrolador.


Captulo
9
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
69


Figura 9.1 Operao dos timers internos.

A figura mostra que os pulsos do oscilador de 4Mhz, usado como exemplo, so
divididos por 4, referente a quantiodade de pulsos necessria execuo de cada ciclo
de mquina. Assim, aps essa diviso, temos pulsos a uma frequncia de 1Mhz. Esses
pulsos so ligados diretamente ao registrador associado ao timer, e, a cada pulso, o
contedo desse registrador incrementado (a cada microssegundo).
Se o registrador usado for de 8 bits, fcil medir intervalos de tempo de at 256
microssegundos, pois o valor mximo que o contador pode assumir. O intervalo de
tempo transcorrido entre dois instantes calculado como mostra a figura 9.1.
Essa restrio pode ser facilmente superada de diversas maneiras, como atravs
do uso de um oscilador mais lento, usar um registrador com mais bits, usar um outro
divisor de frequncia (prescaler), ou usar interrupes. As duas primeiras solues tm
alguns pontos fracos de modo que mais recomendvel usar prescalers ou interrupes.

9.2 Usando Prescalers

Um prescaler (divisor) um dispositivo eletrnico usado para reduzir a
freqncia por um fator predeterminado. A fim de gerar um pulso em sua sada,
necessrio levar 1, 2, 4 ou mais pulsos em sua entrada. A maioria dos
microcontroladores possuem um ou mais prescalers embutidos e sua taxa de diviso
pode ser alterada a partir do programa. O divisor utilizado quando necessrio medir
perodos de tempo mais longos. Um prescaler normalmente compartilhado por vrios
temporizadores, de modo que no pode ser usado por mais de um simultaneamente. A
figura 9.2 Ilustra o uso do prescaler. Nesse caso, o incremento do contedo do
registrador ocorre de forma mais lenta, permitindo a medio de maiores intervalos de
tempo.

Figura 9.2 Operao dos timers internos.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
70
9.3 Usando Interrupes no uso de timers

Se o registrador do temporizador composto de 8 bits, o maior nmero que este
pode armazenar 255. Quanto aos registros de 16 bits, o maior nmero 65535. Se esse
nmero for ultrapassado, o temporizador ser automaticamente reiniciado e a contagem
vai comear do zero novamente. Esta condio chamada de um estouro do timer.
Se ativado a partir do programa, o estouro pode causar uma interrupo, o que
d possibilidades completamente novas. Por exemplo, em um relgio digital, o estado
dos registradores usados para a contagem de segundos, minutos ou dias pode ser
alterado em uma rotina de interrupo.
A figura 9.3 ilustra o uso de uma operao com o uso de interrupo no timer.
Se a interrupo por estouro no timer for configurada, o contedo do registrador
adicional incrementado. O contedo desse registrador adicional usado para controlar
determinadas funes no programa principal.



Figura 9.3 Uso de interrupo no timer interno.


9.4 Timers no PIC 16F877

O PIC 16F877 possui 3 timers internos, chamados TIMER0, TIMER1 e
TIMER2.
O TIMER0 e o TIMER2 so de 8 bits, enquanto que o TIMER1 de 16 bits.
Qualquer timer pode ser configurado com prescaler, e o timer 2 possui ainda um
postscaler (divisor extra).


TIMER0

O TIMER0 possui as seguintes caractersticas:

Registrador de 8 bits;
Permite ler e escrever no seu contedo;
Prescaler programvel de 3 bits (1, 2, 4, 8, 16, 32, 64, 128);
Fonte de clock selecionvel como interna ou externa;
Interrupo no estouro do contador de FFh para 00h;
Borda selecionvel para fonte de clock externa.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
71
TIMER1

O TIMER1 possui as seguintes caractersticas:

Registrador de 16 bits;
Permite ler e escrever no seu contedo;
Prescaler programvel de 2 bits (1, 2, 4, 8);
Fonte de clock selecionvel como interna ou externa;
Interrupo no estouro do contador.

O programa a seguir implementa a funo de um relgio digital simples, com
exibio do tempo no formato HH:MM:SS, usando a interrupo pelo estouro do
TIMER1. O tempo exibido em um display de cristal lquido.
Inicialmente so declaradas 3 variveis globais do tipo int (segundos, minutos e
horas). Essas variveis vo registrar o tempo atual. Uma quarta varivel do tipo int,
chamada conta tambm declarada. Essa varivel servir como varivel auxiliar para
garantir maiores contagens de tempo no TIMER1.
Na funo main() todas as variveis so inicializadas com zero. Para que o
relgio inicie com um tempo diferente de 00:00:00, basta alterar o contedo da
inicializao das variveis minutos, segundos e horas. Em seguida, o LCD inicializado
com a funo ini_lcd_16x2( ). As prximas 3 funes internas so referentes ao
ajuste do TIMER1.
A funo setup_timer_1(T1_INTERNAL|T1_DIV_BY_8) ajusta o TIMER1 para
operar com o clock interno e usa o prescaler divisor por 8. Estes dois ajustes fazem com
que o TIMER1 seja incrementado a cada 1,6 s. Com esses ajustes, cada estouro do
contador leva aproximadamente 104,8 ms.
A funo enable_interrupts(int_timer1) habilita a interrupo pelo
estouro do TIMER1, e a funo enable_interrupts(global) habilita as interrupes
globais. Como apenas a interrupo do TIMER1 foi previamente habilitada, apenas essa
interrupo ser tratada.
Em seguida, a funo:
printf(exibe_lcd,"\f %02d:%02d:%02d", horas, minutos, segundos)
imprime pela primeira vez a hora no display. Observe que a formatao da impresso de
cada campo do formato de hora do tipo %02d. Isso indica que a impresso deve ser
feita com dois dgitos do tipo inteiro para cada campo, e que deve ser precedido por um
zero, caso o dgito seja nico, como por exemplo na impresso de 02:15:03 (os campos
horas e segundos esto precedidos por um zero, j no campo minutos no necessrio a
insero do zero nesse instante).
Aps isso, o programa entra no loop infinito do while(true), e fica aguardando
o estouro do TIMER1. Quando o TIMER1 estoura, o programa executa a funo aps a
diretiva #INT_TIMER1. A cada estouro, a varivel conta incrementada e aps 9
estouros (aps o tempo de 1 segundo) o teste if(conta==9) resulta em verdadeiro.
Assim, a varivel conta zerada e ocorre a atualizao dos campos horas, minutos e
segundos pelos incrementos e testes realizados. Inicialmente se incrementa o campo dos
segundos, e em seguida realizam-se testes para verificar a necessidade de incrementar
os campos minutos e horas. Esses testes baseiam-se no fato de que a cada 60 segundos,
deve ocorrer um incremento no campo minutos, e a cada 60 minutos, deve ocorrer um
incremento no campo horas. Deve ser tambm verificado que quando o campo minutos
sofre um incremento, o campo segundos deve ser zerado e tambm, quando o campo
horas sofre um incremento, o campo minutos deve ser zerado.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
72
Aps a atualizao das variveis, ocorre a impresso do tempo no display.

















































#include <16F877A.h>
#fuses HS
#use delay(clock=20M)
#include "LCD_BLIO.h"

int horas, minutos, segundos;
int conta;

void main() //Programa Principal
{
horas=0;
minutos=0;
segundos=0;
conta=0;

ini_lcd_16x2();

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(int_timer1);
enable_interrupts(global);


printf(exibe_lcd,"\f %02d:%02d:%02d", horas, minutos, segundos);

while(true);

}

#INT_TIMER1
void atualiza_relogio()
{
++conta;

if(conta==9)
{
conta=0;
++segundos;

if(segundos==60)
{
++minutos;
segundos=0;
}

if(minutos==60)
{
++horas;
minutos=0;
}

if(horas==24)
horas=0;

printf(exibe_lcd,"\f %02d:%02d:%02d", horas, minutos, segundos);
}
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
73
9.4 PWM (Pulse Width Modulation) Modulao por Largura de Pulso

A maneira tradicional, ou mais simples de se controlar a potncia aplicada em
uma carga atravs de um reostato em srie, conforme mostra a figura 9.4.



Figura 9.4 Controle de potncia em uma carga com o uso de Reostato.

Variando-se a resistncia apresentada pelo reostato pode-se modificar a corrente
na carga e, portanto, a potncia aplicada a ela. Este tipo de controle ainda encontrado
nas lmpadas de painis de alguns carros mais antigos.
A grande desvantagem deste tipo de controle, denominado linear, que a
queda de tenso no reostato multiplicada pela corrente que ele controla representa uma
grande quantidade de calor gerada. O controle passa a dissipar (e pedir) mais potncia
que a aplicada na prpria carga em determinadas posies do ajuste. Alm desta perda
ser inadmissvel, ela exige que o componente usado no controle seja capaz de dissipar
elevadas potncias, ou seja, torna-se caro e grande (normalmente reostatos ou
potencimetros de fio, mesmo para potncias relativamente baixas).
Outra opo de controle de potncia seria a substituio do reostato com o uso
de transistores, ou circuitos integrados em um controle mais elaborado, polarizados
adequadamente de forma que ainda varie linearmente a potncia aplicada pelo controle
direto da corrente. Mesmo assim, a potncia dissipada pelo dispositivo que controla a
corrente principal (o transistor) elevada.
Esta potncia depende da corrente e da queda de tenso no dispositivo e, da
mesma forma, em certas posies do ajuste, pode ser maior que a prpria potncia
aplicada ao dispositivo.
Na eletrnica moderna, o rendimento com pequenas perdas e a ausncia de
grandes dissipadores que ocupem espao fundamental, principalmente quando
circuitos de alta potncia esto sendo controlados.
Desta forma, este tipo de controle de potncia linear no conveniente, sendo
necessrias outras configuraes de maior rendimento como as que fazem uso das
tecnologias PWM.
Os controles de potncia, inversores de frequncia, conversores para servomotor,
fontes chaveadas e muitos outros circuitos utilizam o conceito PWM (Pulse Width
Modulation) ou Modulao por Largura de Pulso como base de seu funcionamento.
Para que se entenda como funciona esta tecnologia no controle de potncia,
partimos de um circuito imaginrio, formado por um interruptor de ao muito rpida e
uma carga que deve ser controlada, de acordo com a figura 9.5.



Carga
Reostato
+
-
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
74


Figura 9.5 Controle de potncia em uma carga com o uso de interruptor eletrnico.

Quando o interruptor est aberto no h corrente na carga e a potncia aplicada
nula. No instante em que o interruptor fechado, a carga recebe a tenso total da fonte e
a potncia aplicada mxima.
Como fazer para obter uma potncia intermediria, digamos 50%, aplicada
carga? Uma idia fazermos com que a chave seja aberta e fechada rapidamente de
modo a ficar 50% do tempo aberta e 50% fechada. Isso significa que, em mdia,
teremos metade do tempo com corrente e metade do tempo sem corrente, conforme
mostra a figura abaixo.



A potncia mdia e, portanto, a prpria tenso mdia aplicada carga neste
caso 50% da tenso de entrada. Veja que o interruptor fechado define uma largura de
pulso pelo tempo em que ele fica nesta condio (t1), e um intervalo entre pulsos pelo
tempo em que ele fica aberto (t2). Os dois tempos juntos definem um perodo (t) e,
portanto, uma frequncia de controle.
A relao entre o tempo em que temos o pulso e a durao de um ciclo completo
de operao do interruptor nos define ainda o ciclo ativo (Duty Cycle) (neste caso, o
ciclo ativo de 50%).
Carga
Controle
+
-
100
50
0
Tenso na carga (%)
Tempo
Tenso mdia
t
t1 t2
Largura do pulso t1=t2 (50% do ciclo ativo)
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
75
Variando-se a largura do pulso e tambm o intervalo de modo a termos ciclos
ativos diferentes, podemos controlar a potncia mdia aplicada a uma carga. Assim,
quando a largura do pulso varia de zero at o mximo, a potncia tambm varia na
mesma proporo. Este princpio usado justamente no controle PWM: modulamos
(variamos) a largura do pulso de modo a controlar o ciclo ativo do sinal aplicado a uma
carga e, com isso, a potncia aplicada a ela.
A figura abaixo mostra sinais do tipo PWM para diferentes larguras de pulso e
diferentes valores mdios de tenso aplicada carga.





Na prtica, substitumos o interruptor por algum dispositivo de estado slido que
possa abrir e fechar o circuito rapidamente como, por exemplo, um transistor bipolar,
um FET de potncia, um IGBT ou at mesmo um SCR ou TRIAC.
A este dispositivo ento ligado um oscilador que possa ter seu ciclo ativo
controlado numa grande faixa de valores. Na prtica, difcil chegar durao zero do
pulso e 100%, j que isso implicaria na parada do oscilador, mas podemos chegar bem
perto disso.
Na operao de um controle por PWM existem diversas vantagens a serem
consideradas e alguns pontos para os quais o projetista deve ficar atento para no jogar
fora estas vantagens.
Na condio de aberto, nenhuma corrente circula pelo dispositivo de controle e,
portanto, sua dissipao nula. Na condio de fechado, teoricamente, se ele apresenta
uma resistncia nula, a queda de tenso nula, e ele no dissipa tambm nenhuma
potncia. Isso significa que, na teoria, os controles PWM no dissipam potncia alguma
e, portanto, consistem em solues ideais para este tipo de aplicao. Na prtica,
entretanto, isso no ocorre. Em primeiro lugar, os dispositivos usados no controle no
so capazes de abrir e fechar o circuito num tempo infinitamente pequeno. Eles
precisam de um tempo para mudar de estado e, neste intervalo de tempo, sua resistncia
sobe de um valor muito pequeno at infinito e vice-versa.
Neste intervalo de tempo a queda de tenso e a corrente atravs do dispositivo
no so nulas, e uma boa quantidade de calor poder ser gerada conforme a carga
controlada.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
76
Dependendo da frequncia de controle e da resposta do dispositivo usado, uma
boa quantidade de calor poder ser gerada neste processo de comutao. Entretanto,
mesmo com este problema, a potncia dissipada num controle PWM ainda muito
menor do que num circuito de controle linear equivalente. Transistores de comutao
rpidos, FETs de potncia, e outros componentes de chaveamento podem ser
suficientemente rpidos para permitir que projetos de controles de potncias elevadas
sejam implementados sem a necessidade de grandes dissipadores de calor ou que
tenham problemas de perdas de energia por gerao de calor que possam ser
preocupantes.
O segundo problema que poder surgir vem justamente do fato de que os
transistores de efeito de campo ou bipolares usados em comutao no se comportam
como resistncias nulas, quando saturados (fechados).
Os transistores bipolares podem apresentar uma queda de tenso de at alguns
volts quando saturados, o mesmo ocorrendo com os FETs. Deve-se observar em
especial o caso dos FETs de potncia que so, s vezes, considerados comutadores
perfeitos, com resistncias de frao de ohm entre o dreno e a fonte quando saturados
(Rds(on)) mas na prtica no isso que ocorre.
A baixssima resistncia de um FET de potncia quando saturado (resistncia
entre dreno e fonte no estado on) s vlida para uma excitao de comporta feita com
uma tenso relativamente alta. Assim, dependendo da aplicao, principalmente nos
circuitos de baixa tenso, os transistores de potncia bipolares ou mesmo os IGBTs
podem ser ainda melhores que os FETs de potncia.
O controle de potncia por PWM possui diversas aplicaes prticas, tais como:
controle de velocidade e sentido de rotao de motores, controle de luminosidade de
lmpadas e LEDS, controle do posicionamento de servomotores, entre outros


9.5 Mdulo PWM no PIC16F877

O PIC16F877 possui dois mdulos (hardwares) chamados de CCP
(Capture/Compare/PWM) que pode operar de diferentes maneiras. Eles permitem
temporizar e controlar diferentes eventos.
Quando o mdulo CCP opera no modo de Captura, ele permite o acesso ao
estado corrente de um registrador que muda constantemente seu valor. NO caso, este
registrador o TIMER1. Basicamente, esse modo usado para capturar eventos
externos e medir o intervalo de tempo entre eles.
Quando o mdulo CCP opera no modo de Comparao, ele compara
constantemente o contedo de dois registradores. Um deles o TIMER1. Este modo
permite ao usurio disparar determinados eventos depois de transcorrido um
determinado intervalo de tempo.
Quando o mdulo CCP opera no modo PWM, ele pode gerar sinais de diferentes
frequncias e ciclo ativo em um ou mais pinos de sada. O CCP1 fornece o sinal PWM
no pino C2, da porta C, e o CCP2 fornece o sinal PWM no pino C1, da mesma porta.
Este modo opera em conjunto com o TIMER2, que o responsvel pelas temporizaes
que determinam as frequncias de operao do sinal PWM.
O perodo T do sinal PWM determinado atravs de um registrador de 8 bits,
chamado PR2, pertencente ao TIMER2. O perodo pode ser calculado usando a seguinte
equao:

T = (PR2+1) * 4Tosc * TIMER2
prescaler

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
77
PR2 pode assumir valores de 0 a 255, pois referente aos 8 bits do registrador;

Tosc o perodo de oscilao do cristal utilizado no oscilador do PIC, calculado como
Tosc=1/Fosc, onde Fosc a frequncia do cristal utilizado;

TIMER2
prescaler
o valor do divisor de frequncia associado ao TIMER2. Esse valor
pode assumir 3 valores distintos, 1, 4, e 16.

A tabela seguinte mostra exemplos de como gerar sinais PWM em algumas
frequncias, considerando que o cristal oscilador de 20MHz (Tosc=50ns).

Frequncia (kHz) 1.22 4.88 19.53 78.12 156.3 208.3
TIMER2
prescaler
16 4 1 1 1 1
Registrador PR2 FFh FFh FFh 3Fh 1Fh 17h


O Ciclo ativo (Duty Cycle) determinado atravs de um registrador de 10 bits.
Nesse caso, para uma determinada frequncia, podemos obter 1024 diferentes valores
de ciclo ativo.
O programa abaixo mostra como configurar o CCP e o TIMER2 para gerao de
um sinal PWM.
























O programa, inicialmente declara a varivel do tipo long int (16 bits) chamada
ciclo. Em seguida, o conversor A/D ajustado, conforme foi visto em captulos
anteriores.
A funo interna setup_timer_2(T2_DIV_BY_16, 255, 1) ajusta o TIMER2
para garantir uma frequncia de PWM de 1,22Khz. O valor 255 na funo referente ao
//Programa exemplo de configurao do CCP como PWM

#include <16F877A.h>
#device ADC=10
#fuses HS
#use delay(clock=20M)


void main()
{
long int ciclo;

setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);

setup_timer_2(T2_DIV_BY_16, 255, 1); //Fpwm=1,22Khz
setup_ccp1(ccp_pwm);

while(true)
{
ciclo=read_adc();
set_pwm1_duty(ciclo);
}
}
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
78
registrador PR2, citado anteriormente. O prescaler usado foi o 16. O valor 1 na funo
deve ser inserido para garantir a frequncia de PWM correta. Esse valor pode ser
alterado e funciona como um divisor da frequncia de PWM gerada.
A funo setup_ccp1(ccp_pwm) ajusta o mdulo CCP1 para operar como
PWM.
No lao while, o microcontrolador permanece constantemente lendo a entrada
analgica 0, e armazena o valor da converso na varivel ciclo. Nesse instante, a
varivel ciclo, apesar de ser de 16 bits, possui um valor que pode ser representado
apenas por 10 bits, visto que o resultado da converso A/D de 10 bits. O valor dessa
varivel usado na funo set_pwm1_duty(ciclo) para ajustar o ciclo ativo do sinal
PWM gerado. Ao conectarmos um trimpot na entrada analgica 0, podemos variar de 0
a 100% o ciclo ativo do sinal PWM variando-se a posio do eixo do trimpot. O Sinal
PWM fornecido no pino C2, pois estamos usando o mdulo CCP1.
A figura 9.6 mostra um circuito que pode ser usado para verificao do
funcionamento do programa anterior.
Um LED foi conectado ao pino C2 para verificao funcional do sinal PWM. O
brilho do LED vai aumentando gradativamente medida que o ciclo ativo do sinal
PWM aumenta de 0 a 100%.




Figura 9.6 Circuito de verificao de gerao do sinal PWM.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
79


Comunicao Serial e
Protocolos

Em muitas aplicaes microcontroladas, pode ser necessrio realizar a comunicao
entre o microcontrolador e um ou mais dispositivos externos, tais como memrias externas,
outros microcontroladores, como em um sistema distribudo, ou mesmo computadores, como
numa rede integrada. Esses dispositivos tanto podem estar na mesma placa do circuito, como
fora dela, a metros ou mesmo dezenas de quilmetros de distncia um do outro. A escolha do
sistema de comunicao mais adequado para realizar essa tarefa depende de vrios fatores
como: velocidade, imunidade a rudos, custo, etc.


10.1 Introduo

As tcnicas de comunicao entre dispositivos podem ser divididas em duas
grandes categorias: serial e paralela.
Na comunicao serial, a informao a ser transmitida fracionada em pequenas
partes (bits) que so enviadas ao equipamento receptor uma aps a outra, em srie, da a
denominao de comunicao serial. Cada bit tem uma certa durao para permitir que
os dispositivos que estejam recebendo os dados possam ler a informao.
Dependendo da durao do bit, um sistema pode transmitir mais ou menos
informaes em um determinado intervalo de tempo. A isso, d-se o nome de taxa de
transmisso, ou velocidade do canal de comunicao, e medida em bauds, ou ainda
bits/segundo (bps). Por exemplo, se num intervalo de um segundo um sistema de
comunicao transmite 9600 bits, dizemos que a taxa de transmisso desse canal, ou sua
velocidade, da ordem de 9600 bauds, ou ainda 9600 bps.
A temporizao e o formato dos bits fazem parte do que se chama de protocolo
de comunicao. Ele visa estabelecer regras para que a comunicao seja bem sucedida.
Como exemplos de sistemas de comunicao serial podemos citar: as interfaces
seriais dos computadores (RS-232, USB, Firewire), protocolos de redes locais
(Ethernet, Token-Ring, etc), outros protocolos como I2C, SPI, 1-Wire, LIN, CAN, etc.
Na comunicao paralela, os bits componentes da informao so transmitidos
simultanemanete (total ou parcialmente) em paralelo. Como exemplos de sistemas de
comunicao paralela podemos citar os barramentos internos dos microprocessadores e
microcontroladores, barramento ISA, PCI, VESA, AGP, a interface de impressora
paralela dos microcomputadores, SCSI, IDE, etc.
A escolha dentre os tipos de comunicao um paradoxo da dualidade custo x
benefcio: na comunicao paralela, temos altas velocidade de comunicao, mas
Captulo
10
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
80
tambm uma alta utilizao de meios de transmisso, alm de uma baixa imunidade a
rudos. Na comunicao serial, temos uma velocidade mxima menor que na
comunicao paralela, mas tambm uma menor utilizao de meios de transmisso e
uma melhor imunidade a rudos.
Na verdade, as tcnicas de comunicao serial vm sendo continuamente
aprimoradas, e atualmente temos diversos protocolos de comunicao capazes de atingir
altssimas velocidades, tais como: o USB 2.0, Firewire, SCSI, Serial ATA, etc.
A tcnica serial pode ainda ser subdividida em duas categorias: sncrona e
assncrona.
Na comunicao serial sncrona, alm da(s) linha(s) de comunicao,
encontramos uma ou mais linhas de sincronizao (clock). A informao na linha de
dados transmitida a cada transio da linha de clock Neste tipo de comunicao serial,
encontramos ainda uma outra classificao para os elementos de comunicao: o
elemento que gera o sinal de sincronizao de transmisso (clock) chamado de mestre,
o(s) dispositivo(s) que recebe o sinal de soncronismo (so) chamado(s) de escravo(s).
No exemplo da figura abaixo, temos uma comunicao serial sncrona com um
dispositivo mestre (Transmissor) e um escravo (Receptor). So usadas duas linhas de
comunicao entre os dispositivos ( linha de clock e linha de dados).





Na comunicao serial assncrona, no encontramos uma linha especfica para
sincronizao. Neste caso, a sincronizao entre os elementos transmissor e receptor
garantida pela preciso dos clocks de cada elemento e tambm pela utilizao de sinais
marcadores de incio (start) e fim (stop) da palavra transmitida.


10.2 Comunicao Serial Assncrona

Como foi dito, a comunicao serial assncrona caracteriza-se pela utilizao de
marcadores de incio e fim de transmisso.
Na figura abaixo podemos observar a transmisso de um sinal serial assncrono.



Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
81
Quando o canal de comunicao est em repouso, o sinal correspondente no
canal tem um nvel lgico 1. Um pacote de dados sempre comea com uma transio
do nvel 1 para o nvel lgico 0 (start bit), para sinalizar ao receptor que uma
transmisso foi iniciada. O start bit inicializa um temporizador interno no receptor,
que sincroniza a leitura do canal com a durao de cada bit. Seguido do start bit, 8 bits
de dados de mensagem, iniciando pelo bit LSB, so enviados na taxa de transmisso
especificada. O pacote concludo com os bits de paridade (opcional) e de parada
(stop bit). O bit de paridade serve para detectar eventuais erros de comunicao entre
os dispositivos.


10.3 O Padro RS-232

Tambm conhecido por EIA RS-232C ou V.24, o RS-232 um padro de
comunicao serial bastante antigo, mas que continua sendo bem utilizado por sua
simplicidade e confiabilidade.
Como qualquer dispositivo de transmisso serial, os bits so enviados um a um,
sequencialmente, e normalmente com o bit menos significativo primeiro (LSB). Por ser
um protocolo assncrono, isto , sem uma linha de relgio (clock), responsabilidade do
transmissor e do receptor efetuarem controles de tempo para saber quando cada bit
inicia e finaliza.
Para cada byte transmitido, existem bits de start e stop; o mais comum utilizar-
se 1 bit de incio (start bit) e 1 bit de parada (stop bit), mas possvel encontrar
aplicaes que utilizam 1,5 ou 2 bit de incio/parada. A figura abaixo mostra como a
transmisso de um byte ocorre:




Como j citado anteriormente, esta transmisso assncrona. Tendo a velocidade
de comunicao ajustada nos dois dispositivos inicialmente, cada um deles sabe quanto
tempo um bit demora a ser transmitido, e com base nisto que a identificao dos bits
possvel.
No transmissor o envio basicamente resume-se a enviar um bit de incio,
aguardar um tempo, e enviar os prximos 8 bits e mais o bit de parada, com o mesmo
intervalo de tempo entre eles.
No receptor, aps a primeira borda de descida (nvel lgico de "1" para "0")
(start bit) o receptor sabe que uma sequncia de mais 8 bits de dados, mais o bit de
parada, chegar. Ele tambm conhece a velocidade de transmisso, ento tudo o que ele
precisa fazer aguardar o tempo de transmisso entre cada bit e efetuar a leitura do
canal de comunicao. Aps receber o bit de parada, a recepo encerra-se e ele volta a
aguardar o prximo start bit.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
82
Nos microcontroladores modernos, todo este trabalho normalmente efetuado
por um mdulo interno chamado USART (Universal Synchronous Asynchronous
Receiver Transmitter). Este perifrico encarrega-se de efetuar todo o controle e apenas
gerar interrupes quando um byte recebido. No entanto, algumas vezes o
microcontrolador utilizado no possui uma USART, ou mesmo ela est sendo utilizada.
Nestes casos, possvel implementar uma interface serial atravs de software, tratando a
seqncia de transmisso e recepo descrita anteriormente.
Na interface RS232 o nvel lgico "1" corresponde uma tenso entre -3V e
-12V, e o nvel lgico "0" uma tenso entre +3V e +12V (lgica invertida). Valores de
tenso entre -3V e +3V so indefinidos e precisam ser evitados. O estado idle
(desocupado) da linha o 1 lgico (-V).
Entretanto, a grande maioria dos perifricos que trabalha com portas seriais no
utiliza os nveis eltricos do padro RS232 diretamente. Portanto sempre necessrio
um circuito de converso de nveis TTL/RS232. O circuito integrado de baixo custo
mais comum para efetuar esta converso o MAX232, que possui alimentao TTL.
O chip MAX232 usa um circuito oscilador interno, auxiliado por capacitores
conectados externamente ao CI, para converter as tenses do padro TTL para o RS-232
e vice-versa.
O circuito abaixo mostra como fazer uma interface de um dispositivo que
funciona no padro TTL (lado esquerdo), como um microcontrolador, com um
dispositivo que funciona no padro RS-232, como a porta serial de um
microcomputador (lado direito).




Do lado do dispositivo TTL, temos duas linhas de comunicao, uma chamada
TX e outra RX. Da mesma forma, do lado RS-232, temos duas linhas chamadas com o
mesmo nome.
Para realizar um interfaceamento com uma porta serial de um microcomputador,
usa-se um conector DB-9 padro, usando o pino 2 como entrada de dados (recepo -
RX) no computador e o pino 3 como sada de dados (transmisso TX).
A informao enviada atravs de uma interface serial geralmente feita por
bytes que seguem o padro dos caracteres ASCII (American Standard Code for
Information Interchange) de 7 bits (o oitavo bit zero). Assim, entre os bits de start e
stop h sempre um caractere ASCII.
A tabela abaixo mostra os caracteres do padro ASCII.
Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
83


A norma EIA232 especifica uma taxa mxima de transferncia de dados de
20.000 bits por segundo (o limite usual 19200 bps). Taxas fixas no so fornecidas
pela norma. Contudo, os valores comumente usados so 300, 1200, 2400, 4800, 9600 e
19200 bps.
O programa a seguir mostra um exemplo de como implementar uma
comunicao serial assncrona no padro RS232 entre um microcontrolador PIC16F877
e um microcomputador utilizando o Hyper Terminal do Windows. O Hyper Terminal
usado para enviar e receber dados do microcontrolador e exibi-los na tela do
microcomputador.
O programa faz com que o microcontrolador ecoe os dados recebidos pela porta
serial do microcomputador. Assim, o microcontrolador recebe um byte enviado pelo
computador e o reenvia pela porta serial.


Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
84























A diretiva #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) informa ao
compilador qual a taxa de transmisso (9600 bps) usada pelo microcontrolador na
comunicao serial. Informa tambm quais os pinos do microcontrolador usados para
transmisso (PIN_C6) e recepo (PIN_C7) dos dados.
No programa principal, o comando enable_interrupts(INT_RDA) uma
funo interna do compilador que habilita a interrupo da porta serial do PIC. Assim,
no necessrio que o microcontrolador fique lendo a porta serial para verificar se
chegou um novo dado transmitido pelo computador. A instruo seguinte a habilitao
global das interrupes.
O programa passa a maior parte do tempo dentro do loop infinito promovido
pelo lao while. Porm, o microcontrolador no executa qualquer ao dentro desse
lao.
No microcontrolador, a chegada de um dado transmitido pelo computador
atravs da porta serial gera uma interrupo, previamente habilitada. O programa ento
executa a funo indicada pela diretiva #INT_RDA (RS232 Data Available).
A funo executada quando ocorre a interrupo a funo ecoa_byte(). Nessa
funo, inicialmente declara uma varivel caractere do tipo char. Em seguida, o
comando caractere=getc() l o dado que foi transmitido pelo computador e o
armazena na varivel caractere. O comando printf("%c", caractere) faz com que o
microcontrolador transmita pela porta serial o dado contido na varivel caractere. Esse
comando usado para transmitir dados pela porta serial do PIC.
O programa acima faz ento com que o PIC leia o dado recebido pela porta
serial e o reenvia para o computador. A confirmao de que o microcontrolador est, de
fato, reenviando o dado por ser observada desconectando-se o cabo serial do PC. Os
caracteres deixam de ser ecoados.
//Programa exemplo de comunicao serial

#include <16F877A.h>
#fuses HS
#use delay(clock=20M)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


void main()
{

enable_interrupts(INT_RDA); //habilita interrupo da RS232
enable_interrupts(GLOBAL);

while(true);
}


#INT_RDA
void ecoa_byte(){
char caractere;
caractere=getc(); //l o dado recebido
printf("%c", caractere); //reenvia o dado recebido
}

Curso Microcontroladores PIC e Linguagem C
Prof. Fagner de Araujo Pereira
85
Bibliografia do curso:

SOUSA, D. J. de. Desbravando o PIC: Ampliado e atualizado para
PIC16F628A. 6.ed. Editora rica, 2003.
PEREIRA, F. Microcontroladores PIC: Programao em C. Editora rica, 2003.
SILVA, A. R. Programando Microcontroladores PIC: Linguagem C. Ed. Ensino
Profissional, 2006.
IBRAHIM, D. Advanced PIC Microcontroller Projects in C: from USB to RTOS
with the PIC18F series. Newnes, 2008.
VERLE, M. PIC Microcontrollers Programming in C with examples.
MikroElektronika, 2009.

Potrebbero piacerti anche