Anda di halaman 1dari 67

Curso de Introduo

aos Microcontroladores
PIC

Programa de Educao Tutorial em Engenharia

Universidade Federal de Santa Maria

Joo Otvio C. de Matos


Thiago Dadalt Souto
Santa Maria
16/08 19/08 de 2011

Captulo 1 - Arquitetura de microcontroladores

1.

O que um microcontrolador?

Um microcontrolador, comumente referenciado pela sigla uC, um componente programvel capaz de controlar sistemas eletrnicos. De modo geral, esse tipo de dispositivo
pode ser encarado como um destes computadores com os quais estamos acostumados a lidar
no dia-a-dia, entretanto, em menor escala.
Essa comparao pode ser feita visto que todos os computadores, sejam simples desktops (computadores de mesa) ou robustos mainframes (computadores de grande porte destinados ao processamento de um vasto volume de informaes), possuem um conjunto de caractersticas comuns que aparecem tambm entre os microcontroladores:
Todo computador possui uma unidade central de processamento, CPU, responsvel
pela execuo dos softwares (programas de computador);
A CPU, por sua vez, precisa carregar, de algum lugar, o programa a ser executado. Em
desktops, os softwares so carregados a partir do disco rgido da mquina, conhecido
como HD, do ingls Hard Disk;
Para o armazenamento temporrio dos arquivos e programas que esto sendo executados no momento, existe a memria de acesso aleatrio (Random Access Memory),
conhecida como memria RAM ou memria de dados. O termo acesso aleatrio (ou
acesso randmico) refere-se capacidade de acesso a qualquer posio da memria
em qualquer momento, em oposio ao acesso seqencial imposto por alguns dispositivos de armazenamento;
Os computadores tambm possuem alguns dispositivos de entrada e sada, responsveis pela interface entre o usurio e a mquina. No caso dos desktops, por exemplo, o
mouse e o teclado representam dispositivos de entrada, enquanto o monitor e a impressora so dispositivos de sada. O HD, por sua vez, considerado um dispositivo de
entrada e sada, E/S, j que manipula tanto a entrada como a sada.
A principal diferena entre os computadores comuns e os microcontroladores, de fato,
est na potencialidade de cada um: computadores so mquinas de propsito geral, com a
capacidade de execuo de milhares de programas distintos; j os microcontroladores so
dispositivos de propsito especfico (dedicados), executando, normalmente, um nico software. Alm disso, existem outras especificidades que auxiliam na caracterizao dos microcontroladores:
Os microcontroladores so, de modo geral, embutidos no interior de outros dispositivos, normalmente produtos comercializveis como calculadoras, telefones, mquinas
de lavar roupas, relgios e equipamentos robticos, para que possam controlar as funes e as aes desses produtos. Por esse motivo, muitas vezes os microcontroladores
so chamados de controladores embarcados (ou controladores embutidos);
Microcontroladores geralmente so dispositivos de baixa potncia. Um desktop, por
exemplo, quase sempre ligado rede, podendo consumir dezenas de watts de energia eltrica. Um uC alimentado por bateria, por sua vez, consome uma potncia da ordem de miliwatts;
Um uC normalmente pequeno e barato. Os componentes so escolhidos de forma a
minimizar o tamanho e baratear o dispositivo.
Portanto, a partir das informaes apresentadas, possvel esclarecermos uma discusso que normalmente surge entre aqueles que esto iniciando seus estudos em microcontroladores: a diferena entre microcontroladores e microprocessadores. O aspecto mais importante que difere um uC de um microprocessador a sua funcionalidade. Para que um micropro1|P gin a

Captulo 1 - Arquitetura de microcontroladores


cessador possa ser usado, outros componentes devem-lhe ser adicionados, tais como memria
e componentes para receber e enviar dados. Em resumo, isso significa que o microprocessador
o verdadeiro corao do computador (ou do uC). Por outro lado, o uC foi projetado para ter
tudo num s, ou seja, o uso de microcontroladores no requer componentes externos, uma
vez que todos os perifricos necessrios j esto contidos nele.

1.1.

Aspectos construtivos

Conforme exposto, pode-se encarar um uC como um computador em um chip. Em


outras palavras, um uC pode ser visto, externamente, como um circuito integrado TTL ou
CMOS normal, mas internamente dispe dos dispositivos tpicos de um sistema microprocessado, contendo todos os circuitos necessrios para realizar um completo sistema digital programvel.

Figura 1.1. Um microcontrolador pode ser visto como um computador em um chip

Portanto, independentemente da empresa fabricante ou da famlia de microcontroladores escolhida, h elementos que se fazem presentes na arquitetura de qualquer uC, diferindo apenas em caractersticas como velocidade, capacidade de armazenamento, freqncia de
operao, entre outras. Dessa forma, todo uC dispe de:
CPU, que, como mencionada anteriormente, responsvel por interpretar as instrues de programa;
Memria de programa, na qual ser feito o armazenamento das instrues de programa. Essa memria pode ser do tipo PROM (Programmable Read Only Memory ou
Memria Programvel Somente para Leitura), no permitindo a reprogramao do
dispositivo, EEPROM (Eletrically Erasable Programmable Read Only Memory) ou flash
(memria utilizada em pen drives), sendo que as duas ltimas possibilitam regravao.
Memria de dados ou RAM, utilizada para memorizar as variveis utilizadas pelo programa. Essa memria dita voltil, pois uma vez cessada a fonte de alimentao, os
dados armazenados so perdidos, ao contrrio do que ocorre com as memrias de
programa citadas no item anterior;
Dispositivos perifricos como temporizadores, conversores A/D e D/A, contadores,
entre outros;
Linhas de I/Os (entrada e sada) para controlar dispositivos externos ou receber informaes de sensores, chaves, etc.
A presena de todos esses elementos em um espao extremamente pequeno d ao
projetista ampla gama de trabalho e enorme vantagem em usar um sistema microprocessado
do tipo, onde em pouco tempo e com poucos componentes externos possvel fazer o que
seria bastante trabalhoso com circuitos tradicionais.

1.2.

Os microcontroladores PIC

2|P gin a

Captulo 1 - Arquitetura de microcontroladores


Os microcontroladores PIC (PICmicro) correspondem a uma famlia de microcontroladores fabricados pela empresa norte-americana Microchip Technology Inc., capazes de processar dados de 8, 16 e 32 bits. A sigla PIC oriunda de Programmable Interface Controller ou
Controlador de Interface Programvel. Esses microcontroladores possuem uma alta velocidade
de processamento devido ao uso da arquitetura Harvard (o processador pode acessar simultaneamente a memria de programa e a memria de dados) e do seu conjunto reduzido de instrues, RISC, com recursos de programao por memria flash, EEPROM e OTP (One Time
Programmable dispositivos dotados de memria PROM capazes de ser programados uma
nica vez). Os uCs da famlia PICxxFxxx podem ser regravados (memrias flash e EEPROM), ao
passo que a famlia PICxxCxxx no permite regravao (OTP). A letra F da sigla PICxxFxxx, a
propsito, faz referncia memria flash desses modelos. A tenso de alimentao desses
dispositivos varia entre 1,8 e 6 V.

Figura 1.2. Microcontrolador PIC da empresa Microchip Technology Inc.

A famlia de microcontroladores PIC est disponvel em uma ampla gama de modelos


para melhor adaptar-se s exigncias de projetos especficos. Tais modelos diferenciam-se, em
geral, pelo nmero de linhas de I/Os e pelo contedo do dispositivo. Portanto, de fundamental importncia um estudo prvio acerca dos microcontroladores, para que se possa determinar aquele que melhor atende s necessidades de determinado projeto. erro de projeto superdimensionar o uC. No caso de uma linha de produo, cada desperdcio ser multiplicado
pelo nmero de equipamentos fabricados (s vezes milhes). Tendo isso em vista, atualmente
existem duas linhas de pesquisas paralelas, porm opostas, no setor: uma delas criando uCs
mais capazes, a fim de atender produtos de alta tecnologia como os novos celulares ou os receptores de TV digital, e a outra projetando uCs mais simples e baratos, para aplicaes elementares.
A tabela abaixo apresenta as principais famlias de microcontroladores PIC, bem como
suas capacidades em termos de memria de programa e tambm suas respectivas pinagens.
Tabela 1.1. Famlia de microcontroladores PIC

Modelo
Memria de Programa
Pinagem
PIC10
12-bit palavra de programa
De 6 a 14 pinos
PIC12
12-bit palavra de programa
8 pinos
PIC16 14-bit palavra de programa (at 8kB de memria de programa) De 8 a 64 pinos
PIC18
128kB de memria de programa
De 18 a 100 pinos
Caractersticas mais detalhadas acerca de cada microcontrolador podem ser encontradas em seus respectivos datasheets (folhas de dados). A subseo seguinte toma o datasheet
dos modelos 16F87X da famlia PIC como exemplo, e apresenta algumas funcionalidades interessantes do microcontrolador PIC 16F876, que ser o dispositivo trabalhado durante as aulas.
Expostas as principais caractersticas dessa famlia de microcontroladores, importante que se justifique o porqu da escolha do PIC como ferramenta de estudo neste curso. Afinal,
3|P gin a

Captulo 1 - Arquitetura de microcontroladores


temos inmeras empresas fabricantes de microcontroladores, e modelos com as mais diversas
caractersticas. O que acontece, de fato, que os microcontroladores PIC so extremamente
didticos, tendo em vista a grande quantidade de informaes acerca dessa famlia de uCs que
se encontra disponvel tanto na literatura quanto na rede. Essa quantidade vasta de material
desperta o interesse e facilita bastante o processo de aprendizado. Convm observar, no entanto, que esta famlia de microcontroladores indicada para aplicaes mais simples, que
no necessitem de grande volume de dados manipulados ou de processamento em tempo real
de alta performance.

1.3.

PIC16F87X Caractersticas

Conforme mencionado anteriormente, o datasheet utilizado refere-se aos microcontroladores PIC 16F87X, incluindo os modelos 16F873, 16F874, 16F876 e 16F877. Portanto, antes de serem expostas as caractersticas especficas do modelo 16F876, a tabela abaixo, extrada da pgina 3 do datasheet (em anexo), traz uma comparao entre cada um dos modelos
acima citados.

Figura 1.3. Tabela comparativa entre os modelos PIC 16F876X

Como pode ser observado, os quatro modelos apresentam a mesma faixa de freqncia de operao, variando de 0Hz (DC) a 20MHz. Os dispositivos tambm apresentam uma
memria flash de programa, cujas palavras de programa so de 14 bits. Nesse caso, o que varia a capacidade de cada uC, j que a memria de programa dos dispositivos 16F873 e
16F874 de 4kB, ao passo que nos outros dois modelos a memria de 8kB. Cada um dos
microcontroladores apresenta duas memrias de dados com capacidades de armazenamento
distintas. A menor delas uma memria EEPROM e a maior uma memria de dados voltil.
O nmero de timers e de mdulos PWM o mesmo para todos os uCs, assim como o conjunto
de instrues, um conjunto RISC de 35 instrues. Nas demais caractersticas, em geral, os
modelos 16F874 e 16F877 levam vantagem.
1.3.1. PIC16F876 Algumas funes caractersticas de microcontroladores
Fora as caractersticas deste modelo de uC j vistas na tabela anterior, interessante
que algumas caractersticas especficas sejam citadas e detalhadas, umas vez que so importantes em um estudo inicial sobre microcontroladores. Vale observar que as caractersticas
4|P gin a

Captulo 1 - Arquitetura de microcontroladores


que sero mostradas no so exclusivas do modelo 16F876, mas esse foi o uC escolhido pelo
fato de ser o dispositivo a ser trabalhado durante as aulas do curso.
Seguem, portanto, algumas dessas caractersticas:
Cerca de 1000 ciclos de programao: apesar de possuir uma memria do tipo
flash como memria de programa, o nmero de reprogramaes deste modelo de PIC fica limitado em cerca de 1000 ciclos. Tendo em vista as aplicaes
usuais dos microcontroladores, essa limitao no de grande significncia;
Cerca de 10.000.000 de ciclos de escrita na memria EEPROM de dados;
Reteno de dados na memria EEPROM superior a 40 anos;
Watchdog Timer (WDT): o watchdog um mecanismo que o microcontrolador
usa para se defender contra possveis bloqueios do programa. Como qualquer circuito eletrnico, os microcontroladores tambm podem apresentar
uma falha ou um percalo em seu funcionamento, seja um bug no prprio cdigo do programa, uma condio ambiental que exceda os limites de operao
do uC ou uma instabilidade na alimentao do circuito. O fato que, quando
isso acontece, o microcontrolador pra de trabalhar e mantm-se nesse estado at que algum faa o reset. Por esse motivo introduziu-se o mecanismo de
watchdog (co de guarda). O temporizador WDT opera com um sinal de clock
independente do sinal de clock do micro ou de qualquer componente externo.
Depois de um certo perodo de tempo, o watchdog faz o reset do uC. Na verdade, o que realmente ocorre, o que o microcontrolador reseta-se automaticamente. O princpio de funcionamento do watchdog timer bastante simples: se o temporizador WDT transbordar, feito o reset do uC e este comea
a executar o programa desde o incio. A partir disso, observa-se que o reset
pode ocorrer tanto no caso de funcionamento incorreto, como no caso de funcionamento correto. Para que o micro no seja resetado em caso de funcionamento correto, o registro do WDT deve ser setado em 0 (instruo CLRWDT) sempre que estiver prximo de transbordar. Caso ocorra o bloqueio
do programa, esse zero no ser escrito no registro, haver o transbordo do
temporizador WDT, e o micro ser resetado, passando a executar o programa
desde o comeo;
Proteo de cdigo executvel: ativando esta funo, no mais possvel que
a memria do uC seja lida, evitando a duplicao do cdigo em outro microcontrolador;
Modo SLEEP ou modo de espera: modo de consumo reduzido de energia. No
caso do PIC16F876, a corrente de standby de aproximadamente 1A;
Brown-out Reset: quando a tenso de alimentao desce lentamente, tpico
de sistemas alimentados bateria, a eletrnica interna do uC gradualmente
pra o seu funcionamento, e o reset por brown-out acontece. Nesse caso, antes de o microcontrolador parar a execuo do programa, h um grave perigo
de que circuitos que trabalham a uma tenso superior comecem a trabalhar de
forma descontrolada. Esta problemtica tambm pode causar alteraes fatais
no programa em si, pois este est gravado na memria flash;
Baixo consumo: 0,6mA a 3V e 4MHz 20A a 3V e 32kHz.
1.3.2. PIC 16F876 Pinagem
A figura abaixo traz o esquema de pinos do microcontrolador em estudo, o modelo PIC
16F876. Em seguida, so especificadas as funes de cada um dos pinos de acordo com o datasheet do dispositivo.
5|P gin a

Captulo 1 - Arquitetura de microcontroladores

Figura 1.4. Esquema de pinos do microcontrolador PIC 16F876


Tabela 1.2. Relao pino

funo para o microcontrolador PIC 16F876

Pino
VDD (pino 20)
VSS (pino 8 ou pino 19)
Osc1 (pino 9), Osc2 (pino10)
MCLR
RA0 a RA5 (pinos 2 ao 7) PORTA A
RB0 a RB7 (pinos 21 ao 28) PORTA B
RC0 a RC7 (pinos 11 ao 18) PORTA C

Funo
Alimentao do microcontrolador (5V)
Referencial de tenso (0V terra)
Ligao do circuito oscilador responsvel pelo
clock do microcontrolador
Pino de reset - Ativado quando em nvel baixo
E/S bidirecional
E/S bidirecional
E/S bidirecional

No entanto, conforme mostra a lista abaixo, alguns pinos do microcontrolador no se


restringem a uma nica funo:
RA0 a RA3 (pinos 2 ao 5) e RA5 (pino 7): entradas analgicas;
RA2 (pino 4): referncia de tenso negativa analgica;
RA3 (pino 5): referncia de tenso positiva analgica;
RA4 (pino 6): entrada de clock para o TIMER 0;
RB0 (pino 21): pino de interrupo externa;
RB3 (pino 24): pino que sinaliza o modo LVP de programao, ou seja, programao
em baixa voltagem (Low Voltage Programming). Utilizando este modo de programao do uC,
a perda do pino 24 inevitvel, uma vez que ele deve ser usado exclusivamente para sinalizar
ao circuito programador o modo LVP. Por esse motivo, na maioria das vezes o modo de programao adotado o HVP (High Voltage Programming);
RB4 a RB7 (pinos 25 ao 28): Pinos de interrupo por mudana de nvel lgico;
RB6 (pino 27): entrada de clock da programao serial;
RB7 (pino 28): dados da programao serial;
RC0 (pino 11): entrada de clock para o TIMER 1/sada do circuito oscilador para o TIMER 1;
RC1 (pino 12): entrada do circuito oscilador para o TIMER 1/entrada do modo de captura do TIMER 1/sada do modo comparador do TIMER 1/sada de sinal PWM;
RC2 (pino 13): entrada do modo de captura do TIMER 1/sada do modo comparador
do TIMER 1/sada de sinal PWM;
RC3 (pino 14): sada para os modos SPI e IC de comunicao externa;
RC4 (pino 15): entrada para o modo SPI de comunicao/E/S para o modo IC;
RC5 (pino 16): sada para o modo SPI de comunicao externa.
6|P gin a

Captulo 1 - Arquitetura de microcontroladores

Maiores detalhes acerca das funes de cada um dos pinos do microcontrolador podem ser encontradas em seu datasheet, conforme ilustra a tabela abaixo retirada da folha de
dados referente aos modelos da famlia 16F87X.

Figura 1.5. Tabela contendo informaes acerca da pinagem do microcontrolador PIC 16F876

7|P gin a

Captulo 1 - Arquitetura de microcontroladores

1.4.

Algumas conexes importantes

Independentemente da aplicao que ser dada ao microcontrolador, do programa


que ser executado ou do ambiente onde ser inserido, algumas conexes sempre so realizadas.
Uma delas refere-se ao circuito responsvel pela gerao do sinal de clock do uC. Na
prtica, o clock um sinal de onda quadrada que serve para determinar a freqncia de operao do circuito, sincronizando seus diversos componentes. Est relacionado, portanto,
velocidade de operao do microcontrolador. A gerao do sinal de clock por meio de circuitos
osciladores pode ser feita de quatro maneiras distintas, dependendo do uso. A configurao
setada via software de programao (conforme mostrado na Figura 1.6) e aceita pelo uC
durante sua gravao. A freqncia mxima de operao do microcontrolador deve ser escolhida de acordo com as funes que ele ir executar. Na grande maioria dos projetos, uma
freqncia de operao de 4MHz suficiente.

Figura 1.6. Configurao da freqncia de operao do microcontrolador atravs da ferramenta de projeto PICWizard do software PCW

A Figura 1.7 abaixo traz os possveis modos de gerao do sinal de clock do microcontrolador.
Dentre as principais caractersticas do circuito oscilador RC, esquematizado na Figura
1.7(a), podem ser destacadas:
Circuito mais simples e mais barato de ser implementado, quando comparado
a outros tipos de osciladores;
Utilizao de um nico pino para conexo (pino 9 OSC1);
Oscilador com pouca preciso de clock e com baixa estabilidade;
Deve ser considerado em aplicaes onde o tempo no um fator muito importante e a economia o objetivo principal;
A freqncia de oscilao baixa, inferior a 700kHz, e depende dos valores de
,
,
, temperatura e tolerncia.

8|P gin a

Captulo 1 - Arquitetura de microcontroladores

VCC

Circuito oscilador RC

Cext

10

C1

OSC1

XTAL
OSC2

10

PIC16F876/873

Rext

PIC16F876/873

Circuito oscilador por cristais ou


ressonadores cermicos

C2
(a)

5k
Cext

Rext 100k
20 pF

(b)

OSC1
Sinal de Clock
Externo
(c)

10

PIC16F876/873

Circuito externo de
gerao de clock

Figura 1.7. Circuitos osciladores e gerao externa de clock

Alm dessa configurao externa apresentada para o oscilador RC, tambm existe a
possibilidade de configurar o oscilador RC interno do microcontrolador. Assim como a configurao externa, a preciso e a estabilidade do sinal de clock gerado por esse circuito no boa.
Embora a imunidade a rudos e a economia de pinos seja uma vantagem do oscilador interno,
a calibrao desse circuito no confivel e, dessa forma, na maioria das vezes opta-se pelo
uso de um oscilador externo, j que as rotinas de comunicao serial so muito afetadas pela
impreciso do clock. (Fbio Pereira Microcontroladores PIC Programao em C 7 Edio).
J os circuitos osciladores que fazem uso de cristais ou ressonadores cermicos, representados pela Figura 1.7(b), podem ser divididos em trs tipos bsicos: LP (Low Power), XT
(XTAL) e HS (High Speed). A tabela abaixo mostra os valores tpicos adotados para circuitos
osciladores que utilizam cristais ou ressonadores.
Tabela 1.3. Valores recomendados para o circuito oscilador

Circuito
XT
XT
XT
HS
HS
LP
LP
XT
XT
XT

Freqncia (componente)
455kHz (ressonador)
2MHz (ressonador)
4MHz (ressonador)
8MHz (ressonador)
10MHz (ressonador)
32kHz (cristal)
200kHz (cristal)
100kHz (cristal)
2MHz (cristal)
4MHz (cristal)

Capacitor
47-100pF
15-33pF
15-33pF
15-33pF
15-33pF
68-100pF
15-33pF
100-150pF
15-33pF
15-33pF
9|P gin a

Captulo 1 - Arquitetura de microcontroladores


HS
HS

4MHz (cristal)
10MHz (cristal)

15-33pF
15-33pF

Esses osciladores possuem alta preciso e estabilidade e, por isso, custo elevado quando comparado a osciladores do tipo RC. A freqncia de oscilao, como mostra a tabela acima, alta e menos sensvel a variaes externas.
No caso da configurao LP, so necessrios um cristal oscilador de baixa freqncia
(32kHz a 200kHz) e dois capacitores cujos valores so especificados na tabela acima. Essa configurao normalmente empregada em aplicaes que exigem baixa velocidade de processamento e baixo consumo de energia, tendo em vista que utiliza cristais de baixa potncia.
O modo XT o mais usado. Sua implementao pode ser feita atravs de um cristal
oscilador ou de um ressonador cermico. O cristal apresenta uma preciso superior, e menor
sensibilidade a fatores externos, no entanto necessita de dois capacitores conectados a ele. J
no caso do ressonador cermico, a preciso menor, mas os dois capacitores so dispensados
(embutidos no ressonador) e, dessa forma, o custo menor. Durante este curso, a configurao que iremos adotar a XT, fazendo uso de um cristal oscilador de quartzo de 4MHz e dois
capacitores de 22pF cada (indo ao encontro dos dados fornecidos pela Tabela 1.3).
Freqncias de oscilao acima de 4MHz (alta velocidade de processamento) exigem a
configurao HS. Ela pode ser implementada com um cristal oscilador ou com um ressonador
cermico. Esse o modo de maior consumo de energia.
Alm disso, ainda existe a opo de um circuito que gere o clock do uC externamente,
conforme ilustra a Figura 1.7(c). Este tipo de circuito pode ser feito a partir de portas lgicas,
transistores, geradores de onda quadrada, etc. Possui a desvantagem de utilizar muitos componentes e apresentar variaes de freqncia com a temperatura. Ainda assim, representa
uma boa opo quando se deseja sincronizar vrios microcontroladores alimentados pelo
mesmo sinal de clock. Optando por essa forma de gerao de clock, apenas um pino do uC
usado, o pino 9 (OSC1).
A partir dos circuitos osciladores expostos, verifica-se que a escolha de um deles depende da aplicao em questo. No entanto, os fatores normalmente avaliados so a velocidade de processamento, o consumo de energia, a estabilidade a fatores externos, o uso de
pinos (portas) e o custo dos componentes.
Outra conexo que sempre realizaremos refere-se ao pino de reset do uC. Todo PIC
possui um pino de reset. No caso do modelo 16F876, este o pino 1, MCLR. Ele deve ser ligado
ao terminal positivo da fonte (
) atravs de uma resistncia, e sua funo inicializar o microcontrolador a partir da posio zero de memria sempre que conectado referncia da
alimentao ( ). A conexo entre o pino MCLR e o terminal
deve ser feita atravs de
uma resistncia, cuja funo conservar a tenso do pino em nvel lgico alto. O valor dessa
resistncia deve estar entre 5 e 10k.
O pino MCLR representa, portanto, uma possibilidade de resetar o microcontrolador
manualmente.

10 | P g i n a

Captulo 1 - Arquitetura de microcontroladores

VCC

R 10k
MCLR

PIC16F876/873

5k

Figura 1.8. Configurao do pino MCLR

Fora isso, tem-se tambm a alimentao do circuito, ou seja,


no pino 8 ou 19.
A figura abaixo resume essas conexes bsicas vistas at aqui.

no pino 20 e

5V

5k

R 10k

22 pF

4MHz

5V

22 pF
Figura 1.9. Esquema de conexes bsicas do microcontrolador PIC 16F876

NOTA: Recomenda-se que todos os dispositivos previstos pelo software que utilizam pinos de
E/S do microcontrolador sejam conectados. Caso contrrio, o sistema poder no funcionar
corretamente.
Exemplo: Display LCD

11 | P g i n a

Captulo 2 - Fundamentos de Linguagem C

2.

Como programar um microcontrolador

Para programar um microcontrolador, ou seja, informar ao micro quais as funes


que devem ser executadas por ele, faz-se uso de um compilador. O compilador corresponde a
um software (ou um conjunto de softwares) que traduz o cdigo fonte escrito pelo programador (normalmente desenvolvido em uma linguagem com alto nvel de abstrao) para uma
linguagem de mais baixo nvel, capaz de ser compreendida pelos circuitos que compem o
sistema computacional em questo.
No caso dos microcontroladores PIC, o compilador CCS gera, a partir de um algoritmo
implementado em linguagem C ou Assembly, valores hexadecimais (arquivo .hex) que sero
escritos na memria de programa do microcontrolador. A Figura 2.1 ilustra, na forma de um
diagrama simplificado, o processo de programao do uC.
Cdigo Fonte em C
ou Assembly

Arquivo .hex

Editor de Texto

Compilador
ou
Assembler

Cdigo em
linguagem
de mquina

Figura 2.1. Diagrama simplificado representando o processo de programao do uC

2.1.

Linguagem C x Assembly

Conforme mencionado na seo anterior, a programao dos microcontroladores PIC


pode ser feita tanto atravs da linguagem C de programao como atravs da linguagem Assembly. A principal diferena entre essas duas linguagens de programao est na forma como
o arquivo .hex gerado, de tal forma que a compilao (processo de gerao do arquivo .hex
para a linguagem C) mostra-se um processo mais complexo do que a montagem (processo de
gerao do arquivo .hex na linguagem Assembly).
Entretanto, como o programador no participa desse processo de gerao do arquivo
hexadecimal, comumente opta-se pela programao em linguagem C que, por ser uma linguagem com maior nvel de abstrao, agrega inmeras facilidades ao usurio, conforme mencionado a seguir:
A linguagem C permite uma programao mais fcil e amigvel ao usurio, caracterstica das linguagens de alto nvel. Isso bastante importante na hora de
implementarmos alguma rotina mais complexa no uC;
A linguagem C permite maior portabilidade, uma vez que um mesmo programa pode ser recompilado para um uC diferente com o mnimo de alteraes,
ao contrrio da linguagem Assembly, onde as instrues diferem muito entre
os diversos tipos de microcontroladores;
possvel incluir, de forma simples e padronizada, outro arquivo em C (biblioteca) para ser utilizado como parte do seu programa principal, como, por e12 | P g i n a

Captulo 2 - Fundamentos de Linguagem C


xemplo, a incluso da biblioteca necessria para o interfaceamento entre o uC
e o display LCD.
Entre as desvantagens da linguagem C, destacam-se:
O cdigo gerado atravs da compilao , na maioria das vezes, maior do que
o cdigo gerado por um montador (assembler), ocupando mais espao tanto
na memria de programa como na memria de dados. No entanto, considerando aplicaes que no envolvem um alto nvel de complexidade, a linguagem C ainda mostra-se mais apropriada, tendo em vista que tanto a memria
de programa como a memria de dados possuem espao suficiente;
Outra desvantagem reside no fato que, programando em C, o programador
no forado a conhecer as caractersticas referentes ao hardware do uC, j
que o mesmo acostuma-se a trabalhar em alto nvel. Isso, muitas vezes, compromete a eficincia do programa e tambm o uso da capacidade de todos os
perifricos internos ao micro, podendo, dessa forma, representar um aumento
nos custos do sistema embarcado.
Em funo das vantagens verificadas no uso da linguagem C para programar microcontroladores, essa ser a linguagem trabalhada dentro deste curso, uma vez que todos os exemplos apresentados sero implementados em C.

2.2.

Metodologia de programao

Em geral, na hora de programar um microcontrolador costuma-se seguir algumas etapas tpicas, com o objetivo de facilitar a organizao e a documentao do projeto. Essas etapas so mostradas no fluxograma que segue.
ETAPA 1: EXPOSIO DO PROBLEMA

O programador deve descrever detalhadamente o problema a ser resolvido pelo programa.


ETAPA 2: ANLISE DA SOLUO

O programador deve elaborar as solues que melhor resolvem o problema.


ETAPA 3: CODIFICAO DA SOLUO

O programador deve elaborar uma descrio seqencial, passo a passo, da soluo escolhida. Assim, tem-se
um algoritmo ou fluxograma.
ETAPA 4: TRADUO DO CDIGO

Atravs do algoritmo ou fluxograma elaborado, o programador deve traduzir a soluo escolhida para a
linguagem de trabalho adotada (C ou Assembly, neste caso).
ETAPA 5: DEPURAO

Compilar o programa e, caso ocorram erros, corrigir os problemas. Para programas maiores, deve-se fazer a
depurao em cada fragmento do cdigo.
ETAPA 6: SIMULAO

O programa gerado pelo compilador deve ser simulado atravs de um software que contenha o modelo do uC
em estudo.
ETAPA 7: GRAVAO

Aps a realizao de todos os testes de simulao, o arquivo .hex pode ser gravado no uC (dispositivo fsico).

13 | P g i n a

Captulo 2 - Fundamentos de Linguagem C

2.3.

Fundamentos de linguagem C de programao

O objetivo desta seo apresentar alguns aspectos bsicos referentes linguagem C


de programao, focando a sua utilizao na programao dos microcontroladores PIC, baseada nos compiladores CCS. Uma vez que o assunto em questo bastante amplo, e um estudo
detalhado do mesmo exigiria uma dedicao exclusiva, aqui sero apresentadas apenas aquelas ferramentas vistas como necessrias para que o programador iniciante tenha a capacidade
de comear a desenvolver seus prprios projetos. Alm disso, alguns aspectos mais especficos
relacionados a essa linguagem de programao sero trabalhados ao longo da resoluo dos
exemplos propostos.
2.3.1. Declarao de variveis
A linguagem C disponibiliza ao programador uma gama imensa de tipos de dados,
principalmente em funo do uso de modificadores, ou seja, palavras que alteram o tamanho
do conjunto de valores dos tipos bsicos de dados da linguagem.
O compilador CCS possibilita o uso de quase todos os tipos de dados disponveis no
padro ANSI C, conforme mostra a Tabela 2.1.
Tabela 2.1. Todos os tipos de dados disponveis por padro no compilador CCS

Tipo
short int, int1, boolean
char
signed char
unsigned char
int, int8, byte
signed int, signed byte
unsigned int, unsigned byte
long int, int16
signed long int
unsigned long int
int32
signed int32
unsigned int32
float

Tamanho em
bits
1
8
8
8
8
8
8
16
16
16
32
32
32
32

Faixa de valores
0 ou 1
0 a 255
-128 a 127
0 a 255
0 a 255
-128 a 127
0 a 255
0 a 65.535
-32.768 a 32.767
0 a 65.535
0 a 4.294.967.295
-2.147.483.648 a 2.147.483.648
0 a 4.294.967.295
1,18-38 a 3,438

O padro ANSI C prev, ainda, o tipo double, que consiste em uma verso com capacidade
de representao dobrada (64 bits) em relao ao tipo float. O compilador CCS no suporta
esse tipo de dado, no entanto, a palavra double continua entre as palavras reservadas da
linguagem.
Uma varivel em C, portanto, pode ser declarada como sendo de qualquer um dos
tipos especificados na Tabela 2.1, tal que sua declarao feita conforme sintaxe abaixo:
[tipo de dado] [nome da varivel];
Como exemplo de declarao de variveis, tem-se:

14 | P g i n a

Captulo 2 - Fundamentos de Linguagem C


int var; //Declara a varivel var do tipo int
Alm disso, possvel tambm declarar uma matriz de valores utilizando [], conforme
mostra o exemplo abaixo. Uma varivel declarada desta forma conhecida como vetor.
int var[10]; /*Declara o vetor var com 10 espaos de 8
bits cada*/
2.3.2. Declaraes de controle
As declaraes ou comandos de controle so uma parte muito importante de uma
linguagem de programao, e a linguagem C dispe de um excelente conjunto de comandos.
As declaraes de controle podem ser classificadas em duas categorias bsicas:
Declaraes de teste condicional: so utilizadas para testar determinadas
condies/variveis e executar um cdigo para cada caso. A linguagem C, por
sua vez, dispe de dois tipos de declaraes condicionais: o comando if e o
comando switch;
Declaraes de estrutura de repetio: so utilizadas para provocar a execuo de um bloco de comandos enquanto uma determinada condio for verdadeira. Em C, dispe-se de trs declaraes de repetio: for, while e dowhile .
2.3.2.1. Comando if
De um modo geral, o comando if 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 comandoB;}
A clusula else opcional, no sendo obrigatria para o funcionamento do comando.
2.3.2.2. Comando switch
Em alguns casos, como na comparao de uma determinada varivel a diversos valores
diferentes, o comando if pode se tornar um pouco confuso ou pouco eficiente.
Nesse caso, prefervel fazer uso da declarao switch, que permite a realizao de
comparaes sucessivas de uma forma muito mais elegante, clara e eficiente quando comparada ao comando if.
O formato geral da declarao switch :
switch (varivel)
{
case constante1:
comandoA;
...
break;
case constante2:
15 | P g i n a

Captulo 2 - Fundamentos de Linguagem C


comandoB;
...
break;
...
...
default:
comandoZ;
...
}
O valor da varivel comparado com 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 da varivel no encontre correspondentes nas
constantes especificadas em cada uma das clusulas case, ento os comandos especificados
pela clusula default so executados.
Convm observar que cada seqncia 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,
finalizando o comando switch.
2.3.2.3. Lao for
O formato geral do lao for :
for (inicializao; condio; incremento) comando;
ou
for (inicializao; condio; incremento)
{
comando1;
comando2;
...
}
Cada uma das trs sees distintas do comando for possui uma funo distinta, tal
que:
Inicializao: esta seo conter uma expresso utilizada para inicializar a varivel de controle do lao for;
Condio: esta seo conter a condio a ser avaliada para decidir pela continuidade ou no do lao de repetio. ENQUANTO a condio for avaliada como verdadeira, o lao for permanecer em execuo;
Incremento: esta seo pode conter uma ou mais declaraes para incremento 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, em seguida a seo de incremento
executada e o lao repetido (voltando a avaliar a condio de teste).

16 | P g i n a

Captulo 2 - Fundamentos de Linguagem C


2.3.2.4. Lao while
A forma geral do comando while :
while (condio) comando;
Ou ainda:
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
bloco de comandos no executado e o programa tem seqncia a partir da declarao seguinte ao bloco while.
O funcionamento do comando do while bastante semelhante ao do comando
while, no entanto, no caso do comando do while o comando ou bloco de comandos
executado, no mnimo, uma vez, j que o mesmo aparece antes da avaliao da condio, conforme mostra a forma geral deste comando:
do comando while (condio);
ou
do
{
comandoA;
comandoB;
...
} while (condio);
2.3.3. Funes internas do compilador CCS
Alm dos comandos tidos como tradicionais dentro do padro ANSI C, como as declaraes de teste condicional e as declaraes de estrutura de repetio, de extrema importncia o conhecimento de algumas funes internas (especficas) do compilador CCS, uma vez
que essas funes facilitam e agilizam bastante a programao do microcontrolador.
Em anexo a esse documento, encontra-se uma tabela com as funes da linguagem C
internas do compilador CCS. Muitas dessas funes aparecero com bastante freqncia durante a realizao dos exemplos.

2.4.

Programa exemplo Pisca LED

Para comear a compreender a programao em linguagem C para microcontroladores


PIC, apresentado abaixo um programa simples cujo objetivo fazer piscar um LED a uma

17 | P g i n a

Captulo 2 - Fundamentos de Linguagem C


freqncia de
0,1seg).

(em um loop infinito, o LED fica aceso durante 0,1seg e apagado durante

//Programa Exemplo Pisca LED


#include <16F628.h>
#use delay(clock=4000000)
#fuses INTRC_IO, NOWDT, PUT, BROWNOUT, NOLVP, NOMCLR
main()
{
int tempo;
tempo=100;
while (true)
{
// Aqui vai o codigo
output_high(PIN_B0);
delay_ms(tempo);
output_low(PIN_B0);
delay_ms(tempo);
}
}
Na primeira linha do programa acima aparece:
//Programa Exemplo Pisca LED
Essa linha representa um comentrio. Os comentrios so descries inseridas no cdigo-fonte pelo programador com o intuito de documentar/organizar o programa. Os comentrios podem ser de linha simples, iniciados pelos caracteres //, ou de mltiplas linhas, que
utilizam a seqncia de caracteres /* para iniciar o comentrio e a seqncia */ para finalizar o comentrio. Dessa forma, qualquer texto escrito aps // ou entre /* */ no ser
traduzido pelo compilador.
A linha seguinte traz:
#include <16F628.h>
O comando #include uma diretiva do compilador. Neste caso, est determinando
ao compilador que anexe ao programa o arquivo especificado: 16F628.h.
Arquivos com a extenso h so chamados de arquivos de cabealho e so utilizados
em C para definir variveis, tipos, smbolos e funes teis ao programa (bibliotecas).
O 16F628.h um arquivo com as definies relativas ao processador-alvo, para o
qual o programa ser compilado. Podemos verificar que o processador para o qual o programa
foi escrito o PIC 16F628. Desejando modificar o processador-alvo, basta alterar esta linha do
programa.
Em seguida, tem-se:
18 | P g i n a

Captulo 2 - Fundamentos de Linguagem C

#use delay(clock=4000000)
A seqncia #use especifica uma diretiva interna do compilador. No caso, a diretiva
determina ao compilador que considere o valor de
ou
para a freqncia
de clock do uC. Esse valor utilizado para gerao dos cdigos de atraso e outras rotinas que
dependem de tempo.
Na linha seguinte, aparece:
#fuses INTRC_IO, NOWDT, PUT, BROWNOUT, NOLVP, NOMCLR
Esta uma diretiva que especifica o estado dos fusveis da palavra de configurao
do dispositivo (INTRC_IO, NOWDT, PUT, BROWNOUT, NOLVP, NOMCLR). No presente caso,
estamos selecionando pela ordem: oscilador de clock interno de 4MHz, com os pinos RA6 e
RA7 disponveis para E/S. No caso da famlia de microcontroladores PIC 16F62X, os pinos RA6 e
RA7 podem ser configurados para receber um sinal de clock externo (CLKIN e CLKOUT, respectivamente). Como, nesse caso, a gerao do clock interna, ento os pinos RA6 e RA7 podem
ser setados como pinos de E/S; Aps INTRC_IO, tem-se NOWDT, que indica o desligamento do
watchdog (no watchdog timer); Em seguida, na seqncia, timer power-up ligado, reset por
brown-out ligado, programao por baixa tenso desligada e MCLR interno (pino RA5 disponvel como entrada). Estas opes variam conforme o modelo de PIC utilizado.
A lista com os valores vlidos para a determinao do estado de cada fusvel pode ser
verificada a qualquer momentos no menu VIEW > Valid Fuses do compilador.
Na prxima linha do programa, tem-se:
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 de chave { utilizado para delimitar o incio da funo, e o sinal
de fechamento de chave } indica o fim da funo.
O primeiro comando, int tempo, corresponde a uma declarao de varivel. Este
comando determina que o compilador crie uma varivel do tipo inteiro int chamada tempo.
Atravs desta operao, reservado um espao de 8 bits na memria de programa destinado
varivel tempo. Uma vez que o tamanho da varivel criada de 8 bits, a varivel tempo s
poder assumir valores entre 0 e 255.
Em seguida, atravs do comando de atribuio tempo=100, a varivel tempo assume o valor 100 (observe que o valor da varivel est situado dentro da faixa de valores permitida).
A primeira linha do bloco de comandos da funo main() :
while(true)
Conforme j visto anteriormente, o while() um comando de controle utilizado na
repetio de um determinado bloco de instrues. Esse bloco ser repetido enquanto a avalia19 | P g i n a

Captulo 2 - Fundamentos de Linguagem C


o da condio especificada entre parnteses for verdadeira. No caso em questo, a avaliao explicitamente verdadeira (true) e, dessa forma, o programa nunca sair do bloco de
instrues. Esse artifcio de uso de uma condio que sempre verdadeira comumente usado no comando while() que inicia o programa a ser implementado no uC, uma vez que as
aplicaes normalmente requerem que o programa esteja sempre rodando.
A primeira instruo do comando while(), output_high(PIN_B0), uma chamada a uma funo interna do compilador.
Essa funo utilizada para setar (ou seja, colocar em nvel lgico 1 5V) um pino do
microcontrolador. Nesse caso, o pino RB0 (da porta B) que ser setado.
importante notar que PIN_B0 um smbolo predefinido para especificar o pino
RB0. Esse smbolo est localizado no arquivo de cabealho do processador utilizado (para o
caso em questo, o arquivo 16F628.h).
A prxima funo a ser executada :
delay_ms(tempo)
Essa tambm uma funo interna do compilador, e utilizada para gerar um atraso
de tempo milissegundos, ou seja, o uC ficar apenas contando, at que o valor da contagem atinja tempo. Portanto, para esse caso, o atraso ser de 100ms, j que tempo=100ms.
O comando seguinte, output_low(PIN_B0), tambm uma funo interna do
compilador, e utilizada para resetar (ou seja, colocar em nvel lgico 0 0V) um pino qualquer do micro, nesse caso, o pino RB0 (PIN_B0).
O ltimo comando, delay_ms(tempo), ir gerar, novamente, um atraso de 100ms
no sistema.

20 | P g i n a

Captulo 3 - Softwares

3.

Softwares

No presente curso de microcontroladores PIC utilizaremos dois softwares:


ISIS 7 Professional 7.7 SP2 (Labcenter Electronics);
PCWH Compiler (CCS Custom Computer Services).
O PCWH um compilador que possui bibliotecas prprias para serem utilizadas com a
grande maioria dos PICs disponveis no mercado. O ISIS um simulador de circuitos, com suporte a utilizao de microcontroladores da Microchip e da Atmel.
Nas sees subseqentes veremos estes dois softwares com algum detalhe.

3.1

PCWH Compiler

O CCS C o software onde escrevemos nosso cdigo em C/C++ que dever ser compilado para a utilizao no microcontrolador. Este mesmo cdigo ser utilizado para a simulao
no ISIS.
Vamos ver agora as principais funcionalidades deste software.
3.1.1 PIC Wizard
O PIC Wizard a maneira mais prtica de iniciar um novo projeto. Nele, atravs de
uma interface grfica, possvel escolher o dispositivo, a freqncia de oscilao, se haver
algum tipo de comunicao, as portas que sero utilizadas, timers, etc. uma excelente ferramenta para aqueles que esto comeando a trabalhar com PIC, pois ele gera automaticamente
o cdigo com os parmetros j definidos.
O cone do PIC Wizard fica na aba Project:

Figura 3.1. cone do PIC Wizard

A tela inicial do PIC Wizard a seguinte:

21 | P g i n a

Captulo 3 - Softwares

Figura 3.2. Tela inicial do PIC Wizard

Nas partes destacadas em vermelho podemos escolher o dispositivo que ser utilizado,
a freqncia em que o dispositivo ir operar, e de que forma se dar essa freqncia. Como
mencionado, a principal utilidade do PIC Wizard que ele gera o cdigo baseado nos parmetros escolhidos.
esquerda temos um lista com diversas opes para configurao do PIC. Vamos agora descrever as mais importantes delas.
3.1.1.1 Communications
Em communications podemos habilitar a comunicao do PIC com outros microcontroladores, com um computador, memrias externas, e etc. Os dois tipos de comunicao disponveis so RS-232 (Serial), e a comunicao I2C.
3.1.1.2 SPI e LCD
Aqui ficam as configuraes para o protocolo de comunicao SPI, e algumas configuraes para o LCD. Esses tpicos sero abordados em captulos subseqentes.
3.1.1.3 Timers
Em timers possvel configurar os timers 0 (RTCC), 1 e 2. Outra configurao disponvel
a do timer WTD (WatchDog). Um WatchDog Timer um dispositivo eletrnico temporizador
que dispara um reset ao sistema se o programa principal, devido a alguma condio de erro,
deixar de fazer reset no WatchDog timer.
22 | P g i n a

Captulo 3 - Softwares
3.1.1.4 Analog
Em analog possvel escolher quais portas do PIC sero disponibilizadas para a converso A/D. Alm disso, escolhe-se a resoluo do conversor e a freqncia de operao deste.
3.1.1.5 Interrupts
Em interrupts habilita-se as interrupes desejadas, entre elas, RTCC, interrupes
externas, converso A/D, Timer 1, Timer 2, coliso no barramento, etc.
3.1.1.6 Drivers
Em drivers adiciona-se elementos que sero utilizados no projeto. Uma das vantagens
de adicionar um driver por aqui, que o programa j inclui as bibliotecas necessrias para sua
utilizao. Existem opes como LCD driver, memrias EEPROM, teclado 3x4, drivers de dispositivos com tecnologia touch, e etc.
3.1.1.7 I/O Pins
Conforme so habilitadas as configuraes para o programa, como por exemplo, portas para converso A/D, drivers, comunicaes de protocolos diversos, so mostradas nesta
aba as portas que so reservadas para essas determinadas configuraes. possvel ainda,
configurar manualmente essas portas para entrada, sada, entrada/sada, analgica ou sem
uso.
NOTA: importante conhecer o recurso PICWizard, principalmente para aqueles que so iniciantes na utilizao dos microcontroladores PIC. Mas necessrio, tambm, que se saiba configurar todos os elementos por meio do programa em C.
3.1.2 Compilador
Depois de finalizado o cdigo, podemos compilar o programa utilizando-se a tecla F9.
Os arquivos que sero gerados na compilao, sero armazenados na mesma pasta que foi
escolhida para o arquivo .pjt. So gerados diversos arquivos de sada, o mais importante dele
o arquivo .hex. Utilizaremos esse arquivos na simulao dos nossos programas no ISIS Proteus.
O compilador do PCWH ainda conta com um debugger, que utilizado para encontrar
erros no programa.
3.1.3 Funes do compilador CCS
Veremos agora funes que o compilador CCS disponibiliza, e que podem auxiliar no
desenvolvimento de programas.
3.1.3.1 OUTPUT_LOW()
Essa funo coloca o pino especificado do microcontrolador em nvel lgico baixo (0).
Sintaxe:
output_low(pino)

23 | P g i n a

Captulo 3 - Softwares
3.1.3.2 OUTPUT_HIGH()
Essa funo coloca o pino especificado do microcontrolador em nvel lgico alto (1).
Sintaxe:
output_high(pino)
3.1.3.3 INPUT()
L o estado lgico de um pino microcontrolador.
Sintaxe:
res = input(pino)
Nesse caso, o nvel lgico do pino especificado ser armazenado na varivel res.
3.1.3.4 OUTPUT_X()
Escreve um byte completo em uma determinada porta do microcontrolador.
Sintaxe:
output_A(valor)
output_B(valor)
output_C(valor)
Nesse caso, valor uma varivel ou constante inteira de 8 bits.
3.1.3.5 INPUT_X()
L um byte completo de uma determinada porta do microcontrolador.
Sintaxe:
valor = input_A()
valor = input_B()
valor = input_C()
3.1.3.6 DELAY_US()
Aguarda n microssegundos.
Sintaxe:
delay_us(n)
n uma varivel inteira de 8 bits ou uma constante de 16 bits.
3.1.3.7 DELAY_MS()
Aguarda n milissegundos.
Sintaxe:
delay_ms(n)
24 | P g i n a

Captulo 3 - Softwares
n uma varivel inteira de 8 bits ou uma constante de 16 bits.
Para uma consulta mais completa acerca das funes disponveis no compilador CCS,
verifique o manual de instrues do mesmo.
3.1.4 Exemplos
Nos exemplo a seguir, vamos criar e configurar um projeto utilizando o PICWizard.
3.1.4.1 Exemplo 1
Criar um programa utilizando a linguagem C que faa um LED, conectado ao pino B0 do
microcontrolador, piscar na freqncia de 2Hz.
3.1.4.2 Exemplo 2
Criar um programa utilizando a linguagem C que faa contagem regressiva de 10 a 0 na
porta B (na base binria). Quando chegar ao valor 5, deve-se acender um LED no pino A0.
Quando a contagem chegar a 0, o LED deve piscar em 1Hz.

3.2

Proteus

No software ISIS Proteus pode-se simular o programa criado no PCWH. A tela inicial do
Proteus est mostrada na Figura 3.3.

Figura 3.3. Ambiente grfico do Proteus

Vamos utilizar o Proteus para montar um circuito simples para o funcionamento dos
exemplos criados na seo anterior. Na simulao no necessrio alimentar o MCU (
e
).
Para adicionar componentes, clique no cone Component Mode, e a seguir no cone
P, ambos marcados em vermelho na Figura 3.3. Uma caixa, intitulada Pick Devices, com os
componentes disponveis no programa ir aparecer, tal qual a ilustrada na Figura 3.4.
25 | P g i n a

Captulo 3 - Softwares

Figura 3.4. Caixa de escolha de dispositivos

Os componentes a serem adicionados no projeto podem ser achados manualmente,


ou digitando-se alguma palavra-chave na caixa Keywords.
Os componentes que iremos utilizar para simular o programa criado para o exemplo 1
da seo anterior so:
PIC16F876A;
Cristal oscilador de 4MHz;
2 capacitores de 22pF;
Resistor de 10k ;
LED.
O circuito deve ser montado conforme ilustrado na Figura 3.5.

26 | P g i n a

Captulo 3 - Softwares

Figura 3.5. Circuito do Exemplo 1

Para colocar o programa no microcontrolador, clique duas vezes no componente. A


caixa intitulada Edit Component ilustrada na Figura 3.6 ir aparecer. Em Program File, clique no cone de uma pasta. Encontre o arquivo gerado pelo compilador CCS, no formato .hex.
Esse arquivo ser utilizado pelo Proteus para simular o programa criado no CCS.

Figura 3.6. Caixa de edio do componente

Feito isso, basta clicar no cone de Play, no canta inferior esquerdo da tela.
3.2.1 Atividade Prtica
Como atividade prtica deste captulo, simular no Proteus o programa criado para o
Exemplo 2.

27 | P g i n a

Captulo 4 Display LCD

4.

LCD (Liquid Crystal Display)

Recentemente, um grande nmero de projetos usando mdulos de displays de cristal


lquido tem sido desenvolvido. Sua capacidade de mostrar no apenas nmeros, como tambm letras, e todo tipo de smbolos, o torna muito mais verstil que o display de 7 segmentos.
Estes mdulos podem ser grficos ou alfanumricos.

(a)
(b)
Figura 4.1. LCD alfanumrico (a) e grfico (b)

Neste curso, daremos ateno apenas aos LCDs alfanumricos.

4.1.

Pinagem do mdulo LCD

A pinagem dos mdulos LCD depende muito do fabricante de cada um. muito importante que o datasheet do dispositivo seja consultado antes de realizar as conexes. Como exemplo, utilizaremos o display da marca AZ Displays, modelo ACM1602B.
Datasheet: http://reocities.com/capecanaveral/6744/a_04_03.pdf
Consultando o datasheet deste dispositivo encontramos a seguinte disposio de pinagem:

Figura 4.2. Pinagem do LCD ACM1602B

Abaixo, apresentamos a relao de pinos do LCD, e a funo que cada um desses pinos
desempenha no funcionamento do mdulo.

28 | P g i n a

Captulo 4 Display LCD


Tabela 4.1. Relao pino

Nro. Pino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
+
-

4.2.

Smbolo
Vss
Vdd
Vo
RS
R/W
E
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
BLBL+

funo no LCD

Funo
Terra
+5V
Ajuste do contraste do LCD
Seleo do registrador
Leitura/Escrita
Habilitado
Bit de dados 0
Bit de dados 1
Bit de dados 2
Bit de dados 3
Bit de dados 4
Bit de dados 5
Bit de dados 6
Bit de dados 7
Alimentao do Backlight Alimentao do Backlight +

Conectando o LCD ao microcontrolador

Em geral, os displays LCD possuem 8 pinos para a comunicao de dados, entretanto,


comum fazer uso de apenas 4, dividindo os bytes em 2 nibbles enviados em srie. Desta forma,
economizam-se pinos do microcontrolador.
Ao habilitarmos o mdulo LCD utilizando-se o PICWizard, o compilador, por default,
reserva os pinos B0, B1, B2, B4, B5, B6 e B7, para a comunicao LCD-microcontrolador. A tabela abaixo mostra a relao entre os pinos de cada um dos dispositivos.
Tabela 4.2. Conexo entre os pinos do uC PIC16F876A e do LCD

Pino no uC
PIC16F876A
B0
B1
B2
B4
B5
B6
B7

Pino no LCD
Enable (Pino 6)
RS (Pino 4)
R/W (Pino 5)
D4 (Pino 11)
D5 (Pino 12)
D6 (Pino 13)
D7 (Pino 14)

No software Proteus, a conexo do PIC com o LCD fica da seguinte forma:

29 | P g i n a

Captulo 4 Display LCD

Figura 4.3. Conexo do uC com o display LCD

4.3.

Utilizando o mdulo LCD

O mdulo LCD uma forma eficaz de exibir informaes que so processadas no microcontrolador. O compilador CCS possui um driver chamado LCD.C que permite a utilizao do
mdulo, e apresenta algumas funes especficas.
Ao utilizarmos o PICWizard, para inserir o driver do mdulo LCD, vemos, no incio do
cdigo gerado, o seguinte comando:

#include <LCD.C>
Esse comando diz ao compilador para inserir as funes que sero utilizadas para o
interfaceamento do LCD com o PIC. As funes disponveis para manipular o LCD so as seguintes:
LCD_PUTC()
Essa funo utilizada para mostrar um texto qualquer na tela do LCD. A sintaxe para
utilizao dessa funo :

lcd_putc(TEXTO)
PRINTF()
Essa funo utilizada para mostrar no display uma varivel do cdigo. A sintaxe para
utilizao dessa funo :

printf(lcd_putc, %d, varivel)


Alm dessas duas funes temos ainda os comandos:
/f limpa a tela do LCD;
30 | P g i n a

Captulo 4 Display LCD


/n nova linha.

4.4.

Atividade prtica

Nesta atividade, ser conectado um boto (push-button) junto a um pino do microcontrolador. Alm disso, deve-se conectar este boto a uma fonte de tenso cc de 5v a fim de que
haja nvel lgico 1, ou seja, 5V no pino do microcontrolador quando o boto for pressionado.
Quando o boto no estiver pressionado, deve haver nvel lgico zero no pino do microcontrolador, ou seja, como se estive conectado ao referencial terra.
Devem-se indicar no LCD quantas vezes o boto foi pressionado. Quando este valor
chegar a 5, acende-se um LED conectado a outro pino do microcontrolador e reinicia-se a contagem.
Alm disso, apresentar uma nota de abertura no LCD, com uma frase a escolha.

31 | P g i n a

Captulo 5 Converso A/D

5.

Converso A/D

A grande maioria das variveis fsicas com as quais temos que lidar so analgicas, ou
seja, podem assumir qualquer valor dentro de um espectro contnuo de valores. Geralmente,
so essas variveis que queremos monitorar, operar e controlar em um sistema. Exemplos de
quantidades analgicas so a temperatura, a presso, a posio, a velocidade e outros.
Sistemas digitais, como os microcontroladores, realizam todas as suas operaes internas usando circuitos e grandezas digitais. Qualquer informao que tenha de entrar em um
sistema digital precisa, primeiramente, ser digitalizada. A Erro! Fonte de referncia no encontrada. mostra o diagrama de blocos para um sistema de controle de temperatura, onde a
temperatura, quantidade analgica, medida, e seu valor ento transformado em uma
quantidade digital por um conversor analgico-digital (ADC).

A/D

Sistema Digital
(Por exemplo,
uC)

D/A

Figura 5.1. Diagrama de uma converso A/D e D/A

A varivel fsica a ser medida a temperatura.


1. O transdutor um dispositivo que converte uma varivel fsica em uma varivel eltrica. A sada de um transdutor uma corrente ou uma tenso proporcional ao valor da
varivel fsica que est sendo monitorada.
2. A sada analgica do transdutor, j em forma de varivel eltrica, colocada na entrada de um conversor A/D que converte a entrada analgica numa sada digital.
3. O sistema digital, nesse caso, um microcontrolador, utilizado para a informao ser
processada. Por exemplo, a temperatura pode ser mostrada em um display LCD, ou ainda, pode ser utilizada para que um atuador seja acionado.
4. A sada digital gerada pelo computador enviada ao conversor D/A, que a converte
para seu valor analgico de tenso ou corrente correspondente.

5.1.

Caractersticas do Conversor A/D

Vamos ver agora algumas caractersticas comuns aos conversores A/D, e sua influncia
no processo, relacionando estas caractersticas com o PIC16F876A.
5.1.1. Resoluo
A especificao mais importante de um conversor A/D a sua resoluo.

32 | P g i n a

Captulo 5 Converso A/D

A resoluo especifica o quo precisamente um conversor A/D mede


sinais analgicos de entrada.
Os conversores A/D mais comuns possuem resoluo de 8, 10 ou 12 bits.
EXEMPLO:
Com 8 bits, podemos representar
valores, ou seja, 256 valores. Se temos uma tenso de entrada no nosso ADC que varia de 0 a 5 V, ento, um ADC de 8 bits quebrar os 5V em
256 divises e poder medir com preciso 5/256 = 19 mV.
Se nosso ADC fosse de 10 bits, entretanto, os 5 V seriam quebrados em 1024 divises,
e poderiam medir com uma preciso de 5/1024 = 4,8 mV.
Podemos ver ento, que quanto maior a resoluo de um ADC, maior a sua preciso. O
modelo de PIC que trabalhamos neste curso possui um conversor A/D com resoluo de 10
bits.
5.1.2. Canais ADC
O mdulo ADC de um microcontrolador conectado vrios canais (channels) via multiplexador. O multiplexador pode conectar a entrada do ADC qualquer um dos canais disponveis. Isso significa que podemos entrar com mais de um sinal analgico no nosso microcontrolador. Por exemplo, podemos efetuar a converso A/D de trs transdutores diferentes.
O mdulo de converso A/D do PIC16F876A possui cinco canais.
Os canais so numerados de 0 a 4: AN0, AN1, AN2, AN3 e AN4.
5.1.3. Tempo de Aquisio
Quando um canal ADC selecionado, a tenso no canal de entrada armazenada em
um capacitor interno, chamado holding capacitor. O tempo que leva para esse capacitor ser
carregado com a tenso na entrada do canal ADC chamado de tempo de aquisio. O tempo
de aquisio depende de vrios fatores:
Impedncia da fonte;
do sistema;
Temperatura.
A impedncia mxima recomendada para fontes analgicas
. Neste caso extremo, o tempo de aquisio de
, para uma temperatura de 50C. Para impedncias
menores, o tempo de aquisio diminui.
Depois que uma entrada analgica selecionada, este tempo de aquisio deve ser
aguardado para que a converso possa ser efetuada.
5.1.4. Clock do ADC
O mdulo ADC requer um clock para realizar as converses, chamado ADC clock. O perodo de tempo do clock do ADC chamado
. Este tambm o tempo necessrio para que
um bit da converso A/D seja gerado. O conversor A/D requer
para que uma converso de 10 bits seja efetuada.
33 | P g i n a

Captulo 5 Converso A/D


O valor mnimo
encontrado no datasheet de cada dispositivo (A/D Conversion
Requirements). No caso do PIC16876A, esse valor de
. Esse valor deve ser o menor
possvel, garantindo a velocidade da converso, mas no deve ser menor que o valor mnimo
encontrado no datasheet. Esse valor pode ser derivado do clock da CPU, chamado
, dividindo-se por um fator de diviso adequado.

A fonte do clock do ADC selecionvel por software. Existem sete possibilidades:


;
;
;
;
;
;
RC interno.
EXEMPLO:
Digamos que nossa CPU est operando com um cristal oscilador externo de 20MHz.
Vamos escolher o prescaler de
Nossa freqncia de operao :

Logo, o perodo de operao :

Temos que:

de

Este valor satisfaz o nosso


mnimo.
Quando escolhemos como fonte do clock do ADC o RC interno, temos um valor tpico
, podendo variar de
.
Tabela 5.1.

Fonte do ADC Clock


Operao

20 MHz

VS Frequncias de Operao

Frequncia do Dispositivo
5 MHz
1.25 MHz

333.33 kHz

34 | P g i n a

Captulo 5 Converso A/D


A Tabela 5.1 relaciona valores de
com valores para a freqncia de operao do
dispositivo. As clulas destacadas em verde contm valores que no so aceitveis para
5.1.5. Tenso de Referncia
A tenso de referncia do ADC especifica o mnimo e o mximo valores de tenso de
uma entrada analgica. Em outras palavras, a tenso de referncia determina uma faixa de
valores possveis para a entrada analgica.
Podemos mudar a tenso de referncia para obtermos uma maior preciso na leitura
dos dados analgicos.
Existem duas tenses de referncia,
e
. O
especifica a menor tenso
de entrada analgica enquanto
especifica a maior tenso. A configurao default da
tenso de referncia quando
o
e
o
. Desta forma, se utilizarmos esta
configurao, no precisamos utilizar dois pinos extras do PIC, podendo deix-los disponveis
para outros propsitos.

Figura 5.2. Tenso de referncia

5.2.

Converso A/D no PIC16F876A

Vamos ver agora algumas caractersticas da converso A/D prprias do dispositivo que
estamos utilizando. Nesta seo vamos ver quais pinos do PIC16F876A so reservados para a
converso A/D, operao no modo sleep, efeito do reset na converso A/D e interrupes do
mdulo ADC.
Vimos, ento, que o mdulo de converso A/D do PIC16F876A possui cinco canais. A
converso de uma entrada analgica resulta em um nmero digital correspondente de 10 bits.
Os canais so numerados de 0 a 4: AN0, AN1, AN2, AN3 e AN4.

35 | P g i n a

Captulo 5 Converso A/D

Figura 5.3. Pinagem do PIC16F876A

Como vemos na Figura 5. esses canais correspondem aos pinos 2, 3, 4, 5 e 7. Qualquer


um destes pinos pode ser utilizado como entrada de um sinal analgico para que seja efetuada
a converso A/D.
A converso do valor analgico resulta em um nmero digital correspondente de 10
bits, que armazenado em um registrador especfico do microcontrolador.
5.2.1. Operao no modo sleep
A converso A/D tem a caracterstica de ser capaz de operar quando o MCU colocado
no modo sleep. Neste caso, o clock do ADC deve derivar do oscilador RC interno do microcontrolador.
Quando a converso finalizada, e a interrupo do mdulo ADC est habilitada, o
dispositivo retorna do modo sleep. Se a interrupo no estiver habilitada, o mdulo ADC
desligado, e os dados continuam disponveis para leitura.
Se a fonte do clock for outra opo que no a do RC interno, a instruo sleep far a
presente converso ser abortada e o mdulo ADC desligado.
5.2.2. Efeitos do reset
Um reset do dispositivo fora o mdulo ADC a ser desligado, e qualquer converso
abortada.

5.3.

Funes do Compilador CCS

O compilador CCS tem funes especficas para serem utilizadas na converso A/D.
Vamos ver estas funes em detalhe nesta seo.
5.3.1. SETUP_ADC()
Esta funo configura o conversor A/D interno do microcontrolador. Com esta funo
habilitamos o conversor A/D e determinamos o clock de converso.
A sintaxe para a utilizao desta funo :

setup_ADC(opes)

36 | P g i n a

Captulo 5 Converso A/D


As opes variam de acordo com o modelo de PIC utilizado e podem ser encontradas
no header file de cada dispositivo. Para o PIC16F876A temos as seguintes opes:
OPO
ADC_OFF
ADC_CLOCK_DIV_2
ADC_CLOCK_DIV_4
ADC_CLOCK_DIV_8
ADC_CLOCK_DIV_16
ADC_CLOCK_DIV_32
ADC_CLOCK_INTERNAL

FUNO
Desabilita o mdulo ADC.
Divide o clock externo por 2.
Divide o clock externo por 4.
Divide o clock externo por 8.
Divide o clock externo por 16.
Divide o clock externo por 32.
Utiliza como fonte do clock do ADC o RC interno.

5.3.2. SETUP_ADC_PORTS()
Esta funo configura as entradas analgicas do conversor A/D interno, alm de configurar os valores de referncia desejados para a converso A/D.
A sintaxe para utilizao desta funo :

setup_ADC_ports(opes)
As opes disponveis para o PIC16F876A so as seguintes:
OPO
NO_ANALOGS
ALL_ANALOG
AN0_AN1_AN3
AN0
AN0_AN1_AN2_AN4_VSS_VREF
AN0_AN1_VSS_VREF
AN0_AN1_AN4_VREF_VREF

FUNO
Desabilita todos os canais ADC.
Habilita todos os canais do mdulo ADC, 0, 1, 2, 3 e 4.
Habilita os canais 0, 1 e 3 do mdulo ADC.
Habilita apenas o canal 0 do mdulo ADC.
Habilita os canais 0, 1, 2 e 4 do mdulo ADC; determina como
o terra, e como
a tenso na porta AN3
Habilita os canais 0 e 1 do mdulo ADC; determina como
o terra, e como
a tenso na porta AN3
N0_AN1_AN4_VREF_VREF (Habilita os canais 0, 1 e 4 do mdulo ADC; determina como
a tenso na porta A2, e
como
a tenso na porta A3.

5.3.3. SET_ADC_CHANNEL()
Seleciona um canal do mdulo ADC para entrada de um sinal analgico.
A sintaxe para utilizao desta funo :

set_ADC_channel(valor)
Lembremos que aps a seleo de um canal do mdulo ADC necessrio que se aguarde o tempo de aquisio, antes de efetuar a converso A/D.
Em valor, colocamos o nmero do canal do qual ser efetuada a converso A/D.
5.3.4. READ_ADC()
Esta funo efetua a converso A/D.
A sintaxe para utilizao desta funo :
37 | P g i n a

Captulo 5 Converso A/D

valor = read_ADC(opes)
As opes disponveis no PIC16F876A so as seguintes:
OPO
ADC_START_AND_READ
ADC_START_ONLY
ADC_READ_ONLY

5.4.

FUNO
Este o padro quando nada especificado. Inicia a converso A/D e
realiza a leitura.
Apenas efetua a converso A/D.
Apenas efetua a leitura da converso A/D.

LM35 Sensor de Temperatura

Vamos utilizar como transdutor de temperatura, o circuito integrado LM35 Precision


Centigrade Temperature Sensor. O LM35 um circuito integrado sensor de temperatura, cuja
tenso de sada linearmente proporcional a escala Celsius de temperatura. Uma variao de
1C proporcional 10mV.

Fator de linearidade: 10 mV/C


O LM35 pode operar na faixa de temperatura de -55C at 150C.
A Erro! Fonte de referncia no encontrada. mostra duas aplicaes tpicas deste sensor, e como so feitas as conexes.

(a)

(b)

Figura 5.4. Aplicaes tpicas do sensor de temperatura LM35

Como vemos nas Figuras 5.4(a) e 5.4(b), o LM35 pode ser alimentado com uma fonte
(4V 20V), ou com fontes simtricas, conforme as conexes indicadas na figura acima.
No primeiro caso, a faixa de valores em que o sensor pode operar de 2C at 150C.
No segundo caso, a faixa de valores em que o sensor pode operar de -55C at
150C. A resistncia dada por:

A tenso de sada,

, apresenta os seguintes valores:

38 | P g i n a

Captulo 5 Converso A/D

5.5.

Aplicao Prtica

Vamos agora criar um termmetro simples, cuja leitura provm do sensor de temperatura LM35, e o valor obtido colocado em C em um LCD.
Utilizar no projeto um clock externo utilizando um cristal de 10MHz, e o pino AN0 para
fazer a converso A/D. Montar o circuito no Proteus como o mostrado na Figura 5.5.

Figura 5.5. Circuito no Proteus para projeto do termmetro digital

39 | P g i n a

Captulo 6 - Timers

6.

Timers

Timers so registradores que, assim como outros, possuem um nmero definido de


bits. Entretanto, o valor numrico do registrador do tipo timer incrementado de conta um
fator de diviso do clock chamado de preescaler.
A origem do clock do timer pode ser externa, com um oscilador independente, por exemplo, ou mesmo tomado como referncia ao clock do microcontrolador.
O registrador timer pode ter um valor inicial qualquer. Quando o timer atinge o seu valor mximo definido pelo nmero de bits afirma-se que o timer estourou (ocorre o overflow). Nesse momento, o valor do registrador se torna zero novamente e a contagem reinicia.

6.1.

Tempo de estouro

O tempo de estouro de um timer pode ser determinado pelos parmetros de configurao do microcontrolador. Suponha que o microcontrolador PIC possui um clock externo de
8MHz (cristal oscilador); o registrador do timer tem uma largura de 8 bits e opera com clock de
referncia igual ao clock da CPU; o prescaler igual a 2. Podemos determinar o tempo de estouro da seguinte forma:
O clock interno do PIC quatro vezes menor que o externo, ou seja, 2MHz. Foi utilizado
o preescaler de 2, ou seja, o clock de referncia do timer de 1MHz. O perodo deste clock de
1us. Como o timer0 um registrador de 8 bits, ento armazena de 0 a 255, ou seja, 256 valores. O tempo de estouro , portanto, 256 us.

Em que

6.2.

a largura do registrador do timer, em nmero de bits.

Interrupes

Uma interrupo uma funo que existe em microcontroladores que permite, atravs de um evento externo, causar um desvio na execuo do programa. Esse conceito extremamente importante no projeto de sistemas embarcados. Alguns dos eventos que podem
causar desvio na execuo do programa so:
Interrupo externa atravs do pino RB0/INT;
Escrita completada em memria externa EEPROM;
Final de converso analgica;
Recepo de dados pelo canal serial (RS232);
Final de envio de dados pelo canal serial (RS232);
Overflow do TIMER0.
Estamos interessados na interrupo do TIMER0 neste captulo. Ou seja, cada vez que
ocorrer um overflow no RTCC, uma funo chamada dentro do programa, desviando-se da
funo main. Nesta funo cabe ao programador, definir o que acontecer em cada interrupo. Veremos como utilizar as interrupes nas sees subseqentes.

40 | P g i n a

Captulo 6 - Timers

6.3.

Timers do PIC16F876A

O PIC16F876A possui trs registradores de Timer diferentes. Eles so nomeados TIMER0, TIMER1 e TIMER2.
6.3.1. TIMER0
O mdulo TIMER0 apresenta as seguintes caractersticas:
Registrador de 8 bits;
Escrita/Leitura;
Seleo de clock externo ou interno.
No TIMER0 o prescaler dividido com o Watchdog. Ou seja, o prescaler s pode ser
utilizado para um dos dois.
6.3.2. TIMER1
O mdulo TIMER1 um contador/temporizador de 16 bits. Isso significa que ele pode
operar nesses dois modos distintos.
6.3.3. TIMER2
O mdulo de TIMER2 um temporizador de 8 bits com um prescaler e um postscaler.
Ele pode ser utilizado como tempo de base para um PWM.
J vimos que o prescaler divide o clock do temporizador. J o postscaler divide a sada
de overflow do temporizador. Por exemplo, se o postscaler for 2, ser necessrio que o temporizador estoure duas vezes para indicar um overflow.

6.4.

Watchdog

O Watchdog (co de guarda), tambm conhecido como COP (Computer Operating


Properly), um circuito de vigilncia.
Ele consiste basicamente num temporizador que provoca o reset da CPU do microcontrolador aps um overflow deste temporizador. A principal finalidade deste temporizador
garantir que a CPU est funcionando e executando o programa adequadamente.
O princpio de funcionamento do COP bastante simples. Como existe um tempo para
que ocorra o estouro do temporizador de watchdog, o programador deve inserir uma funo
no programa que periodicamente reinicie a contagem deste temporizador. Desta forma, se o
programa estiver operando corretamente, tais instrues sero executadas periodicamente e
o co de guarda no ter tempo suficiente para resetar a CPU.
No entanto, se o programa vier a falhar por qualquer motivo, provavelmente a execuo da funo de reset do watchdog ser interrompida, permitindo que ele atinja o final de
sua contagem, resetando a CPU e fazendo com que o programa seja executado desde o incio,
possibilitando uma recuperao da atitude falha em que se encontrava.

6.5.

Configurao dos timers pelo PICWizard

possvel configurar os timers do microcontrolador de maneira eficiente e prtica pelo


PICWizard. Abra o PICWizard e siga os passos j vistos nos captulos anteriores. Selecione o
PIC16F876A e a freqncia do oscilador de 8MHz.
41 | P g i n a

Captulo 6 - Timers

6.5.1. Configurao do TIMER0


Vamos primeiramente configurar o TIMER0.

Figura 6.1. Tela de configurao dos Timers

Na tela de configurao dos timers, temos a opo de configurao do Watchdog Timer, TIMER0, TIMER1 e TIMER2. O PICWizard mostra que a freqncia de operao do TIMER0
ser de 2MHz (que so os 8MHz do clock externo divididos por 4).
A resoluo do timer representa o menor tempo de overflow que podemos obter com
a frequncia utilizada. Ela est diretamente ligada ao valor do preescaler.
Uma resoluo de
significa um prescaler igual a 1, uma resoluo de
representa um prescaler igual a 2, e assim por diante. Podemos ver tambm que ao selecionarmos a
resoluo desejada, o PICWizard j fornece o perodo de overflow do TIMER0.
Aps configurarmos o TIMER0, da forma representada na Figura 1, clique em OK. A seguinte funo main ser gerada pelo CCS:
Vemos que com a configurao do TIMER0, o cdigo automaticamente habilitou esse
mdulo e utilizou a funo RTCC_DIV_2 para representar um prescaler igual a 2.

42 | P g i n a

Captulo 6 - Timers
6.5.2. Configurao do Watchdog
A configurao do Watchdog bastante simples.
Na mesma tela de configurao dos timers da Figura 1 temos a configurao do WDT
(Watchdog Timer). Para habilitar o WDT, desmarque a caixa Not used, em destaque na Figura 2. Feito isso, basta selecionar o tempo de overflow do temporizador de watchdog.

Figura 6.2. Configurao do WDT

Aps configurarmos o Watchdog da forma representada na Figura 2, clique em OK. A


seguinte funo main ser gerada pelo CCS:

43 | P g i n a

Captulo 6 - Timers

void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
setup_wdt(WDT_18MS);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
}

Vemos que agora, diferentemente do cdigo gerado anteriormente, temos a funo


setup_wdt(WDT_18MS), que apenas significa que o WDT est habilitado, e configurado para
um overflow aps
. Veremos as funes referentes ao WDT na seo 1.6.
6.5.3. Habilitao da interrupo do RTCC
Vamos agora configurar a interrupo do TIMER0. Para isso, abra o PICWizard e na esquerda clique em interrupts. A tela mostrada na Figura 3 aparecer. Nela esto contidos todos
os eventos de interrupo que podem causar desvios no programa. Marque a primeira opo
disponvel, Timer 0 overflow (using RTCC name).

Figura 6.3. Habilitao da interrupo do RTCC

44 | P g i n a

Captulo 6 - Timers
Aps configurar-se o Timer 0 (RTCC) da mesma forma que fizemos anteriormente, clique em OK. O WDT no precisa estar habilitado. O cdigo que ser gerado ter a seguinte
forma:
void
{

RTCC_isr(void)

}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
}

Vemos que o programa gerou um cdigo com uma funo anterior funo main, a
funo RTCC_isr(void). Essa a funo de interrupo do RTCC, ou seja, cada vez que houver
overflow do Timer 0, essa funo ser chamada. Como foi dito anteriormente, cabe ao programador definir o que ir haver dentro dessa funo.
Lembramos que as interrupes no esto restritas ao RTCC. Qualquer um evento da
lista da Figura 3 funciona da mesma forma. Habilitando-se um daqueles eventos, ou mais de
um, o PICWizard criar uma funo para o tratamento dessa interrupo.

6.6.

Funes do compilador CCS

Vamos ver agora em detalhe as funes disponveis no compilador para a manipulao


dos timers no PIC16F876A. Para outros modelos de microcontroladores, consulte o manual do
compilador.
6.6.1. SETUP_TIMER_0(), SETUP_RTCC()
Os nomes TIMER0 ou RTCC podem ser utilizados indiscriminadamente. Essas funes
so usadas para configurar o TIMER0.
Sintaxe:

setup_timer_0(modo)
setup_rtcc(modo)
Os modos podem ser uma das seguintes constantes:

45 | P g i n a

Captulo 6 - Timers
MODO
RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L
RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256

FUNO
Timer 0 com clock interno
Timer 0 com clock externo sensvel borda de subida
Timer 0 com clock externo sensvel borda de descida
Preescaler igual a 2
Preescaler igual a 4
Preescaler igual a 8
Preescaler igual a 16
Preescaler igual a 32
Preescaler igual a 64
Preescaler igual a 128
Preescaler igual a 256

As constantes que configuram o preescaler podem ser unidas a constantes de configurao do timer 0 por um operador OR (|).
6.6.2. SETUP_TIMER_1()
Configura o TIMER1.
Sintaxe:

setup_timer_1(modo)
Os modos podem ser uma das seguintes constantes:
MODO
T1_DISABLED
T1_INTERNAL
T1_EXTERNAL
T1_EXTERNAL_SYNC
T1_CLOCK_OUT
T1_DIV_BY_1
T1_DIV_BY_2
T1_DIV_BY_4
T1_DIV_BY_8

FUNO
Desliga o Timer 1
Timer 1 com clock interno
Timer 1 com clock externo assncrono
Timer 1 com clock externo sncrono
Ativa a sada externa de clock
Preescaler do Timer 1 igual a 1
Preescaler do Timer 1 igual a 2
Preescaler do Timer 1 igual a 4
Preescaler do Timer 1 igual a 8

As constantes que configuram o preescaler podem ser unidas a constantes de configurao do timer 0 por um operador OR (|).
6.6.3. SETUP_TIMER_2()
Configura o TIMER2.
Sintaxe:

setup_timer_2(modo,per,ps)
Em que modo uma varivel ou constante inteira de 8 bits, per uma varivel inteira
de 8 bits, e os um nmero entre 1 e 16.
O modo pode ser uma das opes abaixo:

46 | P g i n a

Captulo 6 - Timers
MODO
T2_DISABLED
T2_DIV_BY_1
T1_DIV_BY_2
T1_DIV_BY_4

FUNO
Desliga o Timer 1
Timer 1 com clock interno
Timer 1 com clock externo assncrono
Timer 1 com clock externo sncrono

O parmetro per utilizado para especificar um perodo de contagem para o TIMER2.


A contagem do temporizador inicia em 0 e cada vez que ele chegar a uma contagem igual ao
valor per, o temporizador ser reiniciado.
O parmetro ps utilizado para especificar um valor para o ps-divisor do timer 2. O
nmero programado em ps ser igual ao nmero de reincios do TIMER2, necessrios para
gerar uma interrupo. Isto significa que ser programado
, a cada dois overflows, ser
gerada uma interrupo.
6.6.4. SET_TIMERX()
Modifica o contedo de um timer interno.
Sintaxe:

set_rtcc(valor)
set_timer_0(valor)
set_timer_1(valor)
set_timer_2(valor)
O valor a ser escrito depende do tipo de temporizador e do modelo de PIC utilizado.
Por exemplo, no timer 0 do PIC16F876A de 8 bits, o valor mximo que pode ser utilizado 256.
6.6.5. GET_TIMERX()
L o contedo de um timer interno.
Sintaxe:

Valor
Valor
Valor
Valor

=
=
=
=

get_rtcc()
get_timer_0()
get_timer_1()
get_timer_2()

O valor retornado pela funo depende do tipo de temporizador e do modelo do PIC


em questo.
6.6.6. SETUP_WDT()
Essa funo configura o funcionamento do WDT.
Sintaxe:

setup_wdt(modo)
Em que modo uma varivel ou constante inteira de 8 bits. Os modos disponveis so:

47 | P g i n a

Captulo 6 - Timers
MODO
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS

FUNO
Prescaler ligado ao watchdog, overflow em 18ms
Prescaler ligado ao watchdog, overflow em 36ms
Prescaler ligado ao watchdog, overflow em 72ms
Prescaler ligado ao watchdog, overflow em 144ms
Prescaler ligado ao watchdog, overflow em 288ms
Prescaler ligado ao watchdog, overflow em 576ms
Prescaler ligado ao watchdog, overflow em 1152ms
Prescaler ligado ao watchdog, overflow em 2304ms

6.6.7. RESTART_WDT()
Reinicia a contagem do watchdog.
Sintaxe:

restart_wdt()
Essa funo deve ser utilizada periodicamente para resetar ou reiniciar a contagem do
watchdog, impedindo que ele provoque um reset da CPU.

6.7.

Atividade prtica

Crie um programa que funcione como um cronmetro, utilizando o timer 0 do microcontrolador. O cronmetro deve apresentar um boto de disparo e deve estar no formato
. O programa deve ser compilado e simulado no Proteus.

48 | P g i n a

Captulo 7 - PWM

7.

PWM

A modulao por largura de pulso (PWM - Pulse Width Modulation) uma tcnica
utilizada no controle de circuitos analgicos com um processador de sadas digitais. PWM
empregada em uma enorme variedade de aplicaes, desde medies e comunicaes at
controle de potncia e converso.
Fazendo o controle digital de circuitos analgicos, os custos do sistema e o consumo
de energia podem ser drasticamente reduzidos. Alm disso, muitos microcontroladores hoje
em dia incluem PWM on-chip, tornando sua utilizao muito simples.
Superficialmente, um PWM um modo de codificar digitalmente sinais analgicos. Atravs da utilizao de contadores de alta-resoluo, o duty cycle de uma onda quadrada
modulada para codificar o nvel de um sinal analgico especfico. O PWM, ainda assim, um
sinal digital, pois em um dado instante de tempo, ou a fonte DC est totalmente aplicada, ou
desligada, como ilustrado na Figura 7.1.

FONTE

PWM

CARGA

Figura 7.1. PWM

Vemos ainda, pela Figura 7.1, que o PWM apenas controla o chaveamento. O transistor TBJ poderia ser ainda qualquer tipo de chave que possa ser controlada por tenso. O duty
cycle do PWM determina a relao entre o perodo de tempo que a chave fica ligada e o perodo total da comutao. Matematicamente:

49 | P g i n a

Captulo 7 - PWM
On = Nvel Alto
Off = Nvel Baixo

DT

DT

DT
T

Figura 7.2. PWM para diferentes duty cycles

A Figura 7.2 mostra trs sinais PWM distintos. A primeira delas mostra um PWM com
um duty cycle de 50%, isto , em 50% do perodo T ele est em nvel lgico alto e 50% do perodo ele est em nvel lgico baixo. As outras duas formas de onda representam sinais PWM
com duty cycles de 10% e 90%, respectivamente.
O pulso da onda PWM apresenta tenso fixa, porm o valor mdio da tenso da forma
de onda varia em funo do duty cycle. A tenso mdia
aplicada uma carga diretamente proporcional ao duty cycle, e como este varia entre 0 (quando
) e 1 (quando
) temos que a tenso mdia pode variar entre 0 e
.

7.1.

PWM no PIC16F876A

Esse modelo de PIC possui dois canais de PWM, CCP1 e CCP2, cada uma deles com resoluo mxima de 10 bits. Esses canais podem tambm ser utilizados no modo comparao e
captura. Entretanto, estudaremos apenas o caso do PWM.
O duty cycle poder ser regulado de 0% a 100% com uma resoluo mxima de 1024
pontos. No entanto, dependendo da configurao adotada essa resoluo no ser atingida.
O perodo ( ) do PWM no PIC16F876A controlado diretamente pelo TIMER2. Dessa
forma, a resoluo para ajuste do perodo depende do prescaler do TIMER2. Note-se ainda que
o postscale no possui influncia nos perodos do PWM.
Vamos agora configurar o PWM utilizando-se o PICWizard.
Abra o PICWizard, e, aps realizar as configuraes usuais, na janela esquerda, clique
em Others. Na janela Others possvel configurar o PWM, conforme mostrado na Figura 7.3.

50 | P g i n a

Captulo 7 - PWM

Figura 7.3. Configurao do PWM no PICWizard

Podemos ver na Figura 7.3 que configuramos o PWM no canal CCP1, e a freqncia do
PWM de 1KHz. Isso o mesmo que dizer que o perodo do PWM de 1us. Configuramos
tambm o ciclo de trabalho para 50%.
Podemos utilizar o PWM para realizar o chaveamento de semicondutor. Se aplicarmos
o sinal PWM na base de um transistor TBJ, por exemplo, ele funcionar como uma chave, com
freqncia de chaveamento de 1KHz. No ciclo ativo, uma corrente circular no sentido coletoremissor, alimentando a carga. Quando o sinal PWM estiver em nvel lgico baixo, o transistor
funciona como uma chave aberta, cortando a alimentao da chave. Esse circuito est ilustrado na Figura 7.4.

51 | P g i n a

Captulo 7 - PWM

Figura 7.4. Chaveamento de um semicondutor utilizando-se PWM

Nesse exemplo, o LED est sendo alimentado com metade da potncia da fonte, pois o
duty cycle escolhido foi de 50%. Para um exemplo mais prtico, poderamos utilizar o sinal
PWM em uma chave que faz o controle de velocidade de um motor.

7.2.

Funes do compilador CCS

Existem apenas duas funes de configurao do PWM disponveis no compilador CCS.


7.2.1. SETUP_CCPX()

Configura o funcionamento do mdulo CCPX.


Sintaxe:
setup_ccp1(modo)
setup_ccp2(modo)
Em que modo uma varivel ou constante inteira de 8 bits. Para configurar o
PWM s existe um modo:
MODO
CCP_PWM

FUNO
Configura o modo de gerao de sinal PWM.

7.2.2. SET_PWMX_DUTY()
Configura o ciclo ativo do mdulo CCP no modo PWM.
Sintaxe:
52 | P g i n a

Captulo 7 - PWM

set_pwm1_duty(valor)
set_pwm2_duty(valor)
Em que valor uma varivel ou constante inteira de 8 ou 16 bits.

7.3.

Atividade prtica

Crie um programa capaz de gerar um PWM com duty cycle de 0%, 25%, 50%, 75% e
100%, que dependa do nvel lgico nos pinos da porta A. O PWM deve ser usado para controlar uma chave, que alimenta uma carga puramente resistiva.

53 | P g i n a

Captulo 8 - Comunicao I2C

8.

Comunicao I2C

Vamos analisar nesta seo a arquitetura de uma comunicao I2C, bem como seu
protocolo de funcionamento e um exemplo prtico de comunicao do PIC16F876A com uma
memria EEPROM.

8.1.

Arquitetura

Um barramento de comunicao I2C consiste fisicamente de 2 fios. Esses so bidirecionais: SDL (Serial Data Line) e SCL (Serial Clock Line).

Figura 1 - Arquitetura da comunicao I2C

Figura 8.1. Barramento de comunicao I2C

Ambas as vias de comunicao so conectadas ao positivo da fonte de alimentao atravs de resistores de pull-up, com valores tpicos de 4,7 k. Isso significa que enquanto o
barramento est livre, ambas as vias, SCL e SDA, ficam em nvel lgico alto.

8.2.

Protocolo I2C

Vamos ver agora, de uma forma geral, o fluxo do protocolo de comunicao I2C.
8.2.1. Definies
Existem algumas terminologias importantes para o estudo do protocolo I2C. As principais so:
Transmissor: o dispositivo que envia dados para o barramento.
Receptor: o dispositivo que recebe dados do barramento.
Master: o dispositivo que inicia a transferncia de dados, gera o sinal de clock e encerra a transmisso.
Slave: o dispositivo endereado pelo master.
8.2.2. Validao de dados
Os dados na via SDA devem ser estveis durante um nvel lgico alto do clock. O estado alto e baixo da linha de dados s pode ser mudado quando o sinal do clock na via SCL est
em nvel lgico baixo.
8.2.3. Condies de START e STOP
54 | P g i n a

Captulo 8 - Comunicao I2C


Durante uma comunicao I2C, existem duas situaes nicas, definidas como START
(S) e STOP (P).
Uma transio de nvel lgico ALTO para BAIXO na via SDA, enquanto SCL est em nvel
lgico ALTO, indicam uma condio de START (S).
Uma transio de nvel lgico BAIXO para ALTO na via SDA, enquanto SCL est em nvel
lgico ALTO, indicam uma condio de STOP (P).

Figura 8.2. Condies de START e STOP

Essas condies de START e STOP so sempre geradas pelo master. O barramento


considerado ocupado (BUSY) depois de uma condio START. O barramento considerado
livre (FREE) novamente algum tempo aps a condio de STOP.
8.2.4. Comunicao
O dispositivo master ajusta as condies iniciais. Ele envia para o barramento a condio de START. O dispositivo master envia ento, 7 bits para endereamento do dispositivo
slave, seguido de um bit read/write.

Figura 8.3. Primeiro byte aps o sinal de START

Esse ltimo bit determina se o dispositivo ir escrever ou ler o endereo no dispositivo


slave.Um 0 indica uma transmisso (WRITE), e um 1 indica uma requisio de dados (READ).
Aps receber esse primeiro byte, o dispositivo slave envia um sinal de ACKNOWLEDGE
(ACK), confirmando o recebimento do byte.
O dispositivo master inicia ento a transferncia de dados, sempre em pacotes de 8
bits, seguidos de sinais de ACK do dispositivo slave. Uma transferncia de dados sempre se
encerra com um sinal de STOP do dispositivo master.

55 | P g i n a

Captulo 8 - Comunicao I2C

Figura 8.4. Comunicao I2C

8.3.

Funes do Compilador CCS

Para habilitarmos o mdulo de comunicao I2C, precisamos utilizar uma diretiva do


compilador CCS:

#USE I2C(opes)
Existem diversas opes que podem ser adicionadas diretiva. Essas opes so separadas por vrgulas. A tabela 1 mostra as principais opes temos para a diretiva, e o que cada
uma realiza.
Tabela 1 - Opes para a diretiva #USE I2C

OPO
MASTER
SLAVE
SCL=PIN_XX
SDA=PIN_XX
FAST
SLOW

FUNO
Seta o dispositivo como master da comunicao.
Seta o dispositivo como slave da comunicao.
Seta o pino XX como SCL.
Seta o pino XX como SDA.
Usa a comunicao I2C no modo rpido.
Usa a comunicao I2C no modo lento.

Um exemplo de sintaxe para a diretiva #USE I2C mostrado abaixo.

#USE I2C (Master,Fast,sda=PIN_C4,scl=PIN_C3)


Neste exemplo, a comunicao funcionar no modo rpido e o dispositivo ser o master da comunicao. O pino do SCL ser o C3, e o pino SDA ser o C4.
Vamos ver agora as principais funes utilizadas no compilador CCS para a comunicao I2C.
8.3.1. I2C_START()
Essa funo determina o incio da comunicao I2C. Com essa funo o sinal START
enviado para o barramento. A sintaxe para utilizao desta funo :

i2c_start()
8.3.2. I2C_STOP()
Essa funo determina o fim de uma comunicao I2C. Com essa funo, um sinal de
STOP enviado para o barramento, encerrando uma transmisso/leitura de dados. A sintaxe
para utilizao desta funo :
56 | P g i n a

Captulo 8 - Comunicao I2C

i2c_stop()
8.3.3. I2C_WRITE()
Essa funo envia para o barramento um dado de 8 bits. A sintaxe para utilizao desta
funo :

i2c_write(dados)
Aps utilizada, essa funo retorna o bit de ACKNOWLEDGE.
BIT ACK
0
1
2

SIGNIFICADO
ACK
NO ACK
Coliso no modo multi-master

8.3.4. I2C_READ()
Essa funo l um byte do barramento I2C. A sintaxe para utilizao desta funo :

dados = i2c_read()
Essa funo retorna um valor inteiro de 8 bits.

8.4.

Memria EEPROM 24C02

Vamos utilizar o protocolo I2C para realizarmos a comunicao entre o PIC16F876A e


uma memria EEPROM 24C02.
A EEPROM 24C02 uma memria organizada como um bloco nico de 256 bytes. Opera em uma faixa de tenso de 4,5V 5,5V. Apresenta baixo consumo, com valores tpicos em
standby e com corrente ativa de, respectivamente, 10A e 1mA. A pinagem desta EEPROM
est ilustrada na Figura 8.5.

Figura 8.5. Pinagem EEPROM 24C02

As linhas funcionais de endereo permitem uma conexo de oito memrias 24C02 no


mesmo barramento.
8.4.1. Descrio dos pinos
8.4.1.1. DAS

57 | P g i n a

Captulo 8 - Comunicao I2C


Este um pino bi-direcional usado para transferir endereos e dados para o dispositivo. A linha SDA requer um resistor de pull-up conectado ao Vcc. Para transferncia normal de
dados, SDA pode mudar somente quando SCL est em nvel lgico baixo.
8.4.1.2. SCL
Esta entrada usada para sincronizar a transferncia de dados de e para o dispositivo.
8.4.1.3. A0, A1, A2
Os nveis lgicos nestas entradas so comparados com os bits correspondentes no endereo do dispositivo slave. O chip selecionado se a comparao verdadeira.
Oito dispositivos 24C02 podem ser conectadas ao mesmo barramento utilizando diferentes combinaes de bits de seleo de chips. Essas entradas podem ser conectadas tanto
ao Vcc quanto ao Vss.
8.4.1.4. WP
Este pino de proteo escrita. Deve ser conectado ao Vcc ou ao Vss. Se conectado
ao Vcc, a proteo de hardware escrita ativada. Se o pino WP conectado ao Vss, a proteo de hardware escrita desativada.
8.4.2. Endereamento de dispositivos
Um byte de controle o primeiro byte recebido, aps a condio de START do dispositivo master.

Figura 8.6. Byte de controle

O byte de controle consiste de 4 bits, o cdigo de controle (Control Code). Para a memria 24C02 este o conjunto 1010, para ler e escrever na memria. Os prximos 3 bits do
byte de controle so os bits de seleo de chip (A0, A1, A2). O ltimo bit do byte de controle
define qual operao ser executada. Quando este bit 1, a operao de leitura selecionada, e quando o bit 0, a operao de escrita selecionada.
O dispositivo enviar um ACK logo aps o envio do byte de controle. O prximo byte a
ser transmitido pelo master a word do endereo, e ser escrito no ponteiro de endereo da
memria 24C02. Lembramos que 1 word = 4 bytes. Aps o recebimento da word do endereo,
o dispositivo slave responde com outro sinal ACK, e d-se inicio a transmisso de dados.

58 | P g i n a

Captulo 8 - Comunicao I2C

Figura 2.7. Transmisso de dados para uma EEPROM 24C02

8.5.

Aplicao

Uma memria utilizada para armazenarmos dados e no sobrecarregarmos as memrias internas do microcontrolador. Por exemplo, os dados resultantes de uma converso
A/D podem ser armazenados nesta EEPROM que estamos utilizando. Vamos ver agora como
utilizamos as funes I2C do compilador CCS para armazenarmos dados na 24C02. Depois,
veremos que o CCS disponibiliza funes especficas para a utilizao com memrias EEPROM
externas.
Programa em C
#include <LCD.C>
#include <16F876A.h>
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES

NOWDT
XT
NOPUT
NOPROTECT
NODEBUG
NOBROWNOUT
NOLVP
NOCPD
WRT_50%

//No Watch Dog Timer


//Crystal osc <= 4mhz
//No Power Up Timer
//Code not protected from reading
//No Debug mode for ICD
//No brownout reset
//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
//No EE protection
//Lower half of Program Memory is Write Protected

#use delay(clock=10000000)
#define EEPROM_SCL
PIN_C3
#define EEPROM_SDA
PIN_C4
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
void main()
{
byte result;
lcd_init();
delay_ms(3);
i2c_start();
i2c_write(0xa0);
i2c_write(2);
i2c_write(80);
i2c_stop();

/*
/*
/*
/*
/*

Envia o sinal de START para o barramento I2C */


Envia para o barramento o byte de controle (1010 000 0) */
Define em qual endereo da memria o dado ser alocado */
Escreve o dado (80) no endereo de memria selecionado */
Envia o sinal de STOP para o barramento I2C */

/*
/*
/*
/*
/*
/*
/*

Envia o sinal de START para o barramento I2C */


Envia para o barramento o byte de controle (1010 000 0) */
Define de qual endereo da memria o dado ser lido */
Envia outro sinal de START para o barramento I2C */
Envia para o barramento o byte de controle (1010 000 1) */
L o endereo de memria e armazena na varivel "result" */
Envia o sinal de STOP para o barramento I2C */

delay_ms(10);
i2c_start();
i2c_write(0xa0);
i2c_write(2);
i2c_start();
i2c_write(0xa1);
result=i2c_read();
i2c_stop();

delay_ms(3);
printf(lcd_putc, "Data: %u
ria */
while (1);
}

",result); /* Mostra no display LCD o dado armazenado na mem-

59 | P g i n a

Captulo 8 - Comunicao I2C


Esse simples programa escreve o valor 80 no endereo de memria 2 da EEPROM
24C02. Depois, lemos este valor do endereo de memria, e o mostramos no display LCD.
Na figura 8 temos o projeto no PROTEUS para simularmos o cdigo criado no CCS.

Figura 8.8. Design no PROTEUS

8.5.1. Funes do CCS para memria externa


Utilizando as funes I2C, a seqncia para escrevermos ou lermos algo da memria
ser sempre essa. A utilizao dessas funes diretamente no programa mais vantajosa, por
aumentar a velocidade de compilao, economizar espao na memria RAM do microcontrolador e so menos suscetveis a bugs. Entretanto, o driver da EEPROM 24C02 possui funes
prprias para serem utilizadas, reduzindo o tamanho do cdigo e facilitando o trabalho do
programador. Apresentamos essas funes nas sees subseqentes.
8.5.1.1. INIT_EXT_EEPROM()
Essa funo inicializa a comunicao com a memria EEPROM. Ela deve ser chamada
antes das outras funes referentes memria. Sua sintaxe :

init_ext_eeprom()
8.5.1.2. WRITE_EXT_EEPROM()
Essa funo escreve na memria EEPROM um valor desejado. A sua sintaxe :

write_ext_eeprom(a, d)
60 | P g i n a

Captulo 8 - Comunicao I2C


Esse comando escrever no endereo a da memria, o dado d. Esse dado dever ser
um byte. Por exemplo, podemos ter:

write_ext_eeprom(0x0,0x12);
Nesse exemplo, o valor 0x12 ser escrito no endereo 0 de memria.
8.5.1.3. READ_EXT_EEPROM()
Esse comando l um valor da memria EEPROM. Sua sintaxe :

d = read_ext_eeprom(a)
Esse comando ler o endereo a da memria, o byte lido ser atribudo varivel d. Por exemplo, podemos ter:
value=read_eeprom(0x0)
Nesse exemplo, o endereo 0 da memria ser lido, e o valor 0x12 ser atribudo varivel value.
8.5.1.4. EXT_EEPROM_READY()
Esse comando retorna true se a memria estiver pronta para receber opcodes. Sua sintaxe :

b = ext_eeprom_ready()
Lembramos que esses comandos s funcionam para os drivers que esto disponveis
na biblioteca do compilador CCS. Para verificar os drivers disponveis, entre na pasta onde foi
instalado o CCS, e procure pela pasta drivers.
Utilizando essas funes poderamos utilizar o programa anterior da seguinte forma:

61 | P g i n a

Captulo 8 - Comunicao I2C

#include <LCD.C>
#include <16F876A.h>
#include <2402.C>
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES

NOWDT
HS
NOPUT
NOPROTECT
NODEBUG
NOBROWNOUT
NOLVP
NOCPD
WRT_50%

//No Watch Dog Timer


//High speed Osc (> 4mhz)
//No Power Up Timer
//Code not protected from reading
//No Debug mode for ICD
//No brownout reset
//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
//No EE protection
//Lower half of Program Memory is Write Protected

#use delay(clock=10000000)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
void main()
{
BYTE result=0;
lcd_init();
init_ext_eeprom();
delay_ms(10);
write_ext_eeprom(2, 50);
delay_ms(20);
result = read_ext_eeprom(2);
delay_ms(3);
printf(lcd_putc, "data: %u
na memria */
while (1);
}

8.6.

",result);

/* Mostra no display LCD o dado armazenado

Aplicao 2

Utilizando a comunicao I2C, armazene os dados medidos pelo termmetro projetado no captulo de converso A/D em uma memria EEPROM.

62 | P g i n a

Anexo

Anexo Funes internas do compilador CCS

63 | P g i n a

Anexo

64 | P g i n a

Anexo

65 | P g i n a

Anexo

66 | P g i n a

Anda mungkin juga menyukai