Vous êtes sur la page 1sur 208

Maracana - CE

2014

Pedro Pedrosa Rebouas Filho

Microcontroladores PIC

Linguagem C utilizando CCS para leigos

1a Edio

Maracana
2014
ii

Copyright 2014

Este livro didtico e aplicado ao estudo das reas de Sistemas Embarcados, especificamente na
rea de Microcontroladores e Dispositivos Perifricos, disponibilizando exemplos de prticas. Todo
esse material protegido pela legislao brasileira de direitos autorais. possvel utilizar o contedo
deste livro em outros meios de comunicao, seja na web ou em publicaes impressas, desde que
tenha a citao explcita de que o material reproduzido de copyright deste livro ou tenha autorizao
expressa do autor, o que inclui as imagens originais deste livro. Reprodues integrais ou parciais do
contedo original deste livro em desrespeito a esses termos e sem autorizao constituem infrao da
legislao de direitos autorais, ao passvel de punio legal. Estes termos se expandem para o material de aula disponibilizado pelo autor, como slides, vdeos e exemplos.
Data de publicao: 01/01/2014
ISBN: 978-85-63953-38-4
Publicado pelo Instituto Federal de Educao, Cincia e Tecnologia do Cear (IFCE)
Brasil, Cear, Maracana, Av. Contorno Norte, 10 - Distrito Industrial

Link App Store:

https://itunes.apple.com/br/book/microcontroladores-pic-linguagem/id768997487?mt=11

Cdigo de barras:

iii

Crditos

Autor
Pedro Pedrosa Rebouas Filho

Editor
Pedro Pedrosa Rebouas Filho

Designer Grfico
Jeerson Silva Almeida

Apoio Tcnico
Alisson Monteiro
Diego Moreira
Edson Vieira
Jeerson Silva Almeida
Rafael Alves Barbosa

Editora
Instituto Federal de Educao, Cincia e Tecnologia do Cear - IFCE

iv

Contatos
Os contatos do grupo de desenvolvimento deste livro so:

Grupo de Pesquisa em Sistemas Inteligentes


Pgina do grupo:
http://industriaifce.wordpress.com/grupos-de-pesquisa/gpsi/
Email: gpsi.ifce@gmail.com

Laboratrio de Prottipos - IFCE Maracana


Facebook: https://www.facebook.com/lprotifcemaracanau
Email: lprot_ifce@hotmail.com

Contatos do autor Pedro Pedrosa Rebouas Filho


Lattes: http://lattes.cnpq.br/4347965302097614
Email: pedrosarf@ifce.edu.br

Agradecimentos

Agradeo Deus pela ddiva da vida, me proporcionando o prazer de viver cada dia

fazendo o que amo;


Agradeo minha esposa Elizngela pelo apoio incondicional em todos os projetos

da minha vida, inclusive na dedicao e tempo empregados este livro;


Agradeo aos meus pais, Pedro Pedrosa e Maria Palmira, pelo apoio ao longo de

toda a minha vida me proporcionando a oportunidade de ter bons professores e educadores, em que busco me espelhar;

Agradeo aos amigos do departamento da Indstria do IFCE Maracana pelo apoio

dirio todos os projetos de pesquisa e de ensino a qual me comprometo em executar;


Agradeo aos meus alunos, bolsistas e amigos do Laboratrio de Prottipos e do

Grupo de Pesquisa em Sistemas Inteligentes do IFCE pelo apoio tcnico na execuo das
prticas e dos projetos que constituem este livro;

Agradeo aos alunos do curso em Automao Industrial que contriburam diretamen-

te me mostrando o norte que devia seguir no desenvolvimento deste livro, apresentando


as principais dvidas e dificuldades da introduo aos microcontroladores;

Agradeo ao Departamento de Extenso, Pesquisa, Ps-Graduao e Inovao, que

conjuntamente com a Direo Geral do campus Maracana, forneceu apoio e incentivo na


publicao deste livro.

Agradeo Pr-Reitoria de Pesquisa e Ps-Graduao e Inovao do IFCE pelo

apoio e incentivo publicao deste livro, alm de todo incentivo ao longo da minha formao como aluno, professor e pesquisador desta instituio.

vi

Apresentao
Este livro foi desenvolvido por Pedro Pedrosa Rebouas Filho, o mesmo possui os ttulos
de Doutorado (2013) e Mestrado (2010) em Engenharia de Teleinformtica pela Universidade Federal do Cear (UFC), possui graduao em Tecnologia em Mecatrnica Industrial
(2008) pelo Instituto Federal de Educao Cincia e Tecnologia do Cear (IFCE).
Atualmente Professor do Ensino Bsico, Tcnico e Tecnolgico no IFCE, cargo que ocupa desde 2008 na mesma instituio. No IFCE, o autor atua ministrando aulas nas reas
de Automao e Robtica, o que contempla diversas disciplinas, como Eletrnica Digital,
Eletrnica Analgica, Eletrnica Industrial, Instrumentao, Controladores Lgicos Programveis, Microcontroladores, Dispositivos Perifricos, Robtica com Manipuladores, Robtica Mvel, entre outras.
Este livro surgiu do material das disciplinas de Microcontroladores e Dispositivos Perifricos, material este que abordava assuntos tericos e sugere prticas em diversas reas. A
linguagem adotada ao longo do livro visa aproximar a teoria do leitor, visando que o mesmo possa executar as prticas com sucesso, enriquecendo seu nvel nesta rea do conhecimento.
As prticas deste livro so apresentadas e abordadas em forma crescente de complexidade, portanto sugere-se a execuo das mesmas de forma gradativa, sem saltos. Deste
modo, os degraus do conhecimento sero solidificados um a um, conforme planejado
pelo autor.
Bons estudos.

vii

1
Introduo aos
Microcontroladores

Nesta unidade sero apresentadas algumas teorias sobre Microcontroladores, enfatizando


os PICs fabricado pela Microchip e descrevendo seus modos de funcionamento e suas caractersticas.

Caractersticas Bsicas
Os Microcontroladores (MCU ou uC) esto praticamente em todo lugar: automveis, avies, brinquedos, TVs, etc. So dispositivos programveis na sua maioria auto-contidos
(sistemas embarcados ou embutidos), possuindo um sistema dentro de um chip, gerando
a sigla SOC do termo em ingls System on a chip.
Estes dispositivos incluem dentro de um nico chip CPU, memria (de dados e de programa), entrada/sada, temporizadores, relgio interno, entre outros herdares especficos.
Deste modo, estes dispositivos de controle possuem baixo preo e alta eficincia. Possuem outras funes diferenciadas e normalmente no encontradas em microprocessadores
top de linha (temporizadores, conversores A/D e D/A, etc). O grande ganho deste dispositivos possuir o Hardware e software integrados em um nico chip.
Estes dispositivos compem sistemas computacionais que controlam os mais diferentes
equipamentos, como por exemplo: controle de estacionamentos, sistemas de automao,
sistemas de segurana.
Possuem como principais caractersticas:

Programao de memria no-voltil (EEPROM, Flash), deste modo, o programa do

controlador pode ser regravado vrias vezes, inclusive podendo at mesmo se auto-gravar para alguns PICs;

Possui Interrupes, sendo assim, algumas funes podem ser executadas quando

acontece algo importante, suspendendo a operao em execuo para que outras mais
importantes possam ser executadas;

Possui entradas e sadas (E/S) analgicas e digitais, permitindo a leitura e sada de

tenso na faixa de 0 a 5 Volts corrente contnua;


Possui E/S serial, permitindo transmisso e recepo com outros dispositivos atra-

vs da comunicao serial, obedecendo os protocolos de comunicao RS232, I2C e


SPI;

Interface para memria externa/barramento, o que permite o aumento da memria

de armazenamento quando necessrio em aplicaes especfica;


Programao no sistema (ISP - In System Programming), o que permite a gravao

do microcontrolador em sua prpria execuo, alm do normal que gravar previamente


execuo.
De forma resumida, o Microcontrolador possui as funcionalidade abaixo:

Microcontrolador x Microprocessador
O Microprocessador (MPU) um Circuito Integrado (CI) com milhes de
transistores usados em conjunto para armazenamento e manipulao de
dados, ele compem os computadores, sendo uma das suas peas internas.
Enquanto isto, o Microcontrolador (MCU) um processador especial,
geralmente contm no mesmo chip diversos perifricos, sendo usado na
maior parte das vezes como controle digital.
Deste modo, as principais diferenas so:
MPU necessita de perifricos externos para funcionar, ex. memria RAM, temporizadores.
MCU integra todos os recursos em um nico chip.

10

Caractersticas Bsicas

Os Microcontroladores (MCU ou uC) esto praticamente em todo lugar: automveis, avies, brinquedos, TVs, etc. So dispositivos programveis na sua maioria auto-contidos
(sistemas embarcados ou embutidos), possuindo um sistema dentro de um chip, gerando
a sigla SOC do termo em ingls System on a chip.
Estes dispositivos incluem dentro de um nico chip CPU, memria (de dados e de programa), entrada/sada, temporizadores, relgio interno, entre outros herdares especficos.
Deste modo, estes dispositivos de controle possuem baixo preo e alta eficincia. Possuem outras funes diferenciadas e normalmente no encontradas em microprocessadores
top de linha (temporizadores, conversores A/D e D/A, etc). O grande ganho deste dispositivos possuir o Hardware e software integrados em um nico chip.
Estes dispositivos compem sistemas computacionais que controlam os mais diferentes
equipamentos, como por exemplo: controle de estacionamentos, sistemas de automao,
sistemas de segurana. Pode-se citar que um carro mdio possui 15 MCU, um carro de
luxo em torno de 64 MCU, alm dos diversos dispositivos como celulares, microondas,
ventilador, porto automtico, entre tantos outros.
Possuem como principais caractersticas:

Programao de memria no-voltil (EEPROM, Flash), deste modo, o programa do

controlador pode ser regravado vrias vezes, inclusive podendo at mesmo se auto-gravar para alguns PICs;

Possui Interrupes, sendo assim, algumas funes podem ser executadas quando

acontece algo importante, suspendendo a operao em execuo para que outras mais
importantes possam ser executadas;

11

Possui entradas e sadas (E/S) analgicas e digitais, permitindo a leitura e sada de

tenso na faixa de 0 a 5 Volts corrente contnua;


Possui E/S serial, permitindo transmisso e recepo com outros dispositivos atra-

vs da comunicao serial, obedecendo os protocolos de comunicao RS232, I2C e


SPI;

Interface para memria externa/barramento, o que permite o aumento da memria

de armazenamento quando necessrio em aplicaes especfica;


Programao no sistema (ISP - In System Programming), o que permite a gravao

do microcontrolador em sua prpria execuo, alm do normal que gravar previamente


execuo.
De forma resumida, o Microcontrolador possui as funcionalidade abaixo:

Microcontrolador x Microprocessador

O Microprocessador (MPU) um Circuito Integrado (CI) com milhes de


transistores usados em conjunto para armazenamento e manipulao de dados, ele compem os computadores, sendo uma das suas peas internas.
Enquanto isto, o Microcontrolador (MCU) um processador
especial, geralmente contm no mesmo chip diversos perifricos, sendo
usado na maior parte das vezes como controle digital.
12

Deste modo, as principais diferenas so:


MPU necessita de perifricos externos para funcionar, ex. memria RAM, temporizadores.
MCU integra todos os recursos em um nico chip.

13

Elementos Bsicos de um MCU

Os elementos bsicos de um MCU so:


Processador

Unidade de Controle

Conjunto de Instrues

Registradores

Memria

Barramentos de comunicao

Deste modo, estes so detalhados a seguir.

Processador
Aes a serem executadas pelo processador so:

Busca da instruo: l instruo da memria;

Interpretao da instruo: decodificao para determinar ao requerida (sinais de

controle que sero ativados);


Busca de dados: leitura de dados da memria ou dispositivo de I/O;

Processamento de dados: pode ser necessrio efetuar operaes aritmticas;

Escrita de dados: pode ser necessrio escrever na memria ou dispositivo de I/O.

14

Registradores
So de dois tipos bsicos:

Registradores visveis ao usurio permitem que o programador minimize referncias


memria.

Registradores de controle e de estado usados pela unidade de controle.

Registradores visveis ao usurio


o

Reg. de propsito geral: usado pelo programador para fins diversos. Ex.: operando, informao de operao, operaes sobre a pilha, endereamento.

Reg. de dados: apenas para operandos.

Reg. de endereo: propsito geral e endereo.

Reg. de condio (flags): usados para interrupo ou resultado de operao.

Reg. de configurao: usados para configurar o funcionamento do MCU.

Registradores de Configurao
o

Registrador das portas Input/Output (I/O)

Direo do fluxo (TRISA, TRISB, ...)

Valor da porta (PORTA, PORTB, ...)

Registrador de configurao do funcionamento do Microcontrolador. Exemplo:

T1CON: configura o funcionamento do timer 1.


15

RCON e INTCON configuram o funcionamento de interrupes.

Entre outros.

Registradores de controle e de estado:


o

Variam de acordo com projeto

Tipos bsicos
"

Contador de programa (PC)

"

Registrador de Instruo (IR)

"

Registrador de Endereamento memria (MAR)

"

Registrador de armazenamento temporrio de dados (MBR)

Contador de programa (PC)


o

Responsvel pelo controle de execuo das instrues, o PC aponta sempre


para a prxima instruo a ser executada.

incrementado aps a execuo de cada instruo.

Quando ocorre uma interrupo, salto ou alguma parada na execuo do programa, o PC que indica qual instruo ser executada, e qual ponto do programa
a execuo est.

Registrador de Instruo (IR)


o

Este registro contm o valor da prxima instruo a ser executada.

Muito utilizada na arquitetura Pipeline, pois este registro armazena a prxima instruo.
16

Unidade de Controle
Duas tarefas bsicas:
#

Sequenciamento: dirige o processador para que execute uma srie de microoperaes na sequncia apropriada.

Execuo: faz com que cada microoperao seja executada.

Ela opera atravs da ativao de sinais de controle, sendo os sinais de entrada e de barramento do controle de sada.
!

Entrada:
o

Relgio (Clock) - comanda as transies de operao

Registrador de Instruo (IR) - Nmero da instruo a ser executada

Flags - registros das funes dos MCU PIC.

Sinais do barramento de controle Sada:


o

Sinais Internos

Sinais para barramento de controle

Conjunto de Instrues
o

Cada instruo dada por uma sequncia de bits.

Para facilitar programao, criou-se representao simblica (mnemnicos), denominada de Linguagem Assembly.

17

Arquitetura - CISC x RISC


Estas duas arquiteturas so distintas e caracterizam o conjunto de instrues presentes em cada microcontrolador. As caractersticas de cada uma so:

CISC (Complex Instructions Set Computers)


o

Conjunto de intrues complexas

Compiladores mais complexos

RISC (Reduced Instructions Set Computers)


o

Conjunto menor de instrues

Grande nmero de registradores de propsito geral.

Instrues mais complexas so construdas a partir das mais simples

Utiliza Arquitetura Harward e Pipeline

Montador x Compilador
Os dois tipos de programa so usados para gerar o arquivo (*.hex) que serve para gravar
os comandos de execuo dentro do Microcontrolador. Entretanto, as caractersticas bsicas de cada um dos programas so:
!

Montador

Utiliza apenas a linguagem Assembly, usando apenas as instrues do fabricante


O PIC 18f2550 possui 77 instrues
18

Apenas MONTA o cdigo com as funes reconhecidas pelo hardware, fazendo TUDO
com elas.
!

Compilador

Utiliza outra linguagem para programao que o hardware no reconhece


Decodifica uma linguagem em funes que o hardware reconhece.
A Linguagem C muito utilizada para programar PIC
Um exemplo de programa para gravar um dado na memria EEPROM:

Montador utilizando Linguagem


Assembly

Compilador utilizando
Linguagem C

Assembly x Linguagem C
As duas linguagens mais comuns para programao de Microcontroladores so Assembly
e C, e as principais diferenas entre ambas so:

A linguagem C torna a programao amigvel, facilitando a programao de aplica-

es mais complexas;

19

A linguagem C aumenta a portabilidade, uma vez que as instrues Assembly variam

muito at mesmo entre os mesmos fabricantes;


A linguagem C permite o aproveitamento de cdigo com uso de bibliotecas;

necessrio controle do Hardware para programar em Assembly;

O tamanho do cdigo em Assembly ser sempre menor;

Os programas em Assembly tendem a ser mais rpidos.

Tipos de memria
Existem diversos tipos de memria quando se trata de Microcontroladores, em que as
principais so apresentadas e descritas a seguir:
!

RAM (Random Access Memory)


o

Memria de acesso aleatrio

O processador pode ler e escrever

Perde os dados sem alimentao

ROM (Read Only Memory)


o

Memria somente de leitura

Gravada uma nica vez na fbrica

O processador s l os dados

PROM (Programable Read Only Memory)


o

Memria somente de leitura


20

Gravadas 1 vez por gravador PROM

O processador apenas l esta memria

EPROM (Erasable Programable Read Only Memory)


o

Memria apagvel por luz ultra-violeta

Pode ser gravada n vezes por gravador EPROM, em que

No definido pelo fabricante

O processador apenas l esta memria

EEPROM (Electrical Erasable Programable Read Only Memory)


o

Memria apagvel por luz ultra-violeta e por tenso eltrica (15 a 30V)

Pode ser gravada n vezes por gravador EEPROM, em que n definido pelo fabricante

O processador apenas l esta memria

Obs 1:Alguns MCU conseguem escrever nesta memria ao longo da execuo do

programa, so chamados de memria EEPROM flash


Obs 2: As memrias PROM, EPROM e EEPROM no apagam seu contedo quando retira-se a alimentao.

Arquitetura de hardware (Princeton - Harward)


As duas principais principais arquitetura de hardware so Princeton e Harward. Estas duas arquiteturas so distintas e caracterizam o hardware e as conexes presentes em
cada microcontrolador.

21

Arquitetura Princeton
o

Programa, Pilha e variveis na mesma memria

Barramentos nico para memria de programa e de dados.

Arquitetura Harward
o

Programa, Pilha e variveis em unidades separadas

Barramentos diferentes para memria de programa e de dados.

22

Linguagem C x Assembly

As duas linguagens mais comuns para programao de Microcontroladores so Assembly


e C, e as principais diferenas entre ambas so:

A linguagem C torna a programao amigvel, facilitando a programao de aplica-

es mais complexas;

A linguagem C aumenta a portabilidade, uma vez que as instrues Assembly variam

muito at mesmo entre os mesmos fabricantes;


A linguagem C permite o aproveitamento de cdigo com uso de bibliotecas;

necessrio controle do Hardware para programar em Assembly;

O tamanho do cdigo em Assembly ser sempre menor;

Os programas em Assembly tendem a ser mais rpidos.

Montador x Compilador
Os dois tipos de programa so usados para gerar o arquivo (*.hex) que serve para gravar
os comandos de execuo dentro do Microcontrolador. Entretanto, as caractersticas bsicas de cada um dos programas so:
!

Montador

Utiliza apenas a linguagem Assembly, usando apenas as instrues do fabricante


O PIC 18f2550 possui 77 instrues

23

Apenas MONTA o cdigo com as funes reconhecidas pelo hardware, fazendo TUDO
com elas.
!

Compilador

Utiliza outra linguagem para programao que o hardware no reconhece


Decodifica uma linguagem em funes que o hardware reconhece.
A Linguagem C muito utilizada para programar PIC

Montador utilizando Linguagem Assembly

Compilador utilizando Linguagem C

24

Tipos de Memria

Existem diversos tipos de memria quando se trata de Microcontroladores, em que as


principais so apresentadas e descritas a seguir:
!

RAM (Random Access Memory)


o

Memria de acesso aleatrio

O processador pode ler e escrever

Perde os dados sem alimentao

ROM (Read Only Memory)


o

Memria somente de leitura

Gravada uma nica vez na fbrica

O processador s l os dados

PROM (Programable Read Only Memory)


o

Memria somente de leitura

Gravadas 1 vez por gravador PROM

O processador apenas l esta memria

EPROM (Erasable Programable Read Only Memory)


o

Memria apagvel por luz ultra-violeta

Pode ser gravada n vezes por gravador EPROM, em que

25

No definido pelo fabricante

O processador apenas l esta memria

EEPROM (Electrical Erasable Programable Read Only Memory)


o

Memria apagvel por luz ultra-violeta e por tenso eltrica (15 a 30V)

Pode ser gravada n vezes por gravador EEPROM, em que n definido pelo fabricante

O processador apenas l esta memria

Obs 1: Alguns MCU conseguem escrever nesta memria ao longo da execuo do programa, so chamados de memria EEPROM flash
Obs 2: As memrias PROM, EPROM e EEPROM no apagam seu contedo quando retira-se a alimentao.

26

Arquitetura

Nesta seo sero apresentados modos de arquitetura, uma de software e outra de


hardware, sendo que na seo de software ser enfatizada as arquiteturas CISC e RISC,
enquanto que na de hardware ser enfatizado a Princeton e Harward.

Arquitetura - CISC x RISC


Estas duas arquiteturas so distintas e caracterizam o conjunto de instrues presentes
em cada microcontrolador. As caractersticas de cada uma so:
!

CISC (Complex Instructions Set Computers)


o

Conjunto de intrues complexas

Compiladores mais complexos

RISC (Reduced Instructions Set Computers)


o

Conjunto menor de instrues

Grande nmero de registradores de propsito geral.

Instrues mais complexas so construdas a partir das mais simples

Utiliza Arquitetura Harward e Pipeline

27

Arquitetura de hardware (Princeton - Harward)


As duas principais principais arquitetura de hardware so Princeton e Harward. Estas duas arquiteturas so distintas e caracterizam o hardware e as conexes presentes em
cada microcontrolador.
!

Arquitetura Princeton
o

Programa, Pilha e variveis na mesma memria

Barramentos nico para memria de programa e de dados.

Arquitetura Harward
o

Programa, Pilha e variveis em unidades separadas

Barramentos diferentes para memria de programa e de dados.

28

Funcionamento do Microcontrolador

Para apresentar o funcionamento do Microcontrolador ser apresentado o modo de funcionamento pipeline, os ciclos de mquina e por fim, um resumo de funcionamento do
hardware.

Pipeline
Este modo de funcionamento de alguns Microcontroladores permitem utilizar alguns modos de arquiteturas especficos de software e hardware, aumentando a velocidade de processamento do Microcontrolador. Deste modo, algumas caractersticas so apresentadas
a seguir:

Abordagem simples: instrues com dois estgios. Enquanto o sistema executa uma

instruo, outra pode ser buscada na memria. Muito usada nos processadores atuais,
agilizando a execuo de operaes.
Problema: tempo de execuo , em geral, maior que tempo de busca (estgio de busca tem que esperar algum tempo.

29

Ciclos de mquina
Toda instruo executada em um ciclo de mquina (CM), em que um ciclo constitudo
pelas etapas Q1, Q2, Q3 e Q4, conforme descrito abaixo:

Um exemplo de execuo utilizando pipeline segue abaixo:

30

Funcionamento do Microcontrolador
O funcionamento de um Microcontrolador o resultado de cada componente que o ntegra, sendo assim, o funcionamento de cada um descrito a seguir.
!

ALU (Unid. Lgica e Aritmtica): Realiza to-

dos os clculos que envolvam registros e ou lgica para tomada de decises. Ligada e controlada pela CPU.
!

Linhas de I/O: As linhas de I/O so respons-

veis pela entrada ( I de input) e sada (O de


output ) do mesmo. Podem coletar dados, e atuar em processos atravs das mesmas.
!

Memria: Dividida em Memria de Programa,

Memria de dados, Registradores de configurao, Registradores Internos, Contador de programa, registro de endereo e de dados, etc.
!

CPU : Responsvel por todo o processamento de dados do Microcontrolador. Interpreta os comandos. Faz a leitura de dados. Ativa as portas de I/Os ou perifricos.
Possui conjunto de instrues prprio

Disp. Perifricos: Permitem maior flexibilidade ao MCU. Exemplos: USARTs e


ADC`s.

31

2
Linguagem C para
Microcontroladores PIC

Nesta primeira etapa, uma reviso sobre linguagem C realizada, abordando conceitos
bsicos de sintaxe, tipos de dados, funes, vetores, entre outros pontos importantes. O
compilador utilizado ao longo deste material o CCS C, sendo este utilizado pela facilidade do uso e da fcil aplicabilidade da linguagem C na configurao e operao dos Microcontroladores.

32

Compilador CCS C

As principais caractersticas do CCS C


so:

PCH: para dispositivos de 16 bits


(PIC18).

Ambiente integrado de desenvolvimento


(IDE): compilador PCWH;

Os mdulos podem ser adquiridos separados ou em um pacote completo;

Plataforma: Windows;

Compatibilidade com os padres ANSI


(no completamente j que algumas ca-

Abrangncia: sries PIC12, PIC14, PIC16


e PIC18;

ractersticas so especficas para PICs) e


ISO;

Previso: suporte para dsPIC;

Grande eficincia no cdigo gerado;

- Mdulos:

Grande diversidade de funes e bibliotecas da linguagem C (padro ANSI), tais

PCB: para dispositivos de 12 bits (PIC12


e PIC16C5X);
PCM: para dispositivos de 14 bits
(PIC14000 e PIC16xXXX);

como: Entrada/sada serial, manipulao


de strings e caracteres, funes matemticas C, etc.
33

Menu File

Item
New
Open

Close

Funo
Cria um novo arquivo
Abre um arquivo para o editor. Opes: Source, Project, Output, RTF, Flow Chart, Hex ou
Text. Atalho: Ctrl+O
Fecha o arquivo atualmente aberto na janela do editor. Note-se que enquanto um arquivo
est aberto para edio do PCWH nenhum outro programa pode acess-lo. Atalho: Shift+F11

Close All

Fecha todos os arquivos abertos no PCWH

Save

Salva apenas o arquivo que est sendo editado. Atalho: Ctrl+S

Save As
Save All

Compele o usurio a editar o nome e o local de armazenamento do arquivo que est em uso
antes que ele seja efetivamente salvo
Salva todos os arquivos abertos no PCWH
Gera um arquivo criptografado. A diretiva #include do compilador padro aceita os arquivos

Encrypt

com esta extenso e descriptografa durante a leitura. Isto permite distribuir arquivos sem
repassar o cdigo fonte

Print
Recent Files
Exit

Imprime o arquivo atualmente selecionado


O lado direito do menu apresentar uma lista com os arquivos recentemente utilizados no
PCWH
Encerra o PCWH

34

Aba Project

Item
Project

Funo
Abre um arquivo de um projeto existente (.PJT)
Este comando uma via rpida para iniciar um novo projeto. Uma janela ser aberta com

PIC Wizard

campos a serem preenchidos referentes a configurao de diversas caractersticas como


definio da pinagem (entrada ou sada, analgicos ou digitais), interrupes, converso A/D,
comunicao serial, etc.

24 bit

Tambm serve para iniciar um novo projeto, tal como o comando anterior, com a diferena

Wizard

que serve para as famlias PIC24 e dsPIC


Cria um novo projeto com a habilidade de adicionar/remover arquivos-fonte, incluir definies

Create

globais etc

Aba Compile

Item
Compile

Funo
Compila o programa atravs de erros, e gera o arquivo *.hex para carregar no Microcontrolador

35

Aba View

Item

Funo

Valid Interrupts

Apresenta as interrupes vlidas para cada tipo de PIC.

Valid Fuses

Apresenta as configuraes vlidas para cada tipo de PIC

Special Register

Apresenta os registros especiais para cada tipo de PIC.

36

Estrutura bsica da Linguagem C


Regras Bsicas
As regras bsicas da Linguagem C so:
Toda funo em C deve ser iniciada por um abre-chaves ({) e encerrada por um fechachaves (});
O nome, os parnteses e as chaves so os nicos elementos obrigatrios de uma funo;
Todas as instrues devem estar dentro das chaves;
As instrues em C so sempre encerradas por um ponto-e-vrgula (;);
Lembre-se de que as chaves tambm servem para separar um bloco de instrues.

Sintaxe da funo main


A palavra main em ingls significa principal, ento a funo main a funo
principal. O compilador procura esta funo para executar os comandos desejados em cada programa especfico. Deste modo, cada arquivo s deve ter apenas uma nica funo main, para no gerar dvidas na execuo do compilador.
A priori, todos os comandos e funes a serem executados devem estar dentro
desta funo main. Assim como todas as funes, a main delimitada por { no
comeo e por } no fim, e todos os comandos devem estar dentro, deste modo
a sintaxe exemplificada a seguir.

37

Comentrios
Os comentrios so partes do arquivo que o compilador no ir executar, ignorando-os na execuo. Para identificar existe duas maneiras, comentrio em
linha e em bloco.
Uma linha:

O que estiver a direita de // no computado na execuo do compilador.

Exemplo:

char contador; // Este um comentrio de uma linha, pois est depois do //

Em bloco:

O que estiver entre /* e */no computado na execuo do compilador.

Exemplo:

/*
IFCE Maracana
Microcontroladores
Tudo que est em vermelho um comentrio em bloco
*/

38

Identificadores
Identificadores so palavras usadas para declarar uma constante ou uma varivel, possuindo as seguintes regras no compilador CCS utilizando a linguagem C:
Um identificador no pode ter smbolos grficos, com exceo do underline (_);
No poder haver acentuao grfica (acento grave, acento agudo, til, trema, circunflexo
ou cedilha);
Um identificador no pode ser iniciado por nmero;
No pode ser uma palavra reservada;
Identificadores da Linguagem C:

auto
default
float
register
struct
volatile
break
do

return
switch
while
case
double
goto
short
typedef

else
if
signed
union
const
enum
int
sizeof

continue
extern
long
static
void
unsigned
char
for

Podem existir outros especficos de cada compilador.

39

Variveis e tipos de dados

Uma das principais limitaes e causas de falhas na programao de Microcontroladores


utilizando a Linguagem C so os tipos de dados empregados em cada aplicao. Isto
deve-se a alterao do tamanho dos tipos de dados quando comparados a compiladores
para execuo em computadores.

Tipos bsicos de dados


Os tipos bsicos de dados e seus respectivos tamanhos em bits so:

TIPO

TAMANHO EM BITS

MNIMO

MXIMO

char

255

int

255

float, float32

32

-1,510-45

3,41038

void

sem valor

sem valor

double: usada apenas em C ANSI, no usada nos Microcontroladores PICs.

40

Modificadores de tipo
So usados para conferir caractersticas especiais aos tipos de dados bsicos. So eles:
MODIFICADO
R

DESCRIO

signed

Representa tanto nmeros positivos quanto negativos

unsigned

Representa nmeros sem sinal

short

Determina que a varivel tenha um tamanho menor que o tipo


modificado
Determina que a varivel tenha um tamanho maior que o tipo

long

modificado

Tipos especficos do compilador CCS


Alguns tipos de dados so especficos do compilador CCS, criados para facilitar a programao e uso deste compilador. So eles:

TIPO
int1
boolean

DESCRIO
Especifica valores de 1 bit (equivale ao short int)
Especifica valores booleanos de 1 bit (equivale ao short int e ao int1)

int8

Especifica valores de 8 bits (equivale ao int)

byte

Especifica valores de 8 bits (equivale ao int e ao int8)

int16

Especifica valores de 16 bits (equivale ao long int)

int32

Especifica valores de 32 bits

41

Resumo dos dados disponveis no CCS C


TIPO

TAMANHO EM BITS

FAIXA DE VALORES

short int, int1, boolean

0 ou 1

char

0 a 255

signed char

-128 a 127

unsigned char

0 a 255

int, int8, byte

0 a 255

signed int, signed byte

-128 a 127

unsigned int, unsigned byte

0 a 255

long int , int16

16

0 a 65.535

signed long int

16

-32.768 a 32.767

unsigned long int

16

0 a 65.535

int32

32

0 a 4294967295

signed int32

32

unsigned int32

32

0 a 4294967295

float

32

-1,51045a 3,41038

-2147483648 a
2147483647

42

Declarao de variveis
Declarar varveis significa criar variveis para serem utilizadas como dados. Para o compilador significa alocar o espao de memria que ser utilizado. O local de memria atribudo a cada dado separadamente para cada varivel criada, ou melhor, declarada. Para
isto, existe duas maneiras:

Ao mesmo tempo que se declara uma varivel tambm possvel inicializar as mesmas
com algum valor. Deste modo, a inicializao de variveis na declarao pode ser feito da
seguinte maneira:

As variveis podem ser declaradas em 3 pontos distintos do programa: local, global e parmetro formal de funo.
Varivel global: declarada no corpo principal do programa (fora de qualquer funo, inclusive da main), podem ser acessadas de qualquer ponto do programa;

43

Varivel local: declarada dentro de uma funo (ou rotina), podendo ser acessadas somente enquanto a rotina estiver em operao ou execuo;
Varivel parmetro de funo: tipo especial de variveis locais, que assumem os valores passados como entrada na chamada das funes.

44

Declarao de constantes
Existe alguns tipos de dados que so declarados e criados, porm no variveis. Estes dados so chamados de constantes e so declarados antes da funo main e seu valor ser
o mesmo em toda a execuo do programa, no aceitando modificaes. Existe duas maneiras de declarar estes tipos de dados:

Representao numrica de constantes


As constantes podem ser representadas numericamente conforme os exemplos seguintes:

REPRESENTAO
NUMRICA

EXEMPLO

Decimal

250

Hexadecimal

0x55

Binrio
Octal
Caractere
String

0b10100011
73
&
teste

45

Operadores na Linguagem C

Os operadores so smbolos que representam uma funo prpria na execuo de um


programa da linguagem C. Sendo assim, os principais so:
Atribuio;
Aritmticos;
Relacionais;
Lgicos;
Lgicos bit a bit;
De memria.

Atribuio
Operador de atribuio =: atribuio de valores a variveis. A atribuio de um valor a
uma varivel simplesmente armazenar na posio de memria desta varivel um valor
conhecido. A varivel que ir receber o valor sempre fica esquerda do operador.
Exemplo:
x = 10; // Ao executar este comando a varivel x recebe o valor 10
y = x; // Ao executar este comando a varivel y recebe o valor da varivel x, ou seja, 10.

46

Aritmticos
Realizam operaes matemticas em relao a um ou mais dados.
OPERADOR

AO

Adio

Subtrao

Multiplicao

Diviso

Resto de diviso
inteira

++

Incremento

--

Decremento

Exemplo:
int y, x, a, b; //declarando as variveis y, x, a e b como do tipo inteiro.
x = 3; /* Atribuindo valor 3 para varivel x */
y = 2; /*Atribuindo valor 2 paa varivel y */
a = 5/y; /*Atribuindo para a o resultado da diviso de 5 por y, somente a parte inteira, pois
as variveis so inteiras. Assim 5 dividido por 2 d 2 e sobra 1, ento a recebe o valor 2*/
a = 5%y; /*Atribuindo para a o resto da diviso de 5 por y. Assim 5 dividido por 2 d 2 e
sobra 1, ento a recebe o valor 1*/
a = x - y; /*Atribuindo para a varivel a a diferena entre x e y. (3-2 = 1), ento a recebe 1*/
a++; /* Incrementa a varivel a em uma unidade, ento era 1, somando 1, passa para 2*/

47

x--; /* Decrementa em uma unidade a varivel x, ento era 3, diminuindo 1, passa para 2*/
b = 3*4 + 2*1 - 3*1; /*Quando so chamadas diversas expresses aritmticas, prevalece a
ordem da matemtica, sendo primeiro calculada a multiplicao e diviso, depois soma e
subtraco. Deste modo, o resultado 12+2-3 = 9, ento b recebe o valo 9.*/

Relacionais
Utilizados em testes condicionais para determinar a relao existente entre dados. Isto
ocorre principalmente para verificar se alguma condio est sendo obedecida, sendo comum nas estruturas if, for, while, entre outras que sero tratadas posteriormente.
OPERADOR

AO

>

Maior que

>=

Maior ou igual a

<

Menor que

<=

Menor ou igual a

"

==

"

!=

Igual a
Diferente de

Lgicos Booleanos
Realizam conjunes, disjunes ou negaes entre elementos em um teste condicional.

OPERADOR

AO

&&

AND (E)

||

OR (OU)

NOT (NO)

Resultam em V ou F, exemplo:
int x, y;x = 10;
if(x > 5 && x < 15)
{y=1}; //se x maior que 5 e menor que 15, y=1
else
{y=0;} //se x menor que 5 ou maior que 15, y=0
48

Lgicos bit a bit


Realizam operaes matemticas em relao a um ou mais dados, o resumo dos principais tipos esto na tabela a seguir, e a descrio dos mesmos esto logo a seguir.
OPERADOR

AO

&

AND (E)

OR (OU)

XOR (OU exclusivo)

NOT (complemento de um)

>>

Deslocamento a direita

<<

Deslocamento a esquerda

Operador & (E)


Definio: Este operador faz o equivalente a uma operao AND booleana, em que as
operaes so realizadas bit a bit.
Exemplo:

Decorrncia:

49

Operador | (OU)
Definio: Este operador faz o equivalente a uma operao OR booleana, em que as operaes so realizadas bit a bit.
Exemplo:

Decorrncia:

Operador ^ (OU exclusivo - XOR)


Definio: Este operador faz o equivalente a uma operao XOR booleana, em que as
operaes so realizadas bit a bit.
Exemplo:

Decorrncia:

50

Operador ~ (NOT - Inversor)


Definio: Este operador faz o equivalente a uma operao inversora booleana, em que
as operaes so realizadas bit a bit.
Exemplo:

Decorrncia:

Operador << (Deslocamento esquerda)


Definio: Este operador faz o equivalente a uma operao SHIFT REGISTER, em que as
operaes so realizadas deslocando cada bit para esquerda.
Exemplo:

Decorrncia:
10 decimal

Resultado

=
<<

00001010
00010100

<<
=
00101000

(1 vez)
(2 vezes)

51

Operador >> (Deslocamento direita)


Definio: Este operador faz o equivalente a uma operao SHIFT REGISTER, em que as
operaes so realizadas deslocando cada bit para esquerda.
Exemplo:

Decorrncia:
10 decimal

=
<<

00001010

00000101
<<
Resultado =
10000010

(1 vez)
(2 vezes)

52

Funes de controle

As declaraes de controles so as responsveis por executar comandos quando condies so ou no obedecidas. Os principais so descritos a seguir.

Comando if-else
O comando if verifica se uma condio foi obedecida. Quando esta obedecida todos os
comando que estiverem dentro das chaves que delimitam esta declarao de controle sero executadas. J o comando else optativo, e os comandos dentro desta declarao
de controle sero executados quando a condio do if no for obedecida. Quando existe
apenas um comando no bloco do if, ento as chaves podem ser descartadas.
Sintaxe bsica:

Exemplo: Neste exemplo quando a varivel tecla possui valor 1, ento a varivel led recebe valor 1, caso contrrio a varivel led recebe valor 0.

53

Esta declarao de controle possui uma variao permitindo a criao de um if depois de


um else, criando a estrutura if-else-if, em que o segundo somente ir ser analisado caso
o primeiro if no tenha sua condio obedecida. Exemplo da estrutura if-else-if:

Outra variao desta declarao de controle chamada de if aninhados, em que um if


colocado dentro de outro, conforme apresentado a seguir:

Comando switch
O comando switch funciona como mltipla escolha, em que a varivel que est dentro
dos parnteses do switch, seleciona quais comandos sero executados. As opes so
apresentadas por cada case, e quando a varivel do switch assume o valor de um dos cases, ento os comandos respectivos a este case sero executados. A sintaxe desta funo est apresentada a seguir.
Sintaxe:

54

Exemplo: Neste exemplo abaixo, a varivel sensor do tipo char, e por isto as mltiplas
escolhas definidas em cada case esto entre aspas simples ( ), por se tratar de um caracter. Neste switch existem dois casos e um default, em que o primeiro caso ocorre
quando a varivel sensor o caracter L, e quando isto ocorre apenas a funo liga_lampada( ) executada, e posteriormente a execuo do programa sai do switch. O segundo caso quando a varivel sensor possui valor D, e quando isto ocorre apenas a funo desliga_lampada( ) executada, e posteriormente a execuo do programa sai do
switch. Quando nenhuma alternativa corresponde a um case, ento a opo default
executada, que neste caso executar a funo pisca_lampada( ).

Comando while
O comando while (palavra em ingls para enquanto), verifica se uma condio obedecida, executando um bloco de comandos quando verdade, do mesmo modo que o comando if. Entretanto, depois de executar o bloco, retorna para a condio, executando tudo
novamente enquanto a condio for obedecida.
Sintaxe:

55

Exemplo 1: No exemplo abaixo a varivel tecla recebe valor 0, e no primeiro while ser
avaliado se esta varivel possui valor 1, como no possui, ento ir saltar todos os comandos deste while, portanto a funo pisca_led_1( ) nunca ser executada. J quando for ser
avaliado pelo segundo while, a varivel tecla estar com valor 0, obedecendo a condio
deste while e executando suas funes, que no caso a pisca_led_2( ). Assim que os comandos do while forem executados, a condio volta a ser avaliada, e caso continue sendo verdadeira ir executar novamente seus comandos. Deste modo, a funo pisca_led_2( ) ser executada infinitamente, j que tecla sempre ser 0, seguindo estes comandos listados dentro do while.

Comando do-while
Este comando semelhante ao while, sendo a diferena do do-while em relao ao while que agora o teste da condio feito somente aps a execuo dos comandos. Deste modo, os comandos so executados pelo menos uma vez, independente se a condio obedecida ou no.
Exemplo 1: No exemplo abaixo a varivel tecla recebe valor 1, em seguida executa a funo pisca_led_1( ) e na condio do comando do-while ser avaliado se esta varivel possui valor 0, como no possui, ento ir sair deste bloco de comandos, mas executou as
instrues pelo menos uma vez, mesmo que a condio seja falsa desde o comeo.

56

Comando for
O comando for funciona como um loop, em que a quantidade de vezes que o bloco de comando executado definido por uma determinada varivel. O fluxo de execuo apresentado na sintaxe abaixo, seguindo a ordem de 1 a 4.
Sintaxe:

Esta varivel primeiramente inicializada (Etapa 1), em seguida verifica-se uma condio
utilizando esta varivel (Etapa 2). Caso a condio seja obedecida, o bloco de comandos
executado (Etapa 3), e, por fim, esta varivel incrementada (Etapa 4). As etapas 3 e 4
continuam a ser executadas enquanto a condio da etapa 2 for obedecida.
Exemplo: No exemplo abaixo, a varivel x incivilizado com valor 0, em seguida verificado se x menor ou igual a 10, como a condio obedecida, ento a varivel y recebe 3
vezes o valor de x que zero. Posteriormente x incrementado em uma unidade, era 0 e
passa para 1. A condio ser checada, obedecida, as instrues do for executada e x incrementado sequencialmente, at que x deixe de ser menor ou igual que 10.

57

Funes e Bibliotecas na Linguagem C

Uma funo em Linguagem um conjunto de operaes predefinidas e organizadas de


acordo com um fluxograma. A funo main obrigatria em todos os programas, sendo o
exemplo mais conhecido. Entretanto, outras funes podem ser criadas para facilitar operaes especficas, inclusive com reaproveitamento de cdigo. Estas funes podem estar no mesmo arquivo da funo main, ou em arquivos separados, o que nestes casos,
esse arquivo denominado biblioteca. Estes temas so abordados com mais detalhes a
seguir.

Funes
Como j foi dito, uma funo um conjunto de comandos ordenados previamente. Estas
so criadas para facilitar uma operao que repete-se rotineiramente, inclusive com reaproveitamento em projetos distintos, facilitando a programao desta operao por necessitar fazer apenas uma vez, diminuindo o tempo de desenvolvimento de um projeto maior.

A sintaxe de um funo sempre a mesma, possuindo uma entrada que ser proces-

sada de acordo com os comando descritos na funo, gerando uma sada. Isto ocorre
sempre que esta funo chamada.
Sintaxe:

58

Exemplo: Um exemplo de uso de uma funo descrito abaixo, em que a funo chamada soma possui duas entradas do tipo inteiro (int) var1 e var2. Dentro da funo estas variveis so somadas e retornadas em forma de (int) na varivel res.

Esta funo soma pode ser implementada no compilador CCS de duas maneiras, sendo
estas descritas a seguir.
Modo 1:

Modo 2:

No modo 1, a funo declarada antes da funo main, porm s implementada depois


desta mesma funo. Esta declarao somente para indicar que a funo existe e que
est implementada em algum ponto do arquivo.
J o modo 2, j declara a funo e implementa antes da funo main, deste modo as duas etapas do modo 1 so realizadas ao mesmo tempo. Neste modo, as variveis de entra-

59

da j so somadas e retornadas, sem o armazenamento de uma varivel temporria,


como a varivel res do modo 1.
Nunca pode-se chamar uma funo sem que ela tenha sido declarada anteriormente. Isto
ocorre devido a Linguagem C funcionar compilando o cdigo de cima para baixo, e ocorrer um erro indicando que esta funo no existe caso nenhum dos modos descritos
seja seguido.
Ressalta-se que podem ser criadas funes com vrias entradas e tipos de dados, inclusive alterando os tipos de retorno. Esta seco aborda apenas um conceito inicial necessrio para entender alguns pontos mais frente neste livro.

Bibliotecas
Uma biblioteca um conjunto de funes agrupadas em um mesmo arquivo, servindo
como um conjunto de funes que pode ser usada pelo usurio sempre que for necessrio. Funciona como uma biblioteca de livros, que possui vrios a disposio, mas so usados somente quando necessrio.
As bibliotecas em Linguagem C so criadas com dois arquivos, um arquivo cabealho e
um arquivo de implementao. O arquivo cabealho possui a extenso .h devido o termo
header em ingls que significa cabealho. O arquivo de implementao possui a extenso .c j que um arquivo compilvel. Os dois arquivos esto associados por possurem
o mesmo nome.
O arquivo cabealho utilizado para declarar todas as funes presentes na biblioteca,
servindo para que usurio da biblioteca saiba as funes que esto disponveis. Fazendo
a analogia a biblioteca de livros, funciona como um catlogo dos livros presentes na biblioteca. Neste arquivo no realizado a implementao.
A implementao de cada uma das funes declaradas no arquivo cabealho realizada
no arquivo compilvel (.c) , pois somente um arquivo compilvel pode processar as entradas e gerar sadas no compilador, que no nosso caso o CCS C.

60

A seguir demonstrado uma biblioteca de uma calculadora chamada calc, nela existem
quatro funes: soma, subtrao, multiplicao e diviso. No arquivo compilvel ou de implementao (calc.c) as funes so implementadas de acordo com suas entradas, operaes e sadas. J o arquivo de cabealho (calc.h), possui todas as funes disponveis
para o usurio da biblioteca da calculadora.
1. Arquivo calc.h

2. Arquivo calc.c

61

3. Arquivo main.c

De forma resumida, tm-se que o arquivo que possui a funo main( ) chama as funes
da biblioteca criada anteriormente. Para isto, basta adicionar a linha #include calc.h que
inclui a biblioteca calc que est no mesmo diretrio do arquivo da funo main.

62

Vetores (Arrays)

Conjunto de elementos do mesmo tipo agrupados em uma mesma varivel. Estes elementos so ordenados por um ndice, devendo ser declarados e trabalhados de maneira adequada, devido os mesmos serem tipos de dados distintos dos demais vistos anteriormente. A seguir so detalhados as maneiras adequadas de criar e manipular estes tipos de dados.

Declarao ou instanciao
Existe dois tipos de alocao do tamanho dos vetores, a dinmica e a esttica. A programao para microcontraldores aceita apenas a esttica, em que o tamanho do vetor definido previamente e no ser alterado ao longo da execuo do cdigo inteiro. Isto ocorre
visto que as variveis devem ser alocadas no comeo de cada programa para que o compilador CCS C no apresente nenhum erro. A alocao dinmica aloca a memria medida que ela ser necessria, porm esta metodologia no aceita pelo compilador utilizado devido o tamanho ser exigido no comeo da execuo. Sendo assim, seguem abaixo
exemplo da alocao de memria no modo esttico.
Exemplo:
int vet1[30]; // declarao do vetor vet1 do tipo inteiro (int) e com 30 posies.
float vet2[20]; // declarao do vetor vet2 do tipo inteiro (float) e com 20 posies.
char vet3[10]; // declarao do vetor vet3 do tipo inteiro (char) e com 10 posies.

63

Atribuio
A atribuio a etapa de atribuir valores s posies do vetor criados previamente. Cada
vetor com N posies de memria alocadas possui seu ndices de ordenao comeando
com valor 0 e terminando em N-1.
Por exemplo, um vetor com 30 posies possui seus ndices comeando em 0 e terminando em 29, o que totaliza 30 posies alocadas. Cada posio funciona como uma varivel
comum, podendo receber algum valor ou ser usada para calcular outra varivel, conforme
exemplos a seguir.
Exemplo:
int vet[30]; // declarao do vetor vet do tipo inteiro (int) e com 30 posies.
vet[0]=10; // Atribuio da posio 0 do vetor vet com valor 10 .
vet[1]=20; // Atribuio da posio 1 do vetor vet com valor 20 .
vet[2]=vet[0]+vet[1]; // Atribuio da posio 2 do vetor vet com valor vet[0]+vet[1]

// Considerando que vet[0] 10 e vet[1] 20, vet[2] receb 30.

Percorrendo vetor completo (Varrendo vetor)


Para percorrer um vetor completo basta criar um bloco utilizando o comando for e utilizar
a varivel de incremento do for como varivel de indexao do vetor criado, ressaltando
que este for deve percorrer toda a extenso do vetor, podendo ser na ordem crescente ou
decrescente.
O exemplo a seguir utiliza um for utilizando uma varivel k recebendo o valor 0 inicialmente e indo at o valor tam_vet, sendo incrementada de 1 em 1 ( k++ ). No exemplo 1, o ve-

64

tor vet possui 30 posies, ento o valor tam_vet 30, mesmo valor da quantidade de posies, sendo todas as posies zero aps o comando for.
Exemplo 1 - Zerando as 30 posies do vetor vet.

Exemplo 2 - Atribuindo para cada posio de vet o valor do seu ndice

Exemplo 3 - Zerando todas as posies de vetor vet. Reflita como!!!

65

Diretivas do compilador

As diretivas do compilador a seguir so comandos prprios do compilador CCS, podendo


ser utilizadas para facilitar algumas configuraes e execuo de tarefas especficas. A seguir so descritas algumas destas diretivas.

#ASM e #ENDASM
Utilizada para inserir cdigo assembly diretamente em um programa em C. Deste modo,
algumas subrotinas j implementadas em Assembly podem ser incorporadas a um programa em Linguagem C sem precisar ser implementado nesta nova linguagem de programao.
Sintaxe:

Exemplo:

66

#define
Utilizada para substituir o identificador pelo texto especificado imediatamente depois
dele. Facilitando o uso de funes e variveis pelo usurio.
Sintaxe:

Exemplo:

#fuses
Utilizada para programar as opes da palavra de configurao dos PICs.
Sintaxe:

Exemplo:

67

#use rs232
Ativa o suporte a comunicao serial (RS-232). Alm disto apresenta as configuraes utilizadas na comunicao via RS-232, entretanto este assunto ser abordado posteriormente
com mais detalhes.
Sintaxe:

Exemplo:

#use delay
Informa ao compilador a velocidade de clock do sistema de destino. Deve ser o mesmo
valor do cristal utilizado no hardware conectados aos pinos OSC1 e OSC2.
Sintaxe:

Exemplo:

68

3
Projeto bsico de
hardware e software

Nesta unidade iro ser apresentadas as configuraes bsicas de hardware e software


para que as aplicaes do restante do livro possam ser executadas de forma adequada.
Todas as aplicaes do livro devem ter este hardware bsico para poder funcionar adequadamente, e devem seguir as orientaes do software bsico para que sejam executados
com sucesso.

69

Configurao bsica de hardware

A configurao bsica do hardware do PIC 18F2550 so 3 componentes: reset, oscilador


e alimentao. Estes elementos no podem faltar em nenhuma aplicao, sendo necessrios para que qualquer uma funcione adequadamente. O que diferencia as aplicaes so
os outros componentes acrescidos aos componentes bsicos. Este hardware bsico
apresentado abaixo.

1 - Pinos 20 e 19 - Alimentao
Estes pinos devem ser alimentados com 0V o
pino 19 e 5V o pino 20 para que o MCU possa
funcionar adequadamente. Nunca troque os
nveis de tenso ou passe de 5,5 V a alimentao do pino 20, pois nestes casos o
MCU ir ser danificado.

70

2 - Pino 1 - Funo MCLR - Este pino


serve para reset da aplicao, fazendo
que a execuo do programa seja reiniciada sempre que este pino for para 0V
e retornar para 5V. Do modo que est
apresentado no hardware ao lado, o
programa ir apenas iniciar a execuo, e para reset deve-se alterar este
hardware.
3 - Pinos 9 e 10 - Oscilador - Estes pinos controlam a execuo das instrues, determinando os ciclos de mquina e incrementando o contador de programa. Deve-se ligar um cristal e dois capacitores cermicos do modo apresentados, onde estes valores so determinados pelo fabricante. Abaixo so descritos
os valores para o PIC 18F2550.

Todos os projectos e exemplos deste livro foram testados com cristal de 20 MHz e capacitores de 22pF, obedecendo o que o fabricante pede, j que sua exigncia que seja maior do que 15 pF.

71

Exemplo de fonte de alimentao


Dentre as formas de alimentao, pode-se utilizar fontes de alimentao reguladas, 4 pilhas de 1,5V em sria, somando-se 6V e colocar um diodo em srie para cair 0,7 V e ficar
com 5,3V. Outra maneira seria utilizar a prpria USB, mas necessrio circuito de proteo adequado para no danificar o MCU e o PC. So vrias as alternativas, mas aconselha-se que utilize fontes reguladas de tenso ou bancadas com tenso reguladas em 5V.
Embora no seja o foco deste livro, segue abaixo um exemplo de fonte de alimentao de
5V utilizando uma fonte de 12V, muito comum em aparelhos celulares diversos.

Componentes:
Capacitor 100uF/50V, Capacitor 10uF/25V, Conector KRE02, Regulador LM7805, Diodo
1N4007, 02 Capacitores 100nF, Fios e conectores.

72

Configurao bsica de software

Abaixo esto descritos os principais componentes do software e uma breve descrio de


cada etapa necessrios para rodar o programa e gravar com sucesso no Microcontrolador
PIC18F2550.

73

Metodologia de debug, gravao e testes

Todos as prticas desenvolvidas e apresentadas ao decorrer deste livro foram simula-

das e testadas em Protoboard e, posteriormente, projetadas em placas de Circuito Impresso.


A simulao da execuo dos projetos deste livro foi realizada no software Proteus,

que permite montar o circuito do hardware de cada aplicao, carregar o programa, alm
de

executar as operaes pr-programadas. Este software permite carregar o arquivo

*.hex e o *.cof, sendo o primeiro arquivo para o modo EXECUO e o segundo para o
modo DEBUG, onde possvel acompanhar a execuo das operaes e o valor das variveis passo-a-passo. Vale ressaltar que o simulador no prev algumas protees necessrias para o sistema, como a necessidade de resistores e reguladores, por exemplo.

A gravao dos programas no Microcontrolador PIC18F2550 foi realizada utilizando o

PICKIT 2 da Microchip e seus programas. Aps gravar os Microcontroladores, todos os circuitos e aplicaes foram testados em Protoboard, utilizando a fonte de tenso controlada demonstrada na Seo 3.1.

Vale ressaltar que todas as aplicaes devem ter o hardware bsico, uma fonte de ali-

mentao controlada em 5V e obedecer ao software bsico para que a gravao e a execuo sejam realizadas com sucesso.

Detalhes e dvidas, por favor, contactar o autor, visto que este livro no tem este en-

foque e todos estes softwares so bem difundidos e possuem material de fcil acesso.

74

4
Entrada e sada de
dados digitais

Nesta unidade sero abordados as funes bsicas do CCS, como funes de espe-

ra, funes de entrada e sada digital para pinos e funes de entrada e sada digital para
portas. A configurao do sentido das portas tambm ser abordada e exemplos sero
apresentados.

75

Funes de espera

Como sugere o nome destas funes, elas implementam um atraso na execuo do programa quando so chamadas. Estas funes param o programa quando so chamadas,
esperando o tempo programado na linha de comando em que o comando foi executado.
Este tempo de espera pode ser especificado em ciclos, microssegundos ou milissegundos, sendo a funo para cada um apresentado a seguir.

Atraso em ciclos
Descrio: Aguarda n ciclos de mquina.
Funo:

DELAY_CYCLES

Sintaxe:

DELAY_CYCLES ( n ) ;

Exemplo:

DELAY_CYCLES ( 5 ) ;

Observao: A escrita da funo tambm pode ser em minsculo.

Atraso em microssegundos
Descrio: Aguarda n microssegundos.
Funo:

DELAY_US

Sintaxe:

DELAY_US ( n ) ;

Exemplo:

DELAY_US ( 10 ) ;
76

Observao 1 : A escrita da funo tambm pode ser em minsculo.


Observao 2: Quando n estiver com valor 1.000.000, isto representa 1 segundo. Entretanto, esta relao s ir funcionar se o hardware e o software estiverem com valores de
clocks iguais, o cristal no hardware e o #use delay no software.

Atraso em milisegundos
Descrio: Aguarda n milisegundos.
Funo:

DELAY_MS

Sintaxe:

DELAY_MS ( n ) ;

Exemplo:

DELAY_MS ( 10 ) ;

Observao 1 : A escrita da funo tambm pode ser em minsculo.


Observao 2: Quando n estiver com valor 1.000, isto representa 1 segundo. Entretanto,
esta relao s ir funcionar se o hardware e o software estiverem com valores de clocks
iguais, o cristal no hardware e o #use delay no software.

77

Pinos de entrada e sada digitais no PIC


18F2550

As funes de entrada e sada de dados em um Microcontrolador baseia-se nas funes


de entrada e sada de bits em pinos especficos do hardware do mesmo. Cada um destes
pinos pode assumir o valor de um bit, podendo ser 0 ou 1 no software, o que representa
0V ou 5V no pino do hardware, respectivamente. Cada grupo de 8 pinos forma uma porta,
podendo ser processado como 1 byte.
Isto possvel porque 1 byte so 8 bits, do mesmo modo que 1 porta so 8 pinos, e do
mesmo modo que cada pino pode assumir os valores 0 e 1 por ser apenas 1 bit, ento
uma porta pode assumir o valor de 8 bits, podendo assumir qualquer valor entre 0 e 255,
que so os valores possveis de 1 byte.
A seguir so apresentados os pinos de um microcontrolador PIC do tipo 18F2550, apresentando todas as funes dos 28 pinos presentes neste microcontrolador.

De forma resumida, tem-se que o microcontrolador 18F2550 possui 3 portas, sendo que a
porta A possui 7 pinos, a porta B 8pinos e a porta C so 7 pinos. Entretanto, todos os registrados de dados destas portas possuem 8 bits, sendo que a porta que no possui 8 pi-

78

nos deve-se ausncia apenas no hardware, pois no registrador esta sada teoricamente
existe.
Resumo:
!

Porta A com 7 pinos

Porta B com 8 pinos

Porta C com 7 pinos

Total de 22 pinos de I/O

Pinos de Entrada/Sada digitais ( 1 bit )


O Microcontrolador 18F2550 possui 22 pinos digitais de Entrada ou Sada de dados, sendo cada um deles respectivo a 1 bit especfico na memria do Microcontrolador. Estes pinos so agrupados de 8 em 8 pinos, o que totaliza 3 portas digitais. Estes pinos so apresentados abaixo. Vale a penas ressaltar que todos pinos possuem mais de uma funo, e
deve-se habilitar a instruo que deseja e desabilitar as demais. Em muitos casos o CCS
j faz isto automaticamente, necessitando realizar estas configuraes em outros. Caso
fossemos utilizar outro compilador precisaramos realizar TODAS as configuraes.

79

Porta Digital A de Entrada/Sada (8 bits, mas somente 7 pinos)


Ao lado so apresentados o grupo de pinos que forma a porta A.
O software possui a memria da
porta A com 8 pinos, mas o
hardware possui apenas 7, devendo a ausncia deste pino ser prevista no software.
Os pinos apresentam as funes
RA0, RA1, RA2, RA3, RA4, RA5,
RA6, faltando o RA7.

Porta Digital B de Entrada/Sada (8 bits e 8 pinos)


Abaixo so apresentados o grupo
de pinos que forma a porta B. O
software possui a memria da porta A com 8 pinos e o hardware tambm.
Os pinos apresentam as funes
RB0, RB1, RB2, RB3, RB4, RB5,
RB6 e RB7, no faltando nenhum
pino.

80

Porta Digital C de Entrada/Sada (8 bits, mas somente 7 pinos)


Ao lado so apresentados o grupo de
pinos que forma a porta C. O software possui a memria da porta C com
8 pinos, mas o hardware possui apenas 7, devendo a ausncia deste
pino ser prevista no software.
Os pinos apresentam as funes
RC0, RC1, RC2, RC4, RC5, RA6 e
RC7, faltando o RC3.

81

Funes I/O de pinos digitais

Um pino pode possuir dois estados ( 0 ou 1, alto ou baixo, 0 ou 5V). Para aumentar sua
funcionalidade, os mesmos pinos podem ser usados tanto como sada quanto como entrada. Para definir um pino de uma porta como entrada ou sada, preciso definir os bits do
registrador TRIS como 1, para entrada, ou 0, para sada. Cada pino tem o seu registrador
TRIS correspondente e isto ser abordado adiante.
Seguem abaixo as funes do compilador CCS para leitura e sada dos pinos do Microcontrolador.

Colocar um pino para 0V, nvel lgico baixo


Descrio: Coloca o pino especificado do microcontrolador em nvel lgico 0, que corresponde a tenso de 0V.
Funo:

OUTPUT_LOW

Sintaxe:

OUTPUT_LOW ( PINO ) ;

Exemplo:

OUTPUT_LOW ( PIN_B1 ) ;

Observao 1: A escrita da funo tambm pode ser em minsculo.


Observao 2: A identificao dos pinos dada pelo sufixo PIN_ , seguido por sua porta
e por sua numerao. Deste modo, o exemplo apresentado est colocando para 0V o
pino 1 da porta B atravs do nome PIN_B1.

82

Colocar um pino para 5V, nvel lgico alto


Descrio: Coloca o pino especificado do microcontrolador em nvel lgico 1, que corresponde a tenso de 5V.
Funo:

OUTPUT_HIGH

Sintaxe:

OUTPUT_HIGH ( PINO ) ;

Exemplo:

OUTPUT_HIGH ( PIN_B1 ) ;

Observao 1: A escrita da funo tambm pode ser em minsculo.


Observao 2: A identificao dos pinos dada pelo sufixo PIN_ , seguido por sua porta
e por sua numerao. Deste modo, o exemplo apresentado est colocando para 5V o
pino 1 da porta B atravs do nome PIN_B1.

Colocar um pino especfico para o valor desejado


Descrio: Coloca o pino especificado do microcontrolador em nvel lgico desejado, sendo OV quando o valor for 0 e 5V quando o valor for 1. ( Resumo: 0->0V , 1->5V ).
Funo:

OUTPUT_BIT

Sintaxe:

OUTPUT_BIT ( PINO , VALOR ) ;

Exemplo:

OUTPUT_HIGH ( PIN_B1 , 1 ) ;

Observao 1: A escrita da funo tambm pode ser em minsculo.


Observao 2: A identificao dos pinos dada pelo sufixo PIN_ , seguido por sua porta
e por sua numerao. Deste modo, o exemplo apresentado est colocando para 5V o
pino 1 da porta B atravs do nome PIN_B1. Isto porque o valor colocado na funo 1.

83

Ler um pino especfico


Descrio: Ler o pino especificado do microcontrolador, caso ele esteja com nvel lgico
alto, a funo retorna 1. Caso ele esteja com nvel lgico baixo, retorna 0.
Resumo:
o

Retorna 0 quando pino est 0V

Retorna 1 quando pino est 5V

Funo:

INPUT

Sintaxe:

INPUT ( PINO ) ;

Exemplo:

int a = INPUT ( PIN_B1 ) ;

Observao 1: A escrita da funo tambm pode ser em minsculo.


Observao 2: A identificao dos pinos dada pelo sufixo PIN_ , seguido por sua porta
e por sua numerao. Deste modo, o exemplo apresentado est lendo o pino 1 da porta
B atravs do nome PIN_B1. Aps executar esta instruo, a varivel a assumir o valor 1
caso o pino esteja com 5V ou o valor 0 caso o pino esteja com 0V.

84

Funes I/O de portas digitais

Uma porta um conjunto de pinos em um MCU que podem ser acessados simultaneamente. Para aumentar sua funcionalidade, os mesmos pinos de cada porta podem ser
usados tanto como sada quanto como entrada, podendo ser parte destes usado como
sada e o restante como entrada se for o caso. Para definir um pino de uma porta como
entrada ou sada, preciso definir os bits do registrador TRIS como 1, para entrada, ou 0,
para sada. Cada porta tem o seu registrador TRIS correspondente, que so a juno dos
registradores individuais de cada pino. O PIC18F2550 tem trs portas: A, B e C.

Colocar 8 bits (1 byte) na sada de uma porta


Descrio: Coloca um byte na porta X do microcontrolador, em que X pode ser A, B ou C
para o PIC18F2550. A varivel valor dos exemplos abaixo podem assumir qualquer valor
da faixa de 0 a 255 j que corresponde a 1 byte.
Funo:

OUTPUT_X

Sintaxe: OUTPUT_A( valor ) ;


!
!
OUTPUT_B( valor ) ;
!
!
OUTPUT_C( valor ) ;
Exemplo:

OUTPUT_A ( 255 ) ;

Observao 1: A escrita da funo tambm pode ser em minsculo.


Observao 2: A identificao da porta A, B ou C na posio onde se encontra a varvel
X na apresentao da funo. Os valores enviados para a porta podem estar em qualquer
sistema numrico (binrio, octal, decimal ou hexadecimal), desde que esteja entre 0 e 255
do sistema decimal.
85

Exemplos

Exemplo 1:

OUTPUT_B ( 0X29

Exemplo 2:

OUTPUT_B ( 129 ) ;

129$$$$$$$$$$Decimal$
$

$1$$$0$$$0$$$0$$$0$$$0$$$0$$$1$.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
RB7$$RB6$$RB5$$$RB4$$RB3$$RB2$$RB1$$RB0$
128$$_64$$$32$$$$$$$$$$16$$$$$8$$$$$$$4$$$$$$$2$$$$$$$1$$$.$

Exemplo 3:

OUTPUT_B ( 0B10101010 ) ;

86

Ler um valor de 8 bits da entrada de uma porta


Descrio: Ler um byte da porta X do microcontrolador, em que X pode ser A, B ou C
para o PIC18F2550. O valor de leitura da porta pode ser qualquer valor da faixa de 0 a
255 j que corresponde a 1 byte.
Funo:

INTPUT_X

Sintaxe: valor = INPUT_A ( ) ;


!
!
valor = INPUT_B ( ) ;
!
!
valor = INPUT_C ( ) ;

Observao 1: A escrita da funo tambm pode ser em minsculo.


Observao 2: A identificao da porta A, B ou C na posio onde se encontra a varvel
X na apresentao da funo. Os valores enviados para a porta podem estar em qualquer
sistema numrico (binrio, octal, decimal ou hexadecimal), desde que esteja entre 0 e 255
do sistema decimal.

Exemplo:
!

unsigned int var;


var = input_a( );

Analisando exemplo: supondo que a varivel var


recebe o valor 121, ento isto quer dizer que a
leitura dos 8 pinos da porta A 129. Convertendo este valor para binrio, tem-se que os pinos
B7 e B0 esto com 5V, enquanto todos os outros esto com 0V.

129$$$$$$$$$$Decimal$
$

$1$$$0$$$0$$$0$$$0$$$0$$$0$$$1$.$$$$$$$$$$
RB7$$RB6$$RB5$$$RB4$$RB3$$RB2$$RB1$$RB0$
128$$_64$$$32$$$$$$$$$$16$$$$$8$$$$$$$4$$$$$$$2$$$$$$$1$$$.$

87

Configurao do sentido de I/O digitais

Um pino pode possuir dois estados (0 ou 5V) e pode funcionar como entrada ou sada de
dados. Cada porta possui um registrador TRIS, que controla a direo do fluxo de dados
nos pinos. As configuraes do TRIS podem ser:
Padro
Fixo
Rpido

Modo Padro
Descrio: Compilador adiciona cdigo para configurar o registrador TRIS e tornar um
pino entrada ou sada conforme instruo executada.
Diretiva de configurao:
!
!
!

#use standard_io (porta)

Exemplo:

OUTPUT_HIGH ( PIN_B0 ) ;

Cdigo do compilador gerado:

!
!
!
!

!
!
!
!

BSF!
BCF!
BCF!
BSF!

!
!
!
!

STATUS.5!
TRISB.0!
STATUS.5!
TRISB.0

88

Compilador sempre gera cdigo de configurao do compilador TRIS, mesmo que o

acesso seja sequencial.


Desvantagem: operao mais lenta quando h intensa utilizao das portas de E/S;
Vantagens: Facilidade de uso e Pino permanece sempre no ltimo estado configurado.

Exemplo de aplicao no Modo Padro


Neste exemplo, a porta C foi configurada no modo padro, deste modo os pinos so configurados automaticamente de acordo com o seu uso.
Primeiramente, os pinos C0, C1 e C2 so colocados para alto, esperam 200 milisegundos. Em seguida, os mesmos pinos so colocados para baixo e esperam os mesmos 200
milisegundos.
Devido sua configurao automaticamente, os pinos iro executar exatamente o que foi
solicitado.
#include <18f2550.h>
#fuses HS
#use standard_io(c)
#use delay(clock = 20000000)
main()
{
!
while (1)
!
{
!
!
output_high(pin_c0);
!
!
output_high(pin_c1);
!
!
output_high(pin_c2);
!
!
delay_ms(200);
!
!
output_low(pin_c0);
!
!
output_low(pin_c1);
!
!
output_low(pin_c2);
!
!
delay_ms(200);
!
}
}

89

Modo Fixo
Descrio: Determina ao compilador quais os pinos especificados sero utilizados sempre como sadas. Nenhuma funo de programao altera codificao prvia do registrador TRIS.
Diretiva de configurao:
!
!
!

#use fixed_io (portaX_outputs = pinos)

Exemplo:

#use fixed_io (c_outputs = pin_c0, pin_c1 )

Exemplo na execuo aps configurao do exemplo anterior,


em vermelho:

!
!
!

int x;
output_low(pin_c0);
x = input (pin_c0);
output_low (pic_c2);

Sabendo que os pinos C0 e C1 so configurados como sada e os demais da porta C


como entrada, ento as seguintes concluses so possveis:
!

output_low(pin_c0): realmente atribui nvel lgico 0 a RC0;

x = input(pin_c0):Refora a configurao de sada do pino; x recebe o estado de sada de RC0.

output_low(pin_c2): RC2 no recebe valor 0, pois foi configurado como entrada.

90

Exemplo de aplicao no Modo Fixo


Neste exemplo, a porta C foi configurada no
modo fixo, deste modo os pinos C0 e C1 so
configurados como sada e todos os demais da
porta C como entrada.

#include <18f2550.h>
#fuses HS
#use fixed_io(c_outputs=pin_c0, pin_c1)
#use delay(clock = 20000000)

Primeiramente, os pinos C0, C1 e C2 so coloca- main()


{

dos para alto, esperam 200 milisegundos. Em se- !


guida, os mesmos pinos so colocados para bai- !

!
!
!
Devido sua configurao apenas os pinos C0 e
!
C1 vo obedecer os comandos, pois s os mes- !
mos funcionam como sada. O pino C2 no obe- !
decer os comandos j que foi configurado !
!
como entrada.
!
}

xo e esperam os mesmos 200 milisegundos.

while (1)
{
!
output_high(pin_c0);
!
output_high(pin_c1);
!
output_high(pin_c2);
!
delay_ms(200);
!
output_low(pin_c0);
!
output_low(pin_c1);
!
output_low(pin_c2);
!
delay_ms(200);
}

Modo Rpido
Descrio: Compilador no gera cdigo de configurao da direo para os registradores
TRIS, acessando as portas substancialmente mais rpido. O programador deve providenciar toda a configurao necessria.
Diretiva de configurao:
!
!
!

#use fast_io (porta)


Exemplo:

#use fast_io ( A )

91

Funes de configurao do modo rpido:


Descrio: Funo para configurar manualmente a direo dos pinos das portas, como
entrada ou sada. Necessrio sempre que usar o modo rpido.
Funo:

set_tris_x (valor)

Sintaxe:
!

set_tris_a (valor)! !
set_tris_b (valor)

Exemplo:

set_tris_b(131);

Exemplo de aplicao no Modo Rpido


No exemplo a seguir, a porta C foi configurada no modo rpido, deste modo os pinos so
configurados de acordo com a funo set_tris_c.
Primeiramente, o pino C1 configurado como entrada e todos os demais como sada. Em
seguida, o software solicita que os pinos C0, C1 e C2 fiquem em nvel lgico alto, depois
solicita a espera de 200 milisegundos. Em seguida, os mesmos pinos so colocados para
baixo e esperam os mesmos 200 milisegundos.
Devido sua configurao na funo set_tris_c, os pinos C0 e C2 iro executar exatamente o que foi solicitado. J o pino C1 no ir permitir sair nada que foi configurado como entrada, ento a funo ser executada, no ir parar o programa, s no ir ser executada.

92

Exemplo:
#include <18f2550.h>
#fuses HS
#use fast_io(C)
#use delay(clock = 20000000)
main()
{
while (1)
{
set_tris_c(0b00000010); // apenas o pino c1 como entrada
//(c7=0 c6=0 c5=0 c4=0 c3=0 c2=0 c1=1 c0=0)
output_high(pin_c0);
output_high(pin_c1);
output_high(pin_c2);
delay_ms(200);
output_low(pin_c0);
output_low(pin_c1);
output_low(pin_c2);
delay_ms(200);
}
}

93

Leitura e escrita por endereo dos pinos e portas


O CCS facilita a programao com uma interface e linguagem amigvel, alm de auxi-

liar o usurio desde funes bsicas at funes avanadas. Um exemplo disto so as


funes de entrada e sada de dados digitais apresentados. Entretanto, possvel programar atravs do endereamento dos pinos, conforme realizado por outros compiladores.

Para acessar os pinos deste modo, faz-se necessrio identificar o endereo das por-

tas e de seus respectivos registradores TRIS. Para fazer isto deve-se acessar a aba View
do programa CCS e seleccionar a opo Special Register.

Aps seleccionar esta opo, a janela apresentada abaixo ir abrir. Voc deve selecio-

nar o microcontrolador que est usando e procurar as portas e os registradores do mesmo, conforme apresentado em destaque. O endereo estar na primeira coluna esquerda.

94

De forma resumida, tem-se os valores dos endereos das portas e dos registradores TRIS
para o PIC18F2550 so:
Porta A

TRIS A

F80

F92

Porta B

F81

TRIS B

F93

Porta C

F82

TRIS C

F94

Para poder acessar diretamente estes endereos basta criar variveis constantes como
variveis globais. Para endereos de portas e registradores TRIS necessrio criar uma
constante do tipo byte e para pinos e registradores TRIS de um pino deve-se criar uma
constante bit.

Acesso s portas pelos seus endereos


Sabendo que os endereos de porta A so F80 para a porta e F92 para o TRIS, ento
para criar as variveis para acesso a esta porta, deve-se seguir a seguinte sintaxe:

Sintaxe:
!
!
!
!
!
!

!
!

#byte PORTAA = 0xF80


#byte TRISA = 0xF92

Estas variveis devem ser declaradas de forma global, conforme o exemplo abaixo:

Exemplo parte 1:
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#byte PORTAA = 0xF80
#byte TRISA = 0xF92
main()
{
!
...
}

95

Deste modo para atribuir valores para o TRISA e para PORTA, pode-se atribuir direto para
a varivel criada. Isto substitui as funes set_tris_a( ) e a funo output_a( ), isto pode
ser observado no exemplo abaixo:
Exemplo:
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#byte PORTAA = 0xF80
#byte TRISA = 0xF92
main()
{
!
TRISA = 0; // equivale a 0b00000000, ou seja, todos os registradores com 0
!
while (1)
!
{
!
!
PORTAA = 255; // equivale a 0b11111111, ou seja, todos os pinos com 1
!
!
delay_ms(500);
!
!
PORTAA = 0; // equivale a 0b00000000, ou seja, todos os pinos com 0
!
!
delay_ms(500);
!
}
}

Neste exemplo, TRISA = 0 equivale a set_tris_a(0), enquanto PORTAA = 255 equivale a


output_a(255). Para acessar as outras portas, basta alterar os respectivos endereos j
apresentados.

Acesso aos pinos pelos seus endereos


Sabendo que os endereos de porta B so F81 para a porta e F93 para o TRIS, ento
para criar as variveis para acesso aos pinos desta porta, deve-se primeiramente criar as
variveis que acessam a porta desejada, conforme a sintaxe apresentada anteriormente.
A partir desta varivel deve-se criar o bit que poder acessar o pino desejado, que no
exemplo abaixo o pino B1:
Sintaxe:
!
!
!
!
!
!
!
!
!

!
!
!

#byte TRISB = 0xF93!


!
#byte PORTAB = 0xF81
#bit B1 = PORTAB.1

96

O exemplo abaixo contm a configurao de todas as portas do PIC18f2550, alm de criar as variveis de acesso dos pinos A0 e B5. Os pinos da porta B esto sendo usados
como sada, e os da porta A como entrada. Neste exemplo, o pino A0 avaliado, se estiver com nvel lgico alto, os pinos da porta B so todos colocados para 5V, depois todos
para 0V, depois somente B5 posto para 5V e para terminar este pino vai para 0V.
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#byte PORTAA = 0xF80
#byte TRISA = 0xF92
#byte PORTAB = 0xF81
#byte TRISB = 0xF93
#byte PORTAC = 0xF82
#byte TRISC = 0xF94
#bit B5 = PORTAB.5
#bit A0 = PORTAA.0
main()
{
!
TRISB = 0; // equivale a 0b00000000, ou seja, todos os registradores com 0
!
TRISA = 255; // equivale a 0b11111111, ou seja, todos os registradores com 1
!
while (1)
!
{
!
if(A0 == 1)//Para ler o pino basta checar a varivel de acesso do mesmo
!
{
!
!
PORTAB = 255; // equivale a 0b11111111, ou seja, todos os pinos com 1
!
!
delay_ms(500);
!
!
PORTAB = 0; // equivale a 0b00000000, ou seja, todos os pinos com 0
!
!
delay_ms(500);
!
!
B5 = 1; // Colocou apenas o pino B5 para 1
!
!
delay_ms(500);
!
!
B5 = 0; // Colocou apenas o pino B5 para 0
!
!
delay_ms(500);
!
}
!
}
}

97

Acionamento de LED

O termo LED a sigla em ingls de Diodo Emissor de Luz, deste modo, este dispositi-

vo segue os mesmos princpios de um diodo, com a particularidade que ele emite luz.

Um diodo apenas permite a passagem de corrente eltrica em

um sentido, impedindo a passagem de corrente quando polarizado


de forma inversa.
Existe aplicaes com passagem de corrente com polaridade inversa, mas este livro adota apenas a regra geral dos diodos. Observando a figura ao lado, o LED s permite a passagem de corrente eltri-

ca no sentido da corrente em verde, no permitindo a passagem da corrente quando a


mesma possui o sentido da corrente em vermelho.

Outro ponto importante que o LED no controla a intensidade da corrente eltrica,

devendo ter em srie com o mesmo, antes ou depois, uma resistncia para limitar a corrente, evitando que o mesmo queime por sobrecorrente. Por outro lado, o LED precisa de
uma corrente em torno de 15 mA para emitir luz, ento faz-se necessrio colocar um dos
resistores comerciais 300, 330 ou 390 ohms. O circuito ligado ao MCU ficar assim:
330 ohms

PIC18F2550

Sendo assim, quando o pino do MCU ligado ao circuito do LED estiver com 5V, ele acende. Caso esteja com 0V, o LED apaga.

98

Leitura de um boto

Um boto est associado mudana de estado de tenso de um determinado ponto

do circuito, fazendo que este ponto esteja com uma tenso x quando estiver pressionado
e uma tenso y quando estiver despressionado.

+5V

Nas aplicaes deste livro, o boto estar sempre associ-

ado em srie com um resistor, em que em uma ponta estar


uma tenso de 5V e na outra a tenso de 0V. O ponto de leitu-

PIC18F2550

ra desta tenso pelo microcontrolador entre o boto e o resistor, conforme apresentado ao lado pelo ponto A em azul. O

1K

resistor utilizado nos testes deste livro foi 1K Ohms.


+5V

0V
1K

Quando o boto est aberto,


no existe tenso no resistor, ento
a tenso proveniente do terra chega
ao pino, fazendo com que o mesmo
fique com 0V na entrada.

PIC18F2550

+5V

Quando o boto est fechado,


existe tenso no resistor de 5V, ento a tenso proveniente da alimentao (VCC) chega ao pino, fazendo
com que o mesmo fique com 5V

A
1K

PIC18F2550

99

Prticas

Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que faa um led
piscar de 1 em 1 segundo.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que simule um semforo com leds verde, vermelho e amarelo, em que o tempo de verde e vermelho aceso
so 10 segundos e o amarelo so 2 segundos.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que implemente
um ou exclusivo de 3 entradas e acione um led para demonstrar as sadas com nvel lgico alto.

Observao: Todos os projetos devem ter o hardware bsico e obedecer o software bsico, apresentados no Captulo 3, para funcionar adequadamente. Quanto a leitura dos pinos com botes e o acionamento com LEDs, deve-se obedecer s Sees 6 e 7 deste
mesmo Captulo.

100

5
Display de 7
segmentos

Neste Capitulo ser apresentado o display de 7 segmentos, detalhando seu funcionamento, hardware bsico, software bsico, alm do uso de vetores para o software e da tcnica
de multiplexao, que permite o uso de vrios displays com uma menor quantidade possvel de pinos.

101

Funcionamento

Existem dois tipos de display de 7 segmentos, o de anodo comum e o de catodo comum.


O que diferencia os dois tipos est ligado ao sentido de corrente permitido pelo diodo, visto que este conduz somente quando est polarizado diretamente. Sendo assim, o display
de anodo comum deve conectar o fio comum no +5V, enquanto o catodo comum deve ligar o comum ao terra. Abaixo so apresentados os dois tipos de display de 7 segmentos:

O display ctodo comum deve polarizar


o fio comum com 0V, deve possuir um
resistor de 330 Ohms em cada um dos 8
pinos para limitar a corrente em cada
LED individualmente. O acionamento de
cada LED ser feito com uma tenso de
5V e com 0V cada LED apaga.

O display nodo comum deve polarizar o


fio comum com +5V, deve possuir um resistor de 330 Ohms em cada um dos 8 pinos para limitar a corrente em cada LED
individualmente. O acionamento de cada
LED ser feito com uma tenso de 0V e
com 5V cada LED apaga.
Vale destacar que o LED precisa ter diferena de tenso para gerar corrente, e de um resistor para limitar a corrente. O pino pto o ponto do display de 7 segmentos, utilizado
para apresentar as casas decimais.

102

Para estudo e anlise das sadas de um display de 7 segmentos ser adotado, neste exemplo, o display de ctodo
comum. Deste modo, o fio comum deve ser aterrado. Alm
disto, deve-se conectar um resistor em cada entrada (de a
at g) para limitar a corrente em cada diodo para que este
no queime por sobre-corrente, porm que permita passar
um corrente em torno de 200mA, visto que esta capaz de
acender cada LED do display. Este resistor pode ser 300,
330 ou 390 ohms.
Todo display de 7 segmentos, independente se ctodo ou nodo comum, possui a descrio apresentada acima. Deste modo, quando faz-se necessrio aparecer o valor zero
neste display, ento deve-se acender todos os LEDs, exceto o da letra g. Utilizando o
mesmo princpio para aparecer o nmero 1, deve-se acender b e c, apagando todos
os outros. Ressalta-se que no exemplo citado, utiliza-se o tipo ctodo comum, em que o
fio comum aterrado(0V). Deste modo, para acender uma determinada sada, deve-se colocar esta para 5V, que o nvel lgico alto (1). Do mesmo mesmo modo, para apagar
uma sada, deve-se colocar esta para 0V, que o nvel lgico baixo (0). Neste sentido, fazendo o mesmo com todos os nmeros de 0 at 9, ento obtm-se a Tabela apresentada
abaixo.

103

Hardware e Software bsico de acionamento

Abaixo apresentado o hardware especfico para acionamento de um display de 7 segmentos pela porta B. Vale ressaltar que o hardware bsico no est ilustrado para facilitar
o entendimento, mas o mesmo obrigatrio para funcionamento do microcontrolador.

A0#
A1#
A2#
A3#
A4#
A5#
A6#
C0#
C1#
C2#

B7#
B6#
B5#
B4#
B3#
B2#
B1#
B0#

330 ohms

C7#
C6#
C5#
C4#

Quanto ao circuito apresentado, cada resistor ligado entre a porta B e o display de 7 segmentos possui 330 Ohms. O pino B7 est livre e sem conexo, mas poderia estar conectado no pino do ponto do display.
Vale ressaltar que os pinos do display foram conectados juntos na porta B para facilitar a
lgica e o programa de acionamento, mas poderia estar em portas separadas.
Para exemplificar o acionamento do hardware descrito, pode-se citar a Tabela de acionamento de 0 a 9 apresentada na Seo 2 deste mesmo captulo. Nesta tabela, para apre-

104

sentar o nmero 1 acende-se os LEDs b e c, apagando os demais. Como B4 e B5 esto


ligados a b e c respectivamente, ento basta colocar estes pinos para 5V e os demais
para 0V, conforme o acionamento abaixo:

!!!48!!!!!!!!!!!!!!!Decimal!
!

!0!!!0!!!1!!!1!!!0!!!0!!!0!!!0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TB7!!TB6!!TB5!!!TB4!!!TB3!!TB2!!!TB1!!TB0!
!!!!!!!!!a!!!!!b!!!!!!!c!!!!!!d!!!!e!!!!!!f!!!!!!g!.!

Para enviar este valor para a porta B, existe diversas maneiras j apresentadas anteriormente, e uma destas utilizando a funo abaixo:

OUTPUT_B ( 48 ) ;

OUTPUT_B ( 0b00110000 ) ;

O exemplo abaixo apresenta um contagem de 0 a 3 no display de 7 segmentos com


hardware apresentado, utilizando 1 segundo entre cada valor.
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
main()
{
!
while (1)
!
{
!
!
output_b(0b00110000);
!
!
delay_ms(1000);
!
!
output_b(0b01101101);
!
!
delay_ms(1000);
!
!
output_b(0b01111001);
!
!
delay_ms(1000);
!
}
}

105

Software utilizando vetor

O uso de vetores em determinadas aplicaes facilita a manipulao de dados. Entretanto, muitos usurios de Microcontroladores em Linguagem C preferem no usar tal artifcio
de programao devido no conhecer o uso adequado do mesmo.
Neste sentido, o uso de vetores basicamente como descrito na Seo 7 do Capitulo 2,
em que inicialmente necessrio sua declarao e instanciao, onde o vetor criado, declarado e dimensionado. Por exemplo, para criar um vetor chamado vetExemplo de tamanho 3, em que o tipo de dados desse vetor inteiro (int), tm-se a seguinte linha de comando :
!

int vetExemplo [ 3 ];

Para alocar valores a cada posio desse vetor, pode-se utilizar o acesso individual a
cada posio do mesmo modo que o apresentado anteriormente. Por exemplo, para atribuir os valores 3, 5 e 7, respectivamente, para as 3 posies do vetor vetExemplo devese seguir as linhas de comando abaixo:

vetExemplo [ 0 ] = 3;

vetExemplo [ 1 ] = 5;

vetExemplo [ 2 ] = 7;

Vale lembrar que o primeiro valor do vetor alocado na posio 0 e no na posio 1.


Sendo assim, um vetor de trs posies, possui as posies 0, 1 e 2. No exemplo apresentado, a posio 0 possui o valor 3, a posio 1 o valor 5 e a posio 2 o valor 7.
Um outro modo realizar as operaes anteriores de forma sucinta fazer em uma mesma
linha de comando a declarao, instanciao e a atribuio. Um exemplo deste artifcio
apresentado a seguir:

106

int vetExemplo [ ] = { 3 , 5 , 7 };

Na linha de comando apresentada ir gerar o mesmo vetor dos exemplos anteriores, obtendo o mesmo efeito. Entretanto, est mais organizado e prtico, sendo esta a metodologia de uso dos vetores adotado neste livro.
Vale ressaltar que no precisa especificar quantas posies existem neste vetor dentro
dos colchetes, pois isto j feito de forma automtica pela quantidade de posies que j
existem dentro das chaves. Quanto ao preenchimento das posies, tm-se que a posio 0 do vetor ser o primeiro valor apresentado, a primeira posio ser o segundo valor
apresentado, e assim por diante. No exemplo apresentado seguir o mesmo do exemplo
anterior, em que a posio 0 possui o valor 3, a posio 1 o valor 5 e a posio 2 o valor
7.

Vetor no acionamento do display de 7 segmentos


Assumindo que o hardware do display de 7 segmentos est montado de acordo com a Seo 2 deste mesmo captulo, devemos acionar o display de 7 segmentos de acordo com
a tabela abaixo para apresentar os nmeros de 0 a 9:

DEC$

7$$Segmentos$
X$ A" B" C" D" E"

ND" B7$ B6$


0"
0" 1"
1"
0" 0"
2"
0" 1"
3"
0" 1"
4"
0" 0"
5"
0" 1"
6"
0" 1"
7"
0" 1"
8"
0" 1"
9"
0" 1"

F"

G"

B5$ B4$ B3$ B2$ B1$ B0$

1"
1"
1"
1"
1"
0"
0"
1"
1"
1"

1"
1"
0"
1"
1"
1"
1"
1"
1"
1"

1"
0"
1"
1"
0"
1"
1"
0"
1"
1"

1"
0"
1"
0"
0"
0"
1"
0"
1"
0"

1"
0"
0"
0"
1"
1"
1"
0"
1"
1"

0"
0"
1"
1"
1"
1"
1"
0"
1"
1"

Vale ressaltar que o pino B7 no est conectado


nenhum pino no hardware, ento pode-se colocar qualquer valor para seu acionamento. importante colocar um valor, mesmo que seja 0,
para se acostumar a manipular os bits da porta,
visto que posteriormente, algum pino pode faltar
para acionamento, como no caso das portas A e
C do PIC18f2550.

107

Deste modo, precisamos de um dado superior a 7 bits para armazenar os dados do display de 7 segmentos, sendo 1 bit para cada display. Caso no tenha visualizado isto ainda, basta visualizar que 1 bit pode ter o valor 0 ou 1, ento 1 bit pode armazenar o estado
de um dos LEDs do display. Como so 7 LEDs, ento so 7 bits.
Por questo de optimizar o espao no Microcontrolador, usa-se habitualmente um dado
de 8 bits, que o tamanho imediatamente superior ao necessrio, que 7. Dentre as variveis de 8 bits, existe o inteiro (int), o carcter (char) e o byte. Para se usar o inteiro necessrio colocar o variante unsigned para forar a aceitar valores de 0 a 255, conforme visto
na Seo 3 do Capitulo 2.
Nos exemplos deste livro sero usados o tipo de dado byte para evitar erros causador
pelo tipo de dados. Deste modo, considerando um vetor de 10 posies, j que a o conjunto de nmeros apresentado de 0 a 9, a declarao utilizada neste livro :
!

byte digitos [ 10 ];

Quanto ao preenchimento do vetor, o segredo que facilita o uso do display com o vetor
colocar o valor respectivo ao nmero visualizado no display na posio correspondente
do vetor. Sendo assim, o valor para visualizar o nmero 0 ser posto na posio 0 do vetor, o nmero para visualizar o valor 1 ser posto na posio 1 do vetor, e fazendo o mesmo at a posio 9. Neste sentido, quando o programador quiser visualizar o valor 0 no
display, basta enviar a posio 0 do vetor. Isto vlido para todos os nmeros. Um exemplo de preenchimento do vetor especificamente na posio 0, seguindo a tabela de acionamento apresentada, :
!

digitos [ 0 ] = 0b01111110;

Caso queira adotar esta metodologia, ser necessrio preencher cada posio do vetor
individualmente da posio at a posio 9. Como j falado anteriormente, visando a comodidade e facilidade no desenvolvimento de aplicaes com display de 7 segmentos, ento ser adotado a segunda metodologia, em que a declarao, instanciao e atribuio
so realizados ao mesmo tempo. Alm disto, ser utilizado a variante const na declarao
do vetor para evitar que os valores do vetor sejam alterados por falha de manipulao do

108

programador. Ento, de forma resumida, os exemplos deste livro seguiro a seguinte linha
de comando para estas etapas que envolvem a criao e preenchimento do vetor:
byte const digitos [ ] = { 0b01111110, 0b00110000, 0b01101101, 0b01111001,
0b00110011, 0b01011011, 0b01011111,0b01110000, 0b01111111, 0b01111011};

Vale ressaltar que o no incio de todas as posies possuem 0b0 na frente, em que 0b
indica que este nmero binrio, pois todos representam os bits de cada pino, e o primeiro zero do valor referente ao pino B7 que est sem conexo. Como falado anteriormente, funciona normalmente sem este primeiro zero, mas bom deixar para se acostumar a
trabalhar sempre com os 8 pinos, evitando lixo indesejado.
Aps declarar o vetor, fica fcil enviar um valor para o display. Por exemplo, para enviar o
valor 0 para o display, basta fazer a seguinte linha de comando:

output_b ( digitos [ 0 ] ) ;
Resumindo a linha de comando executada: A posio 0 do vetor chamado digitos est
sendo enviada para a porta B. O valor desta posio em cada pino da porta B, corresponde ao acionamento do valor 0 no display de 7 segmentos.
Abaixo apresentado o cabealho dos dois exemplos mostrados posteriormente, em que
o vetor chamado digitos declarado como varivel global e constante do tipo byte:

#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
byte const digitos [ ] = { 0b01111110, 0b00110000, 0b01101101, 0b01111001,
0b00110011, 0b01011011, 0b01011111,0b01110000, 0b01111111, 0b01111011};

109

Exemplo 1:

main()
{
while (1)
Considerando o cabealho apresenta- !
{
do anteriormente, o exemplo ao lado !
!
!
output_b(digitos[1]);
apresenta uma contagem no display !
!
delay_ms(1000);
!
output_b(digitos[2]);
de 7 segmentos que vai de 1 at o n- !
!
delay_ms(1000);
mero 3, demorando 1 segundo em !
!
!
output_b(digitos[3]);
cada contagem. Esta contagem ir !
!
delay_ms(1000);
ocorrer de forma contnua j que est !
}
}
dentro loop infinito do while.

Exemplo 2:

main()
{
int contagem = 0;
Este exemplo tem o mesmo efeito !
while (1)
prtico do exemplo 1. A diferena !
!
{
est no modo de programao utili- !
!
for(contagem=1;contagem<=3;contagem++)
!
{
zado, em que a varivel contagem !
!
!
!
output_b(digitos[contagem]);
possui o nmero que deve ser apre!
!
!
delay_ms(1000);
sentado no display de 7 segmentos !
!
}
!
}
e o for controla este nmero.
}

110

Multiplexando displays de 7 segmentos

Abaixo apresentado o hardware especfico para acionamento de dois displays de 7 segmentos pela porta B. Vale ressaltar que o hardware bsico no est ilustrado para facilitar
o entendimento, mas o mesmo obrigatrio para funcionamento do microcontrolador.

A0#
A1#
A2#
A3#
A4#
A5#
A6#
C0#
C1#
C2#

B7#
B6#
B5#
B4#
B3#
B2#
B1#
B0#

C7#
C6#
C5#
C4#

330 ohms

Rt

T1

Rt

T2

Quanto ao circuito apresentado, os dois displays so conectados na mesma porta B, em


que os pinos dos display so conectados um ao outro, possuindo o mesmo ponto de tenso. Deste modo, o pino a de um display ligado ao pino a do segundo display, b de um
ligado com o b do outro e o mesmo para todos os pinos. Quanto aos resistores, os mesmos so compartilhados pelos dois displays, por exemplo, o resistor do pino B6 conectado ao ponta de tenso a que vai para os dois displays.

111

Quanto multiplexao dos displays, so utilizados os transstores T1 e T2 para controlar


esta operao. Apenas um transstor deve estar habilitado por vez, em que apenas o transstor habilitado ir permitir passar corrente eltrica no fio comum do display. Deste
modo, o display conectado ao transstor desabilitado, no ter corrente eltrica passando
no comum e consequentemente tambm ser desabilitado e permanecer apagado. Os
resistores Rt so utilizados para limitar a corrente de base dos transstores para evitar danificar os mesmos. O modo de operao que os transstores iro trabalhar no regime de
saturao, funcionando apenas como chave on-o (liga-desliga). O valor destes resistores
depende dos transstores utilizados. O clculo dos mesmos deve utilizar a corrente de saturao (Is) encontrada no datasheet do fabricante, o que considerando que a tenso que
sai do pino 5V , ento tm-se que Rt = 5 / Is. Nos exemplos deste livro so utilizados o
transstor BC337 e um resistor Rt de XXXX Ohms.
Cada transstor controla a corrente do fio comum atravs da sua corrente de base. Esta
corrente proveniente dos pinos do Microcontrolador que esto conectados aos resistores Rt de cada transstor. Deste modo, quando se coloca 0V no pino do MCU conectado
ao resistor Rt no haver corrente eltrica na base do transstor, o que desabilita a corrente do fio comum do display e consequentemente, desabilita o prprio display.
J quando se pe 5V no pino do MCU conectado ao resistor Rt, permite-se a passagem
de corrente pelo comum do display, j que estes 5V geram a corrente de saturao na
base do transstor e isto, habilita o uso do display desejado.

Lgica do software de multiplexao de displays


A lgica para multiplexar os displays de 7 segmentos simples, deve-se escolher o display que ir aparecer o valor desejado. Feito isto, deve-se habilitar o desejado e desabilitar os demais, no exemplo, so s dois, mas podem ter mais se desejar. Em seguida,
deve-se enviar o valor que deseja aparecer para a porta do display, que no exemplo a
porta B. Como apenas um display est habilitado, apenas este ir aparecer o valor desejado. No geral, se habilitar mais de um display, nenhum acende ou a intensidade da luz ser
muito fraca, visto que as correntes iro se dividir, causando os erros mencionados. Ento,

112

evite este erro e acione apenas um display por vez. As linhas de comando a seguir exemplificam o acionamento dos dois displays, colocando o valor 1 no primeiro display e 2 no
segundo:
!
!
!
!
!
!
!
!

outuput_high( PIN_C7 ); // habilitando display 1, pois C7 conectado base de T1


outuput_low( PIN_C6 ); // desabilitando display 2, pois C6 conectado base de T2
output_b(0b00110000); // enviando valor para visualizar o nmero 1 no display 1
delay_ms(1000);
outuput_high( PIN_C6 ); // habilitando display 2, pois C6 conectado base de T2
outuput_low( PIN_C7 ); // desabilitando display 1, pois C7 conectado base de T1
output_b(0b00110000); // enviando valor para visualizar o nmero 2 no display 2
delay_ms(1000);

O exemplo de software abaixo realiza uma contagem de 0 at 20 utilizando o hardware do


comeo desta seo. Vale lembrar que o operador de diviso ( / ) e o operador resto de diviso ( % ) esto detalhados no capitulo 2.
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
byte const digitos [ ] = { 0b01111110, 0b00110000, 0b01101101, 0b01111001, 0b00110011,
0b01011011, 0b01011111,0b01110000, 0b01111111, 0b01111011};
int dezena, unidade, contagem;
main()
{
while (1)
{
!
for(contagem=0;contagem<=15;contagem++)
!
{
!
!
dezena = contagem / 10; //Isto pega a parte da dezena da contagem
!
!
unidade = contagem % 10; //Isto pega a parte da unidade da contagem
!
!
outuput_high( PIN_C7 ); // habilitando display 1, pois C7 conectado base de T1
!
!
outuput_low( PIN_C6 ); // desabilitando display 2, pois C6 conectado base de T2
!
!
output_b( digitos[dezena] ); // enviando valor para visualizar o nmero 1 no display 1
!
!
delay_ms(1000);
!
!
outuput_high( PIN_C6 ); // habilitando display 2, pois C6 conectado base de T2
!
!
outuput_low( PIN_C7 ); // desabilitando display 1, pois C7 conectado base de T1
!
!
output_b( digitos[unidade] ); // enviando valor para visualizar o nmero 2 no display 2
!
!
delay_ms(1000);
!
}
}
}
113

Prticas

Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que leia o pino
A0, quando este pino estiver com nvel lgico 0, apresente o valor 0 no display de 7 segmentos. Quando A0 estiver com nvel lgico 1, apresentar o valor 1 no display.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem crescente de 0 a 9, incrementando a contagem a cada 0,5 segundo.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem decrescente de 9 a 0, decrementando a contagem a cada 0,5
segundo.
Prtica 04: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem crescente de 0 a 9, incrementando a contagem a cada 0,5 segundo. Em seguida apresente uma contagem em ordem decrescente de 9 a 0, decrementando a contagem a cada 0,5 segundo.
Prtica 05: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem crescente de 0 a 99 em dois displays de 7 segmentos, incrementando a contagem a cada 0,5 segundo.

114

6
Conversor Analgico
Digital

Os conversores analgico digitais (ADC) so utilizados nos microcontroladores para ler


um valor de tenso em portas especficas. Esta leitura realizada convertendo o valor de
tenso para um valor digital. Deste modo, este capitulo ir mostrar o hardware e o software necessrio para realizar a leitura de um ADC no PIC 18F2550.

115

Pinos de entrada de conversores A/D

Abaixo so apresentados em vermelho os pinos que podem ser utilizados como ADC no
PIC 18F2550, desde que sejam configurados e usados como tal.

Os pinos com a funo especial AN podem assumir duas funes, entrada/sada digital
ou conversor A/D. Quando configuradas como E/S digital funcionam como visto no Capitulo 4. J quando configuradas como conversor A/D estes pinos convertem uma tenso
analgica (0-5V) em um valor digital.
O valor digital armazenado normalmente em uma varivel para ser processada, armazenada, etc. Este valor armazenado depende da resoluo do conversor, que, por exemplo,
no 18f2550 pode ser de 8 ou 10 bits.

116

Funes de configurao e leitura do ADC

O passoapasso necessrio para uso de um conversor ADC so listados abaixo, sendo


que estes passos tratam desde a configurao at a leitura do ADC. Cada um destes passos so tratados posteriormente nesta mesma seo.
1.

Configurar resoluo do ADC

2.

Configurar clock utilizado pelo MCU

3.

Configurar as portas que sero usadas como ADC

4.

Configurar as tenses de referncia do ADC

5.

Configurar a origem e o valor do clock do ADC

6.

Selecionar o canal do ADC para leitura

7.

Leitura do conversor A/D

8.

Esperar intervalo para o ADC reiniciar o processo

1 - Configurao da resoluo do ADC


Descrio: esta diretiva de configurao determina o valor n da resoluo do ADC, em
que a quantidade de valores possveis dado por 2n.
Diretiva de configurao: #device ADC = valor

Observao: A escrita da funo tambm pode ser em minsculo.

117

Exemplo 1:

#device adc = 8

Quando a resoluo do ADC possui n = 8, ento 2n = 28 = 256 . Deste modo, os valores possveis na leitura do ADC esto entre 0 e 255, o que totaliza os 256 valores.
Exemplo 2:

#device adc = 10

Quando a resoluo do ADC possui n = 10, ento 2n = 210 = 1024 . Deste modo, os
valores possveis na leitura do ADC esto entre 0 e 1023, o que totaliza os 1024 valores.

2 - Configurar clock usado


Descrio: esta configurao j faz parte do software bsico do microcontrolaodor, mas
tambm muito importante no uso do ADC (#use delay(clock= valor) ).

3 - Configurar as portas usadas como ADC


Descrio: esta configurao determina quais os pinos do microcontrolador que sero
usados com ADC.
Diretiva de configurao: setup_adc_ports( configuraes )

Esta funo apresentada possui diversos parmetros de configurao, por exemplo, abaixo este comando est configurando o uso dos pinos AN0, AN1, AN2 e AN3. Os demais sero usados como pinos digitais ou outras funes.
Exemplo:

setup_adc_ports( AN0_to_AN3 ) ;

118

Outras configuraes possveis para configurao dos pinos como ADC:

Parmetro ! !
NO_ANALOGS ! !
ALL_ANALOG ! !
AN0_TO_AN11 ! !
AN0_TO_AN10 ! !
AN0_TO_AN9 ! !
AN0_TO_AN8 ! !
AN0_TO_AN4 ! !
AN0_TO_AN3 ! !
AN0_TO_AN2 ! !
AN0_TO_AN1 ! !
AN0
! !
!

ADCs selecionados para uso


Nenhum
A0 A1 A2 A3 A5 B2 B3 B1 B4 B0
A0 A1 A2 A3 A5 B2 B3 B1 B4
A0 A1 A2 A3 A5 B2 B3 B1
A0 A1 A2 A3 A5 B2 B3
A0 A1 A2 A3 A5 B2
A0 A1 A2 A3 A5
A0 A1 A2 A3
A0 A1 A2
A0 A1
A0

Alguns exemplos utilizando outros exemplos de configurao so apresentados abaixo:

Vale ressaltar que quando apenas um pino necessrio para ser usado como ADC, otimiza-se o hardware quando utiliza-se o pino AN0. Caso contrrio, pinos sero inutilizados.
Por exemplo, supondo que v usar apenas o pino AN3, ento os pinos AN0 e AN1 sero
inutilizados, pois no possvel configurar apenas o AN3.

4 - Configurar as tenses usadas no ADC


Descrio: esta configurao determina as referncias de tenso do microcontrolador
que sero usados no ADC.
Diretiva de configurao: setup_adc_ports( configuraes )

119

Esta funo apresentada possui diversos parmetros de configurao, por exemplo, abaixo este comando est configurando o uso das tenses 0 e 5V que so as tenses padro
do microcontrolador.
Exemplo:

setup_adc_ports( VSS_VDD )

Outras configuraes possveis:


!
!
!
!
!

Parmetro !
!
VSS_VDD !
!
VREF_VREF ! !
VREF_VDD ! !
VSS_VREF ! !

Tenso de referncia dos ADCs


Referncia 0 - Vdd (pino 20)
Referncia VrefL(AN2) - VrefH (AN3)
Referncia VrefL(AN2) Vdd (pino 20)
Referncia 0 - VrefH (AN3)

Cada uma destas configuraes detalhada a seguir:


SETUP_ADC_PORTS (VSS_VDD)

Usa como referncia as alimentaes do micro controlador, pinos 19 e 20 (18f2550). Deste modo a leitura do ADC ser mxima para tenso no pino 19 e 0 para tenso no pino 20.
SETUP_ADC_PORTS (VREF_VREF)

Usa como referncia os pinos 4 (AN2) e 5 (AN3) para 18f2550. Deste modo a leitura do
ADC ser mxima para tenso do pino 5 e 0 para tenso no pino 4.
SETUP_ADC_PORTS (VREF_VDD)

Usa como referncia os pinos 4 (AN2) e 20 (Alimentao). Deste modo a leitura do ADC
ser mxima para tenso do pino 20 e 0 para tenso no pino 4.
SETUP_ADC_PORTS (VSS_VREF)

Usa como referncia os pinos 19 (GND alimentao) e 5 (AN3). Deste modo a leitura do
ADC ser mxima para tenso do pino 5 e 0 para tenso do pino 19 (GND).

120

3 e 4 - Configurar as portas usadas como ADC e as referncias de tenso juntos


As etapas 3 e 4 da configurao do ADC possuem a mesma funo, ento podem ser configuradas juntas. Abaixo esto listados alguns exemplos:
SETUP_ADC_PORTS ( NO_ANALOGS | VSS_VDD )

NO_ANALOGS: configura o uso Nenhuma porta ADC.


VSS_VDD: configura as referncias do ADC como o terra, referncia minma e VCC de alimentao, a referncia mxima.
SETUP_ADC_PORTS ( AN0 | VREF_VDD )

AN0: Configura apenas AN0 como ADC.


VREF_VDD: Configura as referncias do ADC como AN2 a mnima e VCC de alimentao,
a mxima.
SETUP_ADC_PORTS ( AN0_TO_AN11 | VREF_VREF )

AN0_TO_AN11: Configura como ADC os pinos AN0 at AN11.


VREF_VREF: As referncias do ADC so as referncias externas, mnima (AN2) e mxima
(AN3).

5 - Configurar as portas usadas como ADC e as referncias de tenso juntos


Descrio: esta configurao define o tipo de clock para a converso do ADC, estabelecendo o tempo de converso do TAD (Tempo de converso Analgico-Digital).
Diretiva de configurao: setup_adc ( opes )

121

Exemplo 1:

setup_adc ( adc_off )

No exemplo acima, a configurao adc_o desliga o ADC e nenhuma porta ser usada
com esta funo. Outras configuraes so apresentadas abaixo:

Parmetro !
ADC_OFF !
!

!
!

ADC_CLOCK_DIV_2---- ADC_CLOCK_DIV_4--- ADC_CLOCK_DIV_8--- ADC_CLOCK_DIV_16----ADC_CLOCK_DIV_32----ADC_CLOCK_DIV_64----ADC_CLOCK_INTERNAL-

Clock do ADC selecionado

Desliga-clock-do-ADC
Clock-do-ADC-=-Fosc/2
Clock-do-ADC-=-Fosc/4
Clock-do-ADC-=-Fosc/8
Clock-do-ADC-=-Fosc/16----------------------Clock-do-ADC-=-Fosc/32
Clock-do-ADC-=-Fosc/64
Clock-do-ADC-=-clock-Interno

Outros exemplos utilizando estas configuraes so apresentados abaixo:


Exemplo 2:

setup_adc ( adc_clock_div_4 )

No exemplo 2, o MCU ir usar o clock do ADC com uma frequncia 4 vezes menor que a
frequncia de entrada. Considera-se o tempo de converso TAD de cada bit 1/f.
Exemplo 3:

setup_adc ( adc_clock_div_16 )

No exemplo 3, o MCU ir usar o clock do ADC com uma frequncia 16 vezes menor que a
frequncia de entrada. Considera-se o tempo de converso TAD de cada bit 1/f.

6 - Selecionar a porta de leitura do ADC


Descrio: esta funo define a porta n que a funo de leitura ir ler quando for chamada.
Funo de seleo: setup_adc_channel ( n )

122

Para selecionar o pino AN0 para que este seja lido, tm-se a seguinte funo:
Exemplo 1:

setup_adc_channel ( 0 )

O mesmo para selecionar o AN5 e o AN10 so apresentados abaixo.


Exemplo 2:

setup_adc_channel ( 5 )

Exemplo 3:

setup_adc_channel ( 10 )

A numerao selecionada nesta funo no diz respeito a numerao do pino, mas sim
aos pinos com funes AN. Deste modo, ao selecionar o canal 0, est selecionando o
AN0 que fica no pino 2 e no o pino 0. Os pinos selecionados para leitura devem ter sido
habilitados anteriormente para que a leitura seja realizada adequadamente.

7 - Leitura do conversor AD
Descrio: esta funo l o pino selecionado previamente, retornando um valor com a
quantidade de bits configurada previamente. Esta funo tem um retorno do tamanho da
varivel configurada no tpico 1. A funo segue abaixo.
Funo de leitura: read_adc ( )

Exemplo:
Aps executar a linha de comando 3, a varivel valor

1.! unsigned int valor;


2.! set_adc_channek(1);
3.! valor = read_adc ( );

ter o valor referente a tenso lida no canal 1 previamente selecionado. Vale ressaltar que esta varivel
deve ser capaz de receber o valor lido, ou seja, se for
receber 8 bits, ento deve ter 8 ou mais bits, conforme selecionado.

8 - Delay entre cada leitura


Descrio: Aps cada leitura necessrio esperar um certo tempo para reiniciar o processo. Neste livro usado 10 milisegundos.
Funo de espera: delay_ms (10 )
123

Exemplos de leitura do ADC

Nesta seo so apresentados alguns exemplos de leitura utilizando o conversor analgico digital do PIC18F2550 seguindo as etapas citadas anteriormente. Estes exemplos so
descritos a cada linha de comando e uma anlise geral apresentada para cada exemplo.

Exemplo 1 de cdigo para uso do ADC


A seguir apresentado o primeiro exemplo de cdigo usando o Conversor Analgico Digital (ADC). Neste exemplo, o ADC est configurado com 10 bits, utilizando apenas o AN0.
Vale ressaltar que as tenses de referncia no foram configuradas, deste modo as referncias utilizadas so o terra e o VCC de alimentao.
#include <18f2550.h>
#device ADC=10 //Configura os ADC com 10 bits
#use delay(clock=20000000) //Configura as portas usadas como ADC
long int ad0; //Varivel que suporte armazenar um dado de 10 bits
void main( )
{
SETUP_ADC_PORTS(AN0); //Configura as portas usadas como ADC
SETUP_ADC(ADC_CLOCK_INTERNAL); //Seta a origem do clock
SET_ADC_CHANNEL(0); //Escolhe a entrada lida pela funcao READ_ADC
while(1) //Loop infinito
{
-ad0 = READ_ADC(); //Le o pino ADC selecionado
delay_ms(10); //Espera 10ms, intervalo minimo entre leituras ADC
}
}

Vale ressaltar que apenas um pino est sendo utilizado como ADC no exemplo acima, deste modo, s necessrio indicar qual pino ser lido pela funo read_adc uma vez, e por
isto, a funo set_adc_channel(0) executada antes do loop infinito do while, em que o
argumento de entrada 0 define o canal AN0 como o pino de leitura. Outro ponto importante, a necessidade de esperar o sistema estabilizar entra cada leitura. Um tempo adotado
neste livro de 10 milisegundos (10 ms).

124

Exemplo 2 de cdigo para uso do ADC


A seguir apresentado o segundo exemplo de cdigo usando o Conversor Analgico Digital (ADC). Neste exemplo, o ADC est configurado com 8 bits, utilizando os pinos AN0 e
AN1. Vale ressaltar que as tenses de referncia tambm no foram configuradas, deste
modo as referncias utilizadas so o terra e o VCC de alimentao.
Diferente do exemplo anterior, este utilizada dois pinos como ADC, deste modo, faz-se necessrio indicar qual pino ser lido pela funo read_adc sempre que a leitura de um pino
fosse realizada. Sendo assim, antes da leitura do pino AN0, a funo set_adc_channel(0)
executada, e antes da leitura do pino AN1 executa-se a funo set_adc_channel(1).
#include <18f2550.h>
#device ADC=8 //Configura ADC com 8 bits
#use delay(clock=20000000)
unsigned int ad0, ad1; //Variaveis capazes de armazenar 8 bits (reparar no unsigned)
void main( )
{
SETUP_ADC_PORTS(AN0_TO_AN3); //Configura as portas usadas como ADC
SETUP_ADC(ADC_CLOCK_INTERNAL); //Seta a origem do clock
while(1) //Loop infinito
--{
SET_ADC_CHANNEL(0); //Escolhe a entrada 0 para ler com READ_ADC
-----ad0 = READ_ADC(); //Le o pino ADC selecionado
delay_ms(10); //Espera 10ms, intervalo minimo entre leituras ADC
SET_ADC_CHANNEL(1); //Escolhe a entrada 1 para ler com READ_ADC
-----ad1 = READ_ADC(); //Le o pino ADC selecionado
delay_ms(10); //Espera 10ms, intervalo minimo entre leituras ADC
}
}

125

Tempo de converso de cada bit

O tempo de converso de cada bit (TAD) calculado dividindo 1 pela frequncia de converso de 1 bit. Para exemplificar este clculo vamos considerar a configurao do clock
ADC_CLOCK_DIV_16 e o clock do MCU de 20 MHz, ento temos:

O tempo TAD equivalente a 1 bit, ento para saber o tempo real de leitura e converso
do valor analgico para digital basta multiplicar pela quantidade de bits que a leitura do
ADC foi configurada.
Por exemplo, caso este exemplo citado tenha sido configurado com 8 bits, ento o tempo
de leitura do ADC pela funo read_adc( ) ser de 0,8 x 8 = 6,4 us. J quando configurado para 10 bits, ento o tempo de leitura do ADC ser 0,8 x 10 = 8 us.

126

Converso entre tenso e valor digital lido

Para se usar o Conversor Analgico Digital (ADC) necessrio compreender a converso


entre o valor digital dentro do microcontrolador e a tenso externa no pino lido do microcontrolador.
Neste sentido, faz-se necessrio entender como obter a tenso a partir do valor digital e
como obter o valor digital a partir da tenso. No modo de operao do MCU, obtm-se o
valor digital e faz-se necessrio obter a tenso, ou outra varivel relacionada com a tenso, ento necessrio conhecer a equao de obteno da tenso a partir do valor digital.
J na etapa de projeto, s vezes, faz-se necessrio conhecer qual valor digital representa
uma tenso especfica, o que pode at ser usado na etapa de execuo, retirando do programa a converso analgico digital.
Para clculo da converso de uma tenso de entrada Vin para um valor digital res_adc,
tem-se a equao abaixo:

Os valores de referencia mnimo (Vref_min) e mximo (Vref_max) so configurados na seo 4.2.4, enquanto a resoluo n configurada conforme visto na seo 6.2.
A seguir so apresentados exemplos de aplicao da frmula acima para obter a tenso
(Vin) a partir do valor digital (res_adc) e da obteno de res_adc utilizando Vin.

127

Supondo que os valores de tenso de referncia mnima e mxima so respectivamente


0V e 5V, e utilizando o conversor com resoluo de 10 bits, e possuindo uma entrada de
2,5V:

Obs: O valor de tenso de entrada (Vin) deve estar entre os valores mnimo e mximo das
referncias configuradas, alm de no poder ultrapassar 5V corrente contnua, o que pode
danificar o pino utilizado.

S u p o n d o que os valores de tenso de referncia mnima e mxima so respectivamente 0V e 5V, e utilizando o conversor com resoluo de 10 bits, e possuindo um valor
lido no ADC de 511:

Obs: Verificar se a varivel de armazenamento da leitura do ADC maior que o valor mximo do ADC, caso contrrio, erros de leitura iro acontecer.

Exemplo de cdigo de converso utilizando o ADC


A seguir apresentado um exemplo de cdigo com converso de ADC para tenso Vin
utilizando o ADC com 10 bits. Este exemplo utiliza todo o cdigo apresentado e detalhado na seo 6.2 e o clculo do Exemplo 1 desta mesma seo.

128

#include <18f2550.h>
#device ADC=10 //Configura os ADC com 10 bits
#use delay(clock=20000000) //Configura as portas usadas como ADC
long int ad0; //Varivel que suporte armazenar um dado de 10 bits
float Vin; //Varivel que suporte o valor de tenso de entrada
void main( )
{
SETUP_ADC_PORTS(AN0); //Configura as portas usadas como ADC
SETUP_ADC(ADC_CLOCK_INTERNAL); //Seta a origem do clock
SET_ADC_CHANNEL(0); //Escolhe a entrada lida pela funcao READ_ADC
while(1) //Loop infinito
{
-ad0 = READ_ADC(); //Le o pino ADC selecionado
Vin = ((float)(ad0))*5/((float)(1023));
delay_ms(10); //Espera 10ms, intervalo minimo entre leituras ADC
}
}

129

Leitura de ADC utilizando Potencimetro


O potencimetro basicamente um resistor varivel e pode ser utilizado
em diversas aplicaes que envolvem electricidade e eletrnica, podendo
at mesmo ser utilizado como instrumento de medio em aplicaes
especficas. Ao lado so apresentados alguns exemplos de potencimetro.
Nas prticas que envolvem o conversor analgico digital deste capitulo, facilita variar a tenso de entrada do pino utilizado como ADC quando em sua entrada existe um potencimetro. Este dispositivo possui
uma tenso de alimentao e um terra, que funcionam como referncia
da sada deste potencimetro.
Um transstor funciona como um divisor de tenso varivel, em que este dispositivo possui
uma resistncia fixa entre o terminal 1 (T1) e o terminal 2 (T2). Entretanto, existe um terminal
varivel (TV), apresentado em vermelho, que divide a tenso total em duas, representadas
em verde e azul. Trs exemplos so apresentados, mostrando que as resistncias RA e RV
se alteram quando o seletor do potencimetro rotacionado.
Para as prticas deste livro, considerando que T1 e T2 sejam alimentados com 0V e 5V. Deste modo, ao rotacionar o potencimetro, altera-se as resistncias RA e RV e consequentemente, altera-se tambm a tenso em cima de cada resistncia. Isto pode ser mensurado
pelo terminal varivel, que sempre possuir uma tenso entra 0 e 5V, tendendo a 0V quando
a rotacionado para um lado e 5V quando rotacionado para o lado oposto. Vale ressaltar que
indiferente qual dos pinos T1 e T2 conecta-se 0V e 5V.

Terminal 1 ( T1 )

RA

RA

Resistncia Verde ( RV )

Terminal
Varivel ( TV )
Resistncia Azul ( RA )

Terminal 2 ( T2 )

RV
RA

RV
RV

T1 TV T2

T1 TV T2

T1 TV T2

130

Prticas

Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 10 bits e que, acenda um led vermelho quando o valor lido for menor
que 2,5V e acenda o led amarelo quando for maior. Faa isto, utilizando o valor digital referente a tenso citada, sem converso dentro do cdigo.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 10 bits e que, acenda um led vermelho quando o valor lido for menor
que 2,5V e acenda o led amarelo quando for maior. Faa isto, utilizando a tenso obtida a
partir do valor digital atravs da converso apresentada neste captulo.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 8 bits e demonstre a tenso em um display de 7 segmentos. Considere as tenses de 0 a 5 Volts, apenas a parte inteira.
Prtica 04: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 8 bits e demonstre a tenso em dois displays de 7 segmentos. Considere as tenses de 0 a 5 Volts, apresentando em um display a parte inteira e em outro
uma casa decimal.
Prtica 05: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 8 bits e demonstre o resultado em 3 displays de 7 segmentos. Considerando que os valores so de 0 a 255, ento apresente o valor da centena em um display, o valor da dezena em um segundo display e o valor da unidade no terceiro display.
Prtica 06: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 10 bits e demonstre o resultado em 4 displays de 7 segmentos. Considerando que os valores so de 0 a 1023, ento apresente o valor da milhar em um display, o valor da centena em um segundo display, o valor da dezena num terceiro display e
o valor da unidade no quaro display.

131

7
Interrupo externa

Neste capitulo ser apresentado o conceito de interrupes, como configurar e usar adequadamente, inclusive apresentando exemplos de cdigos. A interrupo que ser apresentada neste capitulo a interrupo externa.

132

Introduo s interrupes

Interrupes so sub-rotinas assncronas que so acionadas quando eventos importantes


acontecem. Ao ser acionada uma interrupo, o que estava sendo executado para, e neste momento a funo da interrupo acionada chamada para processar a interrupo.
No trmino desta funo, a execuo continua a partir do ponto que havia parado previamente.
Dentre as interrupes presentes em Microcontroladores, pode-se citar as:
1.

Externa

2.

Estouro dos Timers

3.

Recepo serial completa

4.

Converso AD completa

5.

Escrita EEPROM completa

6.

Falha no sistema oscilador

7.

Deteco de tenso baixa

Entre outras...

Neste livro sero abordados os principais: a interrupo externa, a recepo serial e a interrupo por Timers. Nesta unidade, ser abordado o uso e configurao das interrupo
externa, e as demais nas unidades seguintes.

133

Interrupes externas no PIC18F2550

Interrupo gerada na mudana de tenso de pinos especficos do microcontrolador. A Figura abaixo apresenta as interrupes Externas disponveis no PIC 18f2550.

Cada interrupo em um microcontrolador possui um identificador. Este usado nas funes de habilitao, configurao e uso da interrupo especfica que ele representa. Neste sentido, a Tabela abaixo apresenta as interrupes externas do PIC 18f2550 com seus
respectivos identificadores e pinos de acionamento.
Nmero

Identificadores

Pino de acionamento

Int. Externa 0

int_ext

B0

Int. Externa 1

int_ext1

B1

Int. Externa 2

int_ext2

B2

134

Funes de habilitao

O uso de interrupes s possvel caso esta tenha sido habilitada previamente. Sendo
assim, duas etapas so necessria para se habilitar o uso de interrupes. Primeiro, devese habilitar o uso global de interrupes, depois as interrupes especficas que pretende
usar.
A funo usada nas duas etapas de habilitao do uso de interrupes a mesma, e esta
descrita abaixo:
Funes de habilitao: enable_interrupts ( identificador )

Exemplos:
!
!
!
!
!
!

enable_interrupts ( global );
enable_interrupts ( int_ext );

Habilitao das Interrupes externas


Para habilitar o uso de interrupo externa no PIC 18f2550, faz-se necessrio duas funes, conforme descrito anteriormente, uma para habilitar o uso global e outra para habilitar o uso especfico da interrupo externa.
Neste sentido, a funo que habilita o uso de interrupo dentro de uma aplicao
Funes de habilitao global:
!

enable_interrupts ( global )

Obs: deve-se chamar este comando antes de habilitar qualquer instruo especfica.

135

J para habilitar o uso de uma interrupo especfica no PIC18F2550, deve-se chamar a


mesma funo, alterando o argumento de entrada para o identificador da funo especfica que deseja habilitar a interrupo.
Funo de habilitao da interrupo externa 0 pino B0:
enable_interrupts ( int_ext );

Funo de habilitao da interrupo externa 1 pino B1:


enable_interrupts ( int_ext1 );

Funo de habilitao da interrupo externa 2 pino B2:


enable_interrupts ( int_ext2 );

Exemplo de habilitao das Interrupes externas


Abaixo apresentado um exemplo de habilitao da interrupo externa 0 do
PIC18F2550, que fica no B0. Para habilitar qualquer interrupo, faz-se necessrio executar esta operao uma nica vez, e por isto, para habilitar esta interrupo os comando
so colocados dentro do main, mas antes do while.
#include <18f2550.h>
#use delay(clock=20000000)
void main( )
{
!
enable_interrupts(global); //Habilita o uso de interrupes
!
enable_interrupts(int_ext); //Habilita o uso da interrupo externa 0 (Pino B0 pic18f2550)
!
while(1)
!
{
!
!
//funes do programa do usurio
!
}
}

Ressalta-se que
!
!

enable_interrupts(global);
enable_interrupts(int_ext);

enable_interrupts(global | int_ext);

136

Hardware e software das interrupes externas


Sempre que uma interrupo acionada, uma funo chamada para processar esta interrupo, em que esta subrotina acionada sempre que o evento da interrupo acontece. A uma funo de uma determinada interrupo identificada por um cdigo, sendo
este chamado de identificador, o mesmo usado para habilitar uma interrupo, conforme
visto anteriormente. A sintaxe de construo desta sub-rotina apresentada abaixo e
exemplos de funes para as interrupes externas 0, 1 e 2 so apresentados a seguir.
Sintaxe:

Exemplo com int. externa 0:

Identificador da Interrupo externa 0


Funo de interrupo externa 0. Neste
exemplo, a varivel cont incrementada
sempre que o pino B0 receber um pulso.

137

Exemplo com int. externa 1:

Identificador da Interrupo externa 1


Funo de interrupo externa 1. Neste
exemplo, a varivel cont decrementada
sempre que o pino B1 receber um pulso.

Exemplo com int. externa 2:

Identificador da Interrupo externa 2

Funo de interrupo externa 2. Neste


exemplo, a varivel cont zerada sempre que
o pino B2 receber um pulso.

Exemplo de Hardware e software


A seguir apresentado um projeto exemplo de uso de interrupes externas com o seu
hardware e software. Neste exemplo, sempre que o boto B1 for pressionado e retornar
sua posio de origem, a funo de interrupo ser acionada. Nesta funo o pino B7
faz um LED piscar.
Quanto ao software, deve-se lembrar que o uso de interrupes deve ser habilitado, em
seguida, o uso da interrupo externa 0 deve ser habilitado.Alm disto, o identificador da
interrupo deve estar em algum ponto do cdigo com sua respectiva funo logo abaixo. Dentro desta funo da interrupo, deve ser feito o que for conveniente ao projeto,
que neste exemplo, piscar o LED.

138

Hardware: abaixo segue hardware do exemplo, em que a quantidade de pinos e sua organizao meramente ilustrativa, no contendo os 18 pinos do PIC18F2550. Alm disto, o
hardware bsico deve ser acrescentado para funcionamento do projeto.
+5V

330 ohms
B7

B0

A
1K

PIC18F2550

Software: no software apresentado abaixo, tm habilitado a interrupo externa 0, que foi


habilitada junto com o uso de interrupes. Vale ressaltar que a linha de comando
while(1); fica em loop infinito sem fazer nada, apenas esperando o acionamento da interrupo externa 0, atravs de um pulso no pino B0. Isto chamar a funo trata_int0, pois
esta funo est abaixo do identificador da int. externa 0, que #int_ext .
#include <18f2550.h>
#use delay(clock=20000000)
#fuses HS
#int_ext //identificador da interrupo externa 0
void trata_int0(void) // Trata interrupo externa 0
{
output_high (pin_b7); // Acende LED para demonstrar que houve interrupo
delay_ms (250);
output_low (pin_b7); // aps 250 ms apaga LED
}
void main()
{
enable_interrupts(GLOBAL|INT_EXT); // Habilita interrupo Global e Int_Ext
while (true); // Aguarda por uma interrupo
}

139

Configurao da borda de acionamento

O acionamento de uma interrupo externa acontece em uma transio de tenso em um


pino especfico, em que esta transio pode ser na borda de subida (0 para 5V) ou na borda de descida (5 para 0V).
Para acionar uma interrupo na borda de subida utiliza-se a linha de comando:

ext_int_edge (L_TO_H);

Descrio: Habilita interrupo externa quando o pino especfico da interrupo sair de


0V para 5V, ou seja, quando sai do nvel lgico baixo (LOW) para alto (HIGH), o que resume a opo L_TO_H.
+5V

140

J para acionar uma interrupo na borda de descida:

ext_int_edge (H_TO_L);

Descrio: Habilita interrupo externa quando o pino especfico da interrupo sair de


+5V

5V para 0V, ou seja, quando sai do nvel lgico alto (High) para baixo (Low), o que resume
a opo H_TO_L.

Exemplo de Hardware e software com configurao de borda


O hardware utilizado neste exemplo, o mesmo da seo 7.4, em que um boto conectado ao pino B0 para alterar sua entrada e um LED conectado ao pino B7 para apresentar alguma sada.
J o software utilizado praticamente o mesmo, acrescentando uma linha de comando
de configurao abaixo da linha de habilitao da interrupo externa 0. As duas configuraes possveis de configurao de borda esto no cdigo, sendo que uma est comentada e outra est ativa, conforme em destaque em vermelho no exemplo. Esta linha confi-

141

gura o acionamento da interrupo para quando o pino B0 sai do nvel baixo para o alto
(L_TO_H), ou seja, no momento em que o boto que est pressionado despressionado.
O restante do cdigo igual, piscando o LED quando a interrupo acionada.
Exemplo de software:
#include <18f2550.h>
#use delay(clock=20000000)
#int_ext-//idenKcador-da-interrupo-externa-0
void-trata_int0(void)-//"Trata"interrupo"externa"0
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_EXT);-//"Habilita"interrupo"Global"e"Int_Ext
ext_int_edge(L_TO_H);0//"Int_Ext"sensvel"a"borda"de"subida
//ext_int_edge(H_TO_L);"//"Int_Ext"sensvel"a"borda"de"descida
while-(1);-//"Aguarda"por"uma"interrupo
}

142

Prioridade de interrupes

Conforme visto anteriormente, existe muitas interrupes, em que cada uma acionada
quando um evento especfico acontece. No caso da interrupo externa, este evento a
transio de tenso de um pino especfico. Entretanto, se todas as interrupes externas
forem acionadas ao mesmo tempo, ento qual ser processada? A primeira acionada? A
ltima acionada? Nenhuma das duas, ser acionada a que possuir a maior prioridade.
Sendo assim, para definir a prioridade dentre as interrupes habilitadas, utiliza-se a diretiva #priority. A sintaxe e um exemplo so apresentados abaixo.
Descrio: Esta diretiva define a ordem de execuo de interrupes quando as mesmas
so acionadas ao mesmo tempo, em que o primeiro identificador citado o mais importante e o ltimo o menos importante, isto considerando a ordem de prioridade.

Sintaxe:

#priority identificador1, identificador2, identificador3

Exemplo:

#priority int_ext, int_ext2, int_ext1!

Neste exemplo, int. externa 0 tem a maior prioridade, a int. externa 1 tem a menor prioridade e a interrupo externa 2 possui prioridade intermediria entre as anteriores.
Um exemplo de cdigo apresentando a seguir com a configurao de prioridade entre duas interrupes. As interrupes externa 0 e 1 so habilitadas e configuradas, em que as
duas piscam um LED conectado ao pino B7, sendo que a int. ext. 0 acende o LED por
250 ms e a int. ext. 1 acende o LED por 2000 ms. Neste exemplo, a interrupo externa 0,
tem prioridade sobre a interrupo externa 1, conforme a diretiva #priority int_ext,
int_ext1 .

143

Exemplo de prioridade entre interrupes


#include <18f2550.h>
#use delay(clock=20000000)
#priority int_ext, int_ext1
//Prioriza int_ext em relao a int_ext1
#int_ext
void interrupt0(void)
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
#int_ext1
void interrupt1(void)
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(2000);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void main( )
{
enable_interrupts(global);
//Habilita o uso de interrupes
enable_interrupts(int_ext);
//Habilita o uso da interrupo externa 0 (Pino B0)
enable_interrupts(int_ext1);
//Habilita o uso da interrupo externa 0 (Pino B0)
while(1);
}

144

Prticas

Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que pisque um
LED sempre que a interrupo externa 0 for acionada. Considere o acionamento por borda de subida.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que acenda um
LED sempre que a interrupo externa 0 for acionada e apague este LED quando a interrupo externa 1 for acionada.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que acenda o
LED por 5 segundos sempre que a interrupo externa 0 for acionada e apague este LED
quando a interrupo externa 1 for acionada. Considere que a interrupo externa 1 tem a
maior prioridade.
Prtica 04: Projete um hardware e um software utilizando MCU 18f2550, que apresente
um contador que incremente sua contagem utilizando um boto conectado na int. externa
0 e decremente sua contagem utilizando um boto conectado na interrupo externa 1.
Apresente esta contagem em um display de 7 segmentos. Inicialize a contagem com 0 e
pare em 9.
Prtica 05: Projete um hardware e um software utilizando MCU 18f2550, que apresente
um contador que incremente sua contagem utilizando um boto conectado na int. externa
0 e decremente sua contagem utilizando um boto conectado na interrupo externa 1.
Apresente esta contagem em piscadas do LED, por exemplo, se o contador for 4, pisque
um LED 4 vezes.

145

8
Interrupo Serial /
Comunicao serial

Neste capitulo sero abordados tpicos sobre a Transmisso e Recepo serial, ressaltando suas particularidades de software e hardware, enfatizando especificamente o protocolo RS232, sua configurao e implementao em projetos utilizando microcontroladores
PIC.

146

Introduo comunicao serial

Existem dois tipos de comunicao, a serial e a paralela. Abaixo so apresentados algumas particularidades das mesmas.

Quanto comunicao paralela, todos os bits so enviados ao mesmo tempo, possuindo


menor complexidade do software na transmisso e na recepo, e pode ser implementada, por exemplo, transmisso por uma porta B do MCU 1 (output_b) e recepo por uma
porta B do MCU 2 (input_b), conforme mostrado no capitulo de entrada e sada de dados
digitais deste livro. Alm disto, a instalao e a manuteno so mais trabalhosas, visto
que so mais canais de comunicao.
Quanto comunicao serial, os bits so transmitidos um por vez, possuindo uma maior
complexidade na transmisso, visto que obedecem protocolos de comunicao, como
i2c, spi, rs232, entre outras. Este tipo de comunicao possui instalao e manuteno
mais fcil. Algumas caractersticas da comunicao serial so apresentadas a seguir.

147

Modos de funcionamento

Quanto ao modo de funcionamento da transmisso serial, existem dois critrios destacados neste livro, quanto ao sincronismo e direo.

Modos de funcionamento quanto ao sincronismo


Quanto ao sincronismo, a transmisso pode ser sncrona ou assncrona.
1.

Transmisso Sncrona

a. O transmissor e o receptor devem estar sincronizados para troca de informao.

b. Geralmente um dado inicial utilizado para ajustar os relgios (click) internos.

c. Aps sincronismo, os dados so enviados sequencialmente.

2.

Transmisso Assncrona Padro RS232

Esta transmisso utiliza um protocolo de comunicao definido abaixo:


a. A comunicao iniciada com um start bit
b. Os bits de dados so enviados um por um do mais significativo para o menos significativo

c. Um bit de paridade enviado para validar a transmisso

d. A comunicao encerrada com um stop bit

148

Modos de funcionamento quanto direo


Quanto direo dos dados, eles so enviados por um dispositivo e recebido por outro,
sendo estas duas possibilidades:

1.

Transmisso Serial (TX opo XMIT da configurao)

a. Modo em que o MCU o responsvel por emitir os dados

b. O MCU o ponto de sada dos dados

2.

Recepo Serial (RX opo RCV da configurao)


a. Modo em que o MCU o responsvel por receber os dados
b. O MCU o ponto de chegada dos dados

149

Protocolo RS232 - configurao

Protocolo de comunicao adotado neste livro o RS232, e a funo de configurao


deste protocolo detalhado abaixo. A transmisso, recepo e outros detalhes deste protocolo so detalhados a seguir.
Diretiva de configurao: #use rs232 ( opes )

Opes mais importantes:


Opo
baud = x

XMIT=pinX

RCV=pinR

PARITY= p

Descrio
Baud a velocidade de transmisso, medida em bits por segundo (BPS), onde x pode
assumir os valores 19.200, 9.600, 4.800, 2.400, 1.200, entre outras.
XMIT o pino de transmisso do MCU, em que pinX indicado pelo fabricante do
18f2550 sendo o pin_c7
RCV o pino de recepo do MCU, em que pinR indicado pelo fabricante do
18f2550 sendo o pin_c6
Vlida os dados da comunicao, devendo ser configurado igualmente na transmisso
e na recepo. Onde p E, N, ou O

Velocidade Real do baud rate em microssegundos (us):


Baud rate

1200

2400

4800

9600

19200

Tempo (us)

833

417

208

104

52

Pinagem RS-232 RCV XMIT (PIC 18f2550)


Os pinos de Transmisso (TX) e Recepo serial (RX) do microcontrolador PIC 18f2550
so apresentados a seguir.

150

Paridade
A paridade o modo de verificar erros na comunicao no protocolo serial RS232. Para
explicar o funcionamento desta verificao de erros so utilizadas as duas etapas, transmisso e recepo.
Paridade Transmisso - Verificao erros de comunicao
O bit de paridade na etapa de transmisso calculado e colocado no pacote de dados
que ser enviado. Este dado verificado na recepo para validar o pacote de dados.
Para se calcular a paridade na etapa de transmisso, deve-se seguir os passos abaixo:
1.

Conta-se quantos bits de dados possuem valor 1.

2.

Quando este valor obedecer ao parmetro de configurao pr-definido, coloca-se 1

no valor de paridade enviado. Caso contrrio, coloca-se 0 no valor de paridade enviado.


3.

Considerando a paridade Par


a. Caso a quantidade de 1 seja par, ento paridade 1
b. Caso a quantidade de 1seja mpar, ento paridade 0

151

3.

Considerando a paridade mpar


a. Caso a quantidade de 1 seja mpar, ento paridade 1
b. Caso a quantidade de 1seja par, ento paridade 0

Aps calcular a paridade e de ajustar este valor dentro do pacote de dados, este pacote
transmitido para o outro dispositivo.

Paridade Recepo - Verificao erros de comunicao


Aps a chegada de todo o pacote, a paridade recalculada e verifica-se se o resultado
o mesmo que est no pacote. Caso seja, diz-se que a transmisso foi realizada com sucesso.

152

Exemplos de configurao
A transmisso deve obrigatoriamente ser configurada igual a recepo para a comunicao funcionar corretamente. Abaixo so apresentados dois exemplos de cdigos para
configurao, detalhando cada parmetro utilizado.
Exemplo 1:

Exemplo 2:

153

Transmisso Serial (TX)

A transmisso serial no PIC18F2550 realizada atravs do pino C6. Aps a configurao


da transmisso utilizando o protocolo RS 232, sendo a mesma para recepo e transmisso, tm-se que a funo de transmisso apresentada abaixo.
Descrio: funciona igual a funo printf utilizada em C para computador, enviando um
conjunto de caracteres (string) para a sada padro do dispositivo, que no PIC18F2550 o
pino C6.
Funo:

printf

Sintaxe:

printf ( char* ) ;

Exemplo 1:

printf ( TX ) ;

char* uma string (Texto entre )


Envia a string TX pela sada padro, que a serial.

Outros exemplos podem ser apresentados enviando dados numricos pela porta serial.
Nos exemplos abaixo, o %f representa os dados reais alocados em variveis do tipo float
e o %d representa os dados inteiros, alocados em variveis do tipo int. Quando um dos
identificadores citados ( %d ou %f ) so colocados dentro de aspas dupla ( ), o compilador entende que para pegar o dado que est aps as aspas, na mesma sequncia e
ordem da esquerda para direita.

Exemplo 2:

printf(Valor = %f, 10);

Neste exemplo 2, o valor 10 ser colocado no local que est o %f na transmisso serial.

154

Exemplo 3:

printf( x = %d , y = %d , 5 , 4);

Neste exemplo 3, os valores 5 e 4 sero colocados nos %d na mesma sequncia que esto dispostos da esquerda para direita, resultando em x=5, y=4.

Exemplo 4:

int a = 10;
printf( %d , a);
folar b = 20;
printf( %f , b);

Neste exemplo 4, a varivel a recebe o valor 10 e este valor transmitido pela serial, enquanto a varivel b recebe 20 e tambm transmitida pela serial. Vale ressaltar que a diferena o tipo de cada varivel e o identificador da mesma dentro do printf.

155

Configurao da recepo serial (RX)

A recepo serial pode ser realizada de diversas maneiras, entretanto a adotada neste material a mais condizente do ponto de vista do autor, visto que evita processamento desnecessrio, uma vez que s analisa e processa um dado no momento que o mesmo chega na porta serial. Deste modo, a recepo utilizada funciona como uma interrupo serial. Neste sentido, faz necessrio seguir os passos para o uso de uma interrupo, conforme descrito no capitulo sobre interrupes externas, necessitando sua configurao e a
indicao da funo que ser executada no momento que a interrupo for acionada.

Funes de habilitao da interrupo serial


Para habilitar o uso de interrupo externa no PIC 18f2550, faz-se necessrio duas funes, do mesmo modo que a interrupo externa, uma para habilitar o uso global e outra
para habilitar o uso especfico da interrupo serial.
Neste sentido, a funo que habilita o uso de interrupo dentro de uma aplicao

Funo de habilitao global:


enable_interrupts ( global )

Obs: deve-se chamar este comando antes de habilitar qualquer instruo especfica.

J para habilitar o uso da interrupo especfica da recepo serial no 18f2550, deve-se


utilizar o identificador int_rda, que representa a interrupo serial.
enable_interrupts ( int_rda )

Funo de habilitao da interrupo serial


pino C7 no 18f2550:

Obs: esta interrupo ser executada sempre que um dado chegar pela porta serial (C7).

156

Funes da recepo serial (RX)

A captura do dado que chega na porta serial pode ser realizada por diversas funes. Nos
exemplos bsicos deste livro ser utilizado a captura atravs da funo getc, que retorna
um caracter que chegou na porta serial.
Funo de captura:

getc

A funo getc retorna o caracter que chegou pela serial, que acionou a interrupo serial,
e armazena no dado rx, conforme sintaxe abaixo.
Sintaxe:

char rx = getc ( ) ;

Exemplo de uso:
no exemplo ao lado, um caracter capturado e armazenado
int a = 0;
char rx = getc( )
if ( rx == 0 )
!
a = 1;
else
!
a = 2

em uma varivel chamada rx. Este caracter obedece tabela


ASC, possuindo um nmero que representa um smbolo. Entenda como smbolo, todas as letras, maisculas e minsculas, nmeros, espao, operaes matemtica, enfim, tudo que
possa ser digitado. Deste modo, o tipo de dado char pode ser

usado como valor inteiro entre 0 e 255, ou como caracter que deve ser representado entre
aspas simples ( ). Neste exemplo est sendo verificado se rx o smbolo referente ao
nmero 0. Caso sim, a varivel recebe valor 1, caso contrrio, recebe o valor 0.

Funes da interrupo serial


As funes de uma interrupo serial obedecem a uma sintaxe pr-definida no compilador CCS C, devendo esta ser seguida para que a funo desta interrupo seja executada
quando a interrupo for acionada. Esta sintaxe apresentada a seguir.

157

Sintaxe
A funo de uma interrupo fica logo abaixo do seu identificador.

Identificador da interrupo serial


(int_rda) antecedido por #

Funo da interrupo. Pode ter qualquer nome. Deve estar logo abaixo do identificador int_rda. Usurio no a chama, ela executada automaticamente quando interrupo serial acionada quando chega um dado na porta serial.

Exemplo de funo de Interrupo Serial:


#int_rda
void trata_RX(void)
{
char rx = getc( ) ;
}

Exemplo de projeto TX - RX
Transmisso - TX
#include <18f2550.h>
#use delay(clock=20000000)
void main()
{
!
while (1)
!
{
!
!
for(int dado = 0; dado<10;dado++)
!
!
{
!
!
!
printf("%d",dado);
!
!
!
delay_ms(1000);
!
!
}
!
}
}

158

Neste exemplo de projeto TX-RX, a transmisso est enviando uma contagem de 0 a 9 a


cada 1 segundo. Estes dados emitidos esto em formato de caracter, visto que esto sendo transmitidos pela funo printf. Ento, do outro lado, deve-se esperar os smbolos da
contagem, no o nmero em si. No se engane que a mesma coisa, pois no . Por
exemplo, quando voc envia um nmero por mensagem de texto SMS de um aparelho de
celular, este nmero no pode ser somado, nem comparado, pois apenas um smbolo.

Recepo - RX
#include <18f2550.h>
#use delay(clock=20000000)
#int_rda //identificador da interrupo externa 0
void trata_RX(void) // Trata interrupo externa 0
{
char rx = getc();
if( rx == 0 )
!
output_high(pin_b0);
if( rx == 5 )
!
output_low(pin_b0);
}
void main()
{
enable_interrupts(GLOBAL|INT_RDA); // Habilita interrupo Global e Int_Ext
while (1); // Aguarda por uma interrupo
}

A recepo RX deste projeto exemplo, habilita a interrupo serial (int_rda) e fica em loop
infinito ( while(1) ) espera da chegada de um dado pela porta serial. Quando isto acontece, a funo trata_RX acionada. Dentro desta, a funo getc captura o dado da serial
e armazena na varivel rx. Aps isto, esta varivel verificada em duas condies if, e
quando esta varivel est com o carcter 0, o pino B0 colocado para nvel lgico alto
(5V). Alm disto, quando esta varivel est com o carcter 5, o pino B0 colocado para
nvel lgico baixo (0V).

159

Quanto prioridade das interrupes, as funes so as mesmas da Seo 7.6, entretanto para solidificar o conhecimento, abaixo segue um exemplo utilizando interrupo externa e serial ao mesmo tempo, alm de configurar a prioridade das mesmas.

#include <18f2550.h>
#use delay(clock=20000000)
#priority int_ext, int_rda //Prioriza int_ext em relao a int_rda
#int_ext
void interrupt0(void)
{
cont++;
}
#int_rda
void interrupRX(void)
{
char rx = getc();
}
void main( )
{
enable_interrupts(global); //Habilita o uso de interrupes
enable_interrupts(int_ext); //Habilita o uso da interrupo externa 0 (Pino B0 pic18f2550)
enable_interrupts(int_rda); //Habilita o uso da interrupo serial (Pino C6 pic18f2550)
while(1);
}

160

Comunicao entre Computador e MCU

O Circuito Integrado Max 232 bastante utilizado na construo do hardware para comunicao entre computadores pessoais e o microcontrolador utilizando o protocolo RS232.
O uso deste dispositivo detalhado a seguir.
O padro utilizado pelo CI MAX 232 o RS232, que possui as seguintes caractersticas:

O tipo de transmisso serial, ou seja, transmitimos os bytes atravs de uma nica

via bit a bit e nobyte a byte como em uma porta paralela.


Devido aos nveis de tenso estabelecidos na norma a distncia de transmisso (ta-

manho do cabo) pode chegar a 45 metros, sendo aconselhvel distncia de no mximo


25 metros, e alguns fabricantes limitam em 15 metros.

Para trabalhar com a comunicao RS-232, preciso conhecer um pouco sobre o

que a norma determina com relao as caractersticas mecnicas (formato dos conectores e distribuio dos pinos), eltricas (nveis de tenso presentes) e lgicas (como os
dados so transmitidos e recebidos) da mesma.
O hardware bsico do CI MAX232 para comunicao entre computador e microcontrolador apresentado abaixo:

161

Para detalhar as conexes dentre o MCU e o MAX232 eas conexes entre o computador
e o MAX232, apresenta-se a figura abaixo.

Conforme a figura acima, o pino 12 do MAX232 conecta-se ao pino C7 do MCU e o pino


11 ao pino C6, sendo estas as conexes entre MCU e MAX232. J as conexes com o
computador devem ser realizadas usando um cabo DB9, em que este se encaixa na porta
serial do PC e deve-se adicionar um conector DB9 no circuito de comunicao, onde em
um circuito bsico, deve-se conectar o pino 13 do MAX232 no pino 6 do conector DB9 e
o pino 14 do MAX232 no pino 3 do conector DB9, sendo estas as conexes do MAX232
com um computador.
Vale ressaltar que existe circuito mais completos de comunicao entre computador e
MCU, alm de poder substituir o conector DB9 por um conector USB, e assim, poder realizar a comunicao pela prpria, que tambm funciona como porta serial. Entretanto, este
livro apresenta outra opo mais interessante, que o uso de mdulos bluetooth para comunicao serial, sendo este assunto abordado na seo seguinte.

162

Comunicao Serial via bluetooth

A comunicao serial atravs de mdulos bluetooth possui uma menor complexidade que
a cabo por vrios pontos de vista, como maior facilidade de projeto de hardware, incluindo circuitos de proteo, diminuio de custos com cabos, incluindo custos com manuteno, alm de possibilitar a comunicao com outros dispositivos, como celulares, tablets, entre outros.
A comunicao serial por bluetooth adotada neste livro utiliza dispositivos shield bluetooth, que so fabricados por diversas empresas e podem ter entre 4 e 6 pinos, onde os
que apresentam s 4 pinos funcionam iguais aos de 6, s que com menos funcionalidade
e/ou configuraes. Portanto, ser apresentado abaixo o modo completo com 6 fios.

Exemplos deste shield bluetooth (SD) so apresentados direita da figura e esquerda


apresentado o circuito de conexo. Neste circuito, basta conectar o RX do MCU no TX do
SB e o TX do MCU no RX do SB, conforme apresentado na figura. Alm disto, faz-se necessrio alimentar o BS. Pronto! O circuito s, o restante faz parte do MCU e da aplicao, conforme visto nos captulos anteriores.

163

As funcionalidade dos demais pinos do BS so apresentadas abaixo:

Normalmente conecta-se um LED no pino State e outro no pino ENABLE para monitorar
sua situao, pois quando estes pinos estiverem com 5V o seu respectivo LED deve acender e apagar quando estiver com 0V. Os mdulos de BS que possuem apenas 4 pinos
no possuem os pinos State e ENABLE.
Para realizar comunicao via Bluetooth deve-se primeiramente conectar o dispositivo e
digitar a senha de pareamento dita pelo fabricante (Normalmente 1234). Aps isto, basta
comear a transmisso.
Alguns programas emuladores de comunicao serial so bastante difundidos, onde podem ser configurados a porta de comunicao, velocidade, bits de dados, paridade, entre
outras propriedades para estabelecer uma comunicao serial para enviar e receber dados. Pode-se citar alguns, como o Docklight para Windows 7 e Vista, o Hyperterminal
que j instalado dentro do Windows XP, e apenas nele (est dentro da aba dos Acessrios da lista de Programas instalados), o BlueTherm para dispositivos com sistema operacional Android (Google) para comunicao Serial RS 232 via bluetooth, entre outros.

164

Prticas

Projeto 1:
Prtica TX: Projete um contador que incremente sua contagem de 0 at 9 dentro do programa principal, conforme exemplo abaixo.

Prtica RX: Projete um software e um hardware que receba um dado pela interrupo serial e apresente este dado em um display de 7 segmentos. Os dados que iro chegar ser
sempre entre 0 e 9.

165

Projeto 2:
Prtica TX: Projete um contador que incremente sua contagem utilizando um boto conectado na int. externa 0 e decremente sua contagem utilizando um boto conectado na interrupo externa 1. Sempre que o valor da interrupo for alterado, envie pela porta serial
o valor da contagem. A contagem dever ser de 0 a 9, quando passar de 9 deve voltara
para zero, e quando for menor que zero deve ir para 9.

Prtica RX: Projete um software e um hardware que receba um dado pela interrupo serial e apresente este dado em um display de 7 segmentos. Os dados que iro chegar ser
sempre entre 0 e 9.

Projeto 3:
Prtica TX: Utilize algum programa de emulao serial e estabelea comunicao com um
Microncontrolador.

Prtica RX: Projete um software e um hardware que receba um dado pela interrupo serial e apresente este dado em um display de 7 segmentos. Os dados que iro chegar ser
sempre entre 0 e 9.

166

9
Interrupo
temporizada

Neste capitulo so abordados tpicos sobre o uso de interrupes temporizadas. Estas


interrupes funcionam iguais as demais apresentadas anteriormente, devendo ser configuradas previamente, entretanto esta possui uma configurao a mais que o tempo de
acionamento da mesma. Esta interrupo funciona atravs de um contador que funciona
em segundo plano e quando este chega contagem pr-configurada, a interrupo acionada, isto geralmente chamado pelo estouro do timer.
167

Interrupo por Timer - PIC18f2550

Esta interrupo gerada pelo estouro de uma contagem interna do MCU. O PIC18F2550
possui 4 timers que funcionam como interrupo, Timer 0, 1, 2 e 3. Cada um destes timers possui um identificador especfico que utilizado para habilitar a interrupo e tambm para identificar qual funo deve ser executada quando o estou do mesmo acontecer. Os identificadores so apresentados na tabela abaixo.
Interrupes do PIC18F2550

Identificadores

Int. Timer 0

int_timer0

Int. Timer 1

int_timer1

Int. Timer 2

int_timer2

Int. Timer 3

int_timer3

Habilitao das Interrupes por timer no PIC18F2550


Para habilitar o uso de interrupo temporizada no PIC 18f2550, faz-se necessrio duas
funes, conforme descrito nos captulos anteriores, uma para habilitar o uso global e outra para habilitar o uso especfico da interrupo por timer.
Neste sentido, a funo que habilita o uso de interrupo dentro de uma aplicao
Funes de habilitao global:
!

enable_interrupts ( global );

Obs: deve-se chamar este comando antes de habilitar qualquer instruo especfica.

168

J para habilitar o uso de uma interrupo especfica no PIC18F2550, deve-se chamar a


mesma funo, alterando o argumento de entrada para o identificador da funo especfica que deseja habilitar a interrupo.
Funo de habilitao da interrupo do Timer 0:
enable_interrupts ( int_timer0 );

Funo de habilitao da interrupo do Timer 1:


enable_interrupts ( int_timer1 );

Funo de habilitao da interrupo do Timer 2:


enable_interrupts ( int_timer2 );

Funo de habilitao da interrupo do Timer 3:


enable_interrupts ( int_timer3 );

Funo das Interrupes por timer


Sempre que o estou do timer acontece, a interrupo acionada, uma funo chamada
para processar esta interrupo. A uma funo de uma determinada interrupo executada a partir de um identificador, o mesmo usado para habilitar a interrupo. A sintaxe
de construo desta sub-rotina apresentada abaixo e exemplos de funes para as interrupes dos timer 0, 1 e 2 so apresentados a seguir.

169

Exemplo com int. por Timer 0:


Identificador da Interrupo por timer 0
Funo de interrupo por timer 0. Neste exemplo, a varivel cont incrementada
sempre que acontece o estou do timer 0.

Exemplo com int. por Timer 1:


Identificador da Interrupo por timer 1
Funo de interrupo por timer 1. Neste exemplo, a varivel cont decrementada
sempre que acontece o estouro do timer 1.

Exemplo com int. por Timer 2:


Identificador da Interrupo por timer 2
Funo de interrupo por timer 2. Neste exemplo, a varivel cont zerada sempre
que acontece o estouro do timer 2.

170

Compreendendo melhor o estouro do timer

A contagem de um timer acontece at o mesmo chegar a contagem mxima pr-configurada. Ao chegar neste valor mximo, a interrupo acionada e a funo correspondente
executada caso set interrupo esteja habilitada.
Para que seja entendido com mais detalhes, vamos supor que a contagem mxima prconfigurada no timer 10, ento sua contagem comear em 0 e ir at 10, que o valor
mximo. Quando esta contagem chegar ao valor 10, ento a interrupo acionada. Este
exemplo pode ser visualizado no vdeo abaixo. Lembrando que estes valores so exemplos simples para facilitar o aprendizado.
Filme 9.1 Exemplo de demonstrao do estouro do timer.

A animao acima apresenta o estouro do timer com mais detalhes, em que a contagem inicializa
em 0 e incrementada at o valor mximo, que 10 neste exemplo, onde acontece o estouro do
timer e a interrupo acionada.

171

Prescaler - teoria deste modo de configurao

O modo de configurao utilizando prescaler bastante utilizado para ampliar a contagem do valor das interrupes temporizadas. Esta configurao permite aumentar uma
contagem pequena para uma maior n vezes.
Exemplificando a configurao do prescaler para um melhor entendimento, ser utilizado
a contagem mxima 10, conforme exemplos anteriores e um prescaler com valor 3. Isto
quer dizer que o timer deve estourar 3 vezes para que a interrupo seja acionada, conforme o Filme 9.2, apresentado abaixo.
Filme 9.2 : Exemplo de demonstrao terica do prescaler.

Neste exemplo, o timer estoura na contagem 10, o precaver 3, mas a interrupo s acionada
na contagem 30, que corresponde contagem mxima multiplicada pelo prescaler.

172

Configuraes das interrupes temporizadas


no PIC18F2550

No microcontrolador PIC18F2550 existem 4 timers que so utilizados para acionar a interrupo temporizada. Cada um destes timers possui uma resoluo distinta, neste sentido
a contagem mxima de cada timer tambm distinta. Abaixo so apresentados os valores das resolues para cada timer e os tempos de contagem mxima de cada estouro do
timer em microsegundos e em segundos.
Timer

Resoluo

Microsegundos

Segundos

A partir dos valores mximos de contagem dos timers possvel explanarmos os modos
de configurao do precaver, do incio da contagem e do clock utilizado na contagem.

Configurao do clock do timer


Descrio: Coloca o TIMER especificado por N com origem determinada por PARMETRO.

Funo:

setup_timer_N

Sintaxe: SETUP_TIMER_N (PARMETRO)


Exemplo:

setup_timer_1 ( T1_internal ) ;
173

Existe outros parmetros possveis para a configurao do clock do timer, entretanto nas
prticas deste livro o clock ser sempre configurado como clock interno. Vale ressaltar
que os timers 1, 2 e 3 obedecem ao exemplo apresentado, sendo o parmetro de configurao T1_internal, T2_internal e T3_internal para realizar a configurao citada nos timer 1, 2 e 3, respectivamente. J o timer 1 deve ser configurado com o paramento
RTCC_internal para que o mesmo use o clock interno.
Resumo:

Configurao do prescaler do timer


Cada um dos timers do PIC18F2550 possui valores distintos de configurao de prescaler, possuindo faixas de valores distintas. A tabela abaixo apresenta os valores possveis
de configurao do prescaler.
Timer

Prescaler mximo

Valores possveis

256

1, 2, 4, 8, 16, ... , 64, 128, 256

1, 2, 4, 8

16

1, 2, 4, 8, 16

1, 2, 4, 8

Vale ressaltar que o prescaler a quantidade de vezes que o microcontrolador precisa realizar o estouro do timer para acionar a interrupo temporizada. A funo que realiza a
configurao do prescaler apresentada a seguir.

174

Configurao do prescaler do timer 0


Descrio: Coloca o TIMER 0 com prescaler de valor VAR.
Funo:

SETUP_TIMER_0

Sintaxe: SETUP_TIMER_0 (RTCC_DIV_VAR)

Exemplo:

SETUP_TIMER_0 (RTCC_DIV_2)

No exemplo acima a configurao do prescaler 2, ento o clock deve estourar 2 vezes


para acionar a interrupo, dobrando o tempo de acionamento do timer 0. Outros exemplos de configurao so apresentados abaixo.

Exemplo 1: uso da interrupo temporizada 0 com contagem completa 64 vezes.

Neste exemplo, o timer 0 configurado com prescaler 64 e clock interno. Na funo principal, a execuo fica em loop infinito sem fazer nada, preso na instruo while(1). Sempre
que a interrupo do timer 0 acionada, a funo trata_t0 acionada, visto que ela est
em baixo do identificador #int_timer0. Nesta funo o pino B7 colocado para alto (5V) e
250 milisegundos depois colocado para baixo (0V). Esta configurao de prescaler 64
do timer 0 de 16 bits que cada ciclo do timer estoura em 0,065536 segundos, ento se sero necessrios 64 estouros para acionar a interrupo externa 0, tm-se que esta interrupo ser acionada em 4,194304 segundos (0,065536x64= 4,194304).

175

#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer0-//idenKcador-da-interrupo-temporizada-0
void-trata_t0(void)-//"Trata"interrupo"por"Kmer"0
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER0);-//"Habilita"interrupo"Global"e"Int_TIMER0
setup_Kmer_0(RTCC_INTERNAL|RTCC_DIV_64);-//configura timer 0 com clock interno e
//prescaler 64
while-(1);-//"Aguarda"por"uma"interrupo
}
Exemplo 2: uso da interrupo temporizada 0 com contagem completa 256 vezes.

Neste exemplo 2, o timer 0 configurado com prescaler 256 e clock interno. Do mesmo
modo que o exemplo 1, a execuo fica em loop infinito sem fazer nada, preso na instru-

#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer0-//idenKcador-da-interrupo-temporizada-0
void-trata_t0(void)-//"Trata"interrupo"por"Kmer"0
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER0);-//"Habilita"interrupo"Global"e"Int_TIMER0
setup_Kmer_0(RTCC_INTERNAL|RTCC_DIV_256);-//configura timer 0 com clock interno
// e prescaler 256
while-(1);-//"Aguarda"por"uma"interrupo
}

176

o while(1). Sempre que a interrupo do timer 0 acionada, a funo trata_t0 acionada, visto que ela est em baixo do identificador #int_timer0, em que esta funo funciona
igual o exemplo 1. Nesta configurao de prescaler 256 do timer 0 de 16 bits que cada ciclo do timer estoura em 0,065536 segundos, ento se sero necessrios 256 estouros
para acionar a interrupo externa 0, tm-se que esta interrupo ser acionada em
4,194304 segundos ( 0,065536 x 256 = 16,777216 ).

Configurao do prescaler do timer 1


Descrio: Coloca o TIMER 1 com prescaler de valor VAR.

Funo:

SETUP_TIMER_1

Sintaxe: SETUP_TIMER_1 (T1_DIV_VAR)


Exemplo:

SETUP_TIMER_1 (T1_DIV_4)

No exemplo apresentado a configurao do prescaler 4, ento o clock deve estourar 4


vezes para acionar a interrupo, quadruplicando o tempo de acionamento do timer 1. Outros exemplos de configurao so apresentados abaixo.

177

Exemplo 3: uso da interrupo temporizada 1 com contagem completa 8 vezes.

Neste exemplo 3, o timer 1 configurado com prescaler 8 e clock interno. Na funo principal, a execuo fica em loop infinito sem fazer nada, preso na instruo while(1). Sempre que a interrupo do timer 1 acionada, a funo interrupt1 acionada, visto que ela
est em baixo do identificador #int_timer1. Nesta funo o pino B7 colocado para alto
(5V) e 250 milisegundos depois colocado para baixo (0V). Esta configurao de prescaler 8 do timer 1 de 16 bits que cada ciclo do timer estoura em 0,065536 segundos, ento
se sero necessrios 8 estouros para acionar a interrupo externa 1, tm-se que esta interrupo ser acionada em 0,524288 segundos (0,065536x8= 0,524288).

#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer1-//idenKcador-da-interrupo-temporizada-1
void-interrupt1(void)-//"Trata"interrupo"por"Kmer"1
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER1);-//"Habilita"interrupo"Global"e"Int_TIMER1
setup_Kmer_1(T1_INTERNAL|T1_DIV_8);-//configura timer 1 com clock interno
// e prescaler 8
while-(1);-//"Aguarda"por"uma"interrupo
}

Configurao do prescaler do timer 2


Descrio: Coloca o TIMER 2 com prescaler de valor VAR.
Funo:

SETUP_TIMER_2

Sintaxe: SETUP_TIMER_2 (T2_DIV_VAR)


178

Exemplo:

SETUP_TIMER_2 (T2_DIV_4)

No exemplo apresentado a configurao do prescaler 4, ento o clock deve estourar 4


vezes para acionar a interrupo, quadruplicando o tempo de acionamento do timer 2. Outros exemplos de configurao so apresentados abaixo.

Configurao do prescaler do timer 3


Descrio: Coloca o TIMER 3 com prescaler de valor VAR.
Funo:

SETUP_TIMER_3

Sintaxe: SETUP_TIMER_3 (T3_DIV_VAR)


Exemplo:

SETUP_TIMER_3 (T3_DIV_4)

No exemplo apresentado a configurao do prescaler 2, ento o clock deve estourar 2


vezes para acionar a interrupo, duplicando o tempo de acionamento do timer 3. Outros
exemplos de configurao so apresentados abaixo.

179

Compensao do tempo gasto na interrupo

Muitas vezes quando se usa a interrupo temporizada, deseja-se fazer algo considerando um tempo de forma constante, como por exemplo, ler uma porta a cada segundo. Entretanto, s vezes, a funo da interrupo que est execuo demanda um certo tempo,
ento, o tempo desejado no ser executado. A figura abaixo apresenta um exemplo em
que o tempo desejado e configurado para acionamento da interrupo 1 segundo, conforme apresentado em verde, sendo que a funo executada dentro da interrupo possui
custo computacional de 0,2 segundos. Como a contagem para uma nova interrupo s
comea ao sair da funo da interrupo, ento o tempo entre a execuo das funes
o somatrio do tempo configurado com o tempo gasto pela funo da interrupo que
1,2 segundos.

1,2 segundos

1 segundo

Interrupo

1,2 segundos

0,2 s

1 segundo

Interrupo

1,2 segundos

0,2 s

1 segundo

Interrupo

0,2 s

Interrupo

Deste modo, faz-se necessrio compensar este tempo gasto pela funo da interrupo
utilizando as funes get_timer_x e set_timer_x, em que x o timer utilizado.

180

Inicializao da contagem do timer


Descrio: Inicializa a contagem do TIMER especificado com valor N. Deste modo a contagem no possuir o valor total, mas sim o que resta do valor N at o valor mximo configurado.
Funo:

set_timer_N

Sintaxe: SET_TIMER_N (VALOR)


Exemplo 1:

set_timer_1 ( 1000 ) ;

Exemplo 2:

set_timer_2 ( 100 ) ;

Exemplo 3:

set_timer_3 ( 10 ) ;

Verificao da contagem do timer


Descrio: Verifica a contagem do TIMER especificado com valor N, retornando o valor
da contagem que o timer N possui, servindo como funo de auxlio contagem, possibilitando tal monitoramento.
Funo:

get_timer_N

Sintaxe: VALOR = GET_TIMER_N ( );


Exemplo 1:

long int VALOR = get_timer_1 ( ) ;

Exemplo 2:

long int VALOR = get_timer_2( ) ;

Exemplo 3:

long int VALOR = get_timer_3( ) ;

Em todos os exemplos apresentados, a varivel VALOR recebe a contagem que o timer


selecionado est naquele momento.

181

Compensao do tempo gasto na funo da interrupo temporizada


A compensao consiste em inicializar a contagem com o tempo que a funo da interrupo temporizada demandou na sua execuo. A figura abaixo apresenta o mesmo citado
anteriormente, em que o tempo desejado e configurado para acionamento da interrupo
1 segundo, conforme apresentado em verde, sendo que a funo executada dentro da
interrupo possui custo computacional de 0,2 segundos. Entao a contagem incivilizada com 0,2 segundos, deste modo o contador contabiliza apenas 0,8 para acionar o timer
em 1 segundo.
1 segundo

0,2 s

Interrupo

0,8 s

1 segundo

0,2 s

Interrupo

0,8 s

1 segundo

0,2 s

0,8 s

Interrupo

1 segundo

0,2 s

Interrupo

0,8 s

Interrupo

Para realizar esta compensao, basta ler a contagem e utilizar este valor para inicializar a
contagem da interrupo que vir a seguir, ou seja chamando a funo get_timer_x dentro
da funo set_timer_x, conforme exemplo abaixo.
set_timer_x ( get_timer_x( ) );

A linha de comando acima, funciona do seguinte modo: a funo get_timer_x retorna um


valor referente a contagem atual do timer e este utilizado para inicializar a contagem do
mesmo timer x. Um exemplo completo deste artificio apresentado a seguir.

182

Exemplo:

#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer1-//idenKcador-da-interrupo-temporizada-1
void-interrupt1(void)-//"Trata"interrupo"por"Kmer"1
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
set_3mer_10(0get_3mer_1(0)0);//compensa0os02500ms0gastos0no0delay0e0no0acesso0ao0pino0B7
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER1);-//"Habilita"interrupo"Global"e"Int_TIMER1
setup_Kmer_1(T1_INTERNAL|T1_DIV_8);-//configura timer 1 com clock interno
// e prescaler 8
while-(1);-//"Aguarda"por"uma"interrupo
}
Neste exemplo, a compensao do tempo gasto na funo interrupt1 apresentado em
vermelho, em que a contagem do timer 1 para uma nova interrupo deste timer inicializado com a contagem que foi gasta na execuo da funo da interrupo. Vale ressaltar
que o usurio no precisa saber o tempo exato que ir demorar dentro do timer, pois este
modo de uso inicializa a contagem sempre com o valor gasto pela funo da interrupo.
Deve-se apenas ter cuidado de no configurao o acionamento da interrupo com um
tempo inferior ao tempo demandado pela funo da interrupo temporizada, pois neste
caso no haver como compensar o tempo gasto.

183

Configurao para o tempo desejado

Muitas vezes o estouro do timer total no satisfaz uma aplicao especfica, onde desejase a contagem de um valor menor do que o mximo daquela interrupo. Ento, como
acionar a interrupo com um valor menor que o mximo?
Para responder esta pergunta, no se pode esquecer que o acionamento da interrupo
acontece quando o contador chega na contagem mxima. Deste modo, quando se deseja
acionar um valor menor do que o mximo, basta alterar o incio da contagem. Por exemplo, considerando que a contagem mxima 10, igual o Filme 9.1, e que se deseja uma
contagem de apenas 8 para acionar o timer, ento deve-se inicializar a contagem com a
diferena destes dois valores, que o valor 2. Estes dados so apresentados a seguir
para melhor visualizao.

Para melhorar o entendimento, o Filme 9.2 apresenta o estouro do timer com a contagem
8, entretanto o valor mximo continua 10, alterando apenas a inicializao para o valor 2.

184

Filme 9.3 Exemplo de acionamento do timer com valor menor que o mximo do timer.

Este filme acima apresentada a contagem de um valor menor que o mximo, utilizando a diferena
do valor mximo do timer e o valor desejado para inicializar a contagem. Deste modo, o estouro do
timer ser realizado na contagem desejada.

Configurao do tempo desejado no software

Para se configurar o tempo do temporizador desejado deve-se seguir alguns passos descritos a seguir. Entretanto, deve-se ressaltar que o tempo desejado no deve ultrapassar o
valor mximo do timer utilizado. De posse do tempo desejado, deve-se seguir os passos
a seguir:

185

1.

Escolher o timer que ser utilizado

2.

Escolher o prescaler utilizado

3.

Verificar se o tempo desejado menor que o produto do prescaler pelo valor mximo

do timer escolhido. Caso no, repetir 1, 2 e 3.


4.

Calcular a inicializao para o obter o tempo desejado, a partir da frmula a seguir:

em que

Vinit

= Valor desejado

Nbits

= Nmero de bits do timer selecionado

Vprescaler = Valor do precaver utilizado

TD

= Tempo Desejado

186

Para se exemplificar o clculo apresentado, vamos considerar o uso do Timer 0, desejando o acionamento da interrupo de 0,5 segundos. Para isto iremos usar o passo detalhados, selecionando o prescaler 64 bits.
Passos sugeridos:

Implementao do exemplo: Neste exemplo abaixo, a inicializao da contagem com o


valor 57723 apresentada em vermelho e o prescaler com valor 64 em azul.

#include <18f2550.h>
#use delay(clock=20000000)
#int_timer0
void timer0(void)
{
delay_ms(50);
set_timer_0( 57723 + get_timer_0() ); //compensa os 50 Sm gastos e inicializa com 57723
}
void main( )
{
enable_interrupts(global);
//Habilita o uso de interrupes
enable_interrupts(int_timer0);
//Habilita o uso da interrupo pelo timer 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //configura timer 0 com clock interno
//e prescaler 64
set_timer_0(57723); //inicializa timer com 3036 para obter interrupcao com 0,5 segundos
while(1);
}
187

Configurao para valores desejados maiores


que o timer do MCU

Diferente da seo anterior, s vezes desejamos executar uma funo com um intervalo
maior do que o timer disponibilizado. Para usar esta metodologia iremos utilizar um artifcio de programao e no uma configurao do timer. Para demonstrar esta artficio, iremos incrementar o exemplo apresentado na seo anterior, onde o timer 0 est habilitado
para ser acionado a cada 0,5 segundos, em que o artifcio apresentado em vermelho no
cdigo abaixo.
Exemplo:

#include <18f2550.h>
#use delay(clock=20000000)
int contTimer = 0;
#int_timer0
void timer0(void)
{
contTimer ++;
if(contTimer = = 2)
{
delay_ms(50);//Poderia ser outras funes, uma ou um bloco de comandos
}
set_timer_0( 57737 + get_timer_0() );
//Inicializao da contagem para o proximo ciclo de interrupcao com 57736
//get_timer_0() compensa o tempo de execucao das operacoes do timer ( delay_ms(50) )
}
void main( )
{
enable_interrupts(global);
//Habilita o uso de interrupes
enable_interrupts(int_timer0);
//Habilita o uso da interrupo pelo timer 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //configura timer 0 com clock interno
e prescaler 64
set_timer_0(57736); //inicializa timer com 3036 para obter interrupcao com 0,5 segundos
while(1);
}
188

No exemplo apresentado anteriormente, o mtodo de executar uma funo ou comandos


especficos em tempos maiores que o do timer configurado gira em torno da varivel
contTimer. Esta varvel controla a quantidade de vezes que o timer foi acionado e sempre que isto acontece ela incrementada. O segredo est em multiplicar o tempo do timer
para o que voc deseja. Por exemplo, no exemplo o timer est configurado para 0,5 segundos, ento se a varivel contTimer estiver com valor 2, significa que a interrupo foi
acionada duas vezes, e como cada uma das vezes corresponde a 0,5, ento 2 correspondem a 1 segundo. Ento neste exemplo, a funo delay_ms(50) s ser executada a cada
1 segundo. Vale ressaltar que esta funo ilustrativa, onde deve ser substituda pela sua
aplicao especfica, podendo ser uma funo ou um bloco de comandos.
Vale ressaltar que esta varivel inicializada com zero, e deve ser zerada sempre que entrar dentro do if que controla a quantidade de acionamentos da interrupo para que o
processo seja reiniciado a cada execuo dos comandos desejados.
Isto pode ser aplicado a qualquer timer ou at mesmo a qualquer microcontrolador, pois
como citado anteriormente, um artifcio de programao e no uma configurao.

189

Prticas

Prtica 1: Projete um contador com display de 7 segmentos que incremente sua contagem atravs de uma interrupo externa a cada 0,5 segundo.

Prtica 2: Projete um hardware e um software com MCU que a cada 1 segundo acione o
timer, leia um ADC, transforme este valor em tensao e apresente a parte inteira desta tenso em um display de 7 segmentos.

Prtica 3: Projete um hardware e um software com MCU que a cada 5 segundos acione
um timer de seua escolha e acenda o LED1 durante 0,5 segundos. Alm disto, acenda o
LED2 por 0,5 segundos sempre que apertar um boto conectado e acionado atravs de
uma interrupo externa. Vale ressaltar que a prioridade de interrupes externas, timer,
serial, entre outras funcionam igualmente ao demonstrado para interrupo externa.

Prtica 4: Projete um hardware e um software com MCU que a cada 5 segundos acione o
timer 0, acendendo o LED1 e a cada 1 segundo acione o timer 1 e acenda o LED2.

Prtica 5: Projete um hardware e um software com MCU que a cada 20 segundos acione
o timer 0, acendendo o LED1. Ressalto que deve ser utilizado o artifcio apresentado na
Seo 7 deste capitulo.

190

10
Sistema de reset e
configuraes

Sistemas de reset so os diversos modos

pos de reset apresentados a seguir so:

de reiniciar o microcontrolador e retornar

Alimentao inicial do chip, Queda de ten-

ao incio do programa em execuo. Exis-

so de alimentao, Timer de inicializao,

tem diversos modos e os principais sero

Timer de partida do oscilador, Reset por

abordados neste capitulo, inclusive a for-

software, Reset por hardware e Reset por

ma de deteco da causa de reset. Os ti-

Watch Dog Timer (WDT).

191

Alimentao inicial do chip


Descrio: Circuito interno detecta a subida de tenso, mantendo-o em reset at que ele
atinja o valor nominal de operao. Quando a tenso estabiliza, ento o sistema incivilizado.
Diretiva para habilitar esta configurao:

#fuses POR

Diretiva para desabilitar esta configurao:

#fuses NOPOR

Queda de tenso de alimentao (Brown-Out Reset BOR)


Descrio: Quando BOR est ativado e ocorre uma queda de tenso abaixo de VBOR
configurado, o micro reseta e s reinicia quando a tenso se restabelecer.
Diretiva para habilitar esta configurao:

#fuses BROWNOUT

Diretiva para desabilitar esta configurao:

#fuses NOBROWNOUT

Configuraes possveis da tenso de reset VBOR

#fuses
#fuses
#fuses
#fuses

BOR46
BOR43
BOR28
BOR20

Configura
Configura
Configura
Configura

VBOR
VBOR
VBOR
VBOR

para
para
para
para

4,6
4,3
2,8
2,0

V
V
V
V

Vale ressaltar que a configurao da tenso VBOR deve vir depois da habilitao do
Brown-Out Reset, nunca anteriormente.

192

Timer de inicializao (Power-Up Timer - PUT)


Descrio: Faz o microcontrolador esperar 66 ms a mais no tempo total de reset, fazendo
isto visando a estabilidade do sistema e dos perifricos do microcontrolador.

Diretiva para habilitar esta configurao:

#fuses PUT

Diretiva para desabilitar esta configurao:

#fuses NOPUT

Timer de partida do oscilador (Oscilador Start-up Timer - OST)


Descrio: Permite a estabilizao do oscilador externo antes de iniciar o microcontrolador.
Diretiva para habilitar esta configurao:

#fuses OST

Diretiva para desabilitar esta configurao:

#fuses NOOST

Reset por hardware


Descrio: Permite resetar o MCU setando nvel lgico baixo no pino MCLR (pino 1 geralmente). Deste modo, sempre que a tenso do pino do MCU for 0V, ento o mesmo ir resetar, e quando voltar para 5V, o programa reiniciado.
Diretiva para habilitar esta configurao:

#fuses MCLR

Diretiva para desabilitar esta configurao:

#fuses NOMCLR

193

Reset por software


Descrio: Sempre que a instruo abaixo executada em qualquer ponto do programa,
o microcontrolador reinicia a sua execuo.
Funo de reset por software:

reset_cpu ( );

Reset por temporizador co de guarda ( Watch Dog Timer - WDT )


Descrio: Timer responsvel por checar o funcionamento do programa, resetando o
MCU quando este parar de funcionar.
Funcionamento: O WDT um contador que ao chegar ao limite de contagem configurado, reinicia o programa do MCU. Deste modo, basta reiniciar a contagem em alguns pontos do cdigo, evitando que a contagem chegue no limite mximo pr-configurado, evitando o reset. Quando utilizado corretamente, o MCU s ir chegar a contagem mxima
quando houver algum problema e parar de funcionar, devendo assim, ser reiniciado.
Diretiva para habilitar esta configurao:

#fuses WDT

Diretiva para desabilitar esta configurao:

#fuses NOWDT

Modo de reset: O programa deve ser responsvel por reiniciar a contagem do timer do
WDT em alguns pontos do cdigo. Aconselha-se a colocar em pontos executados rotineiramente do programa, visto que se estas funes deixem de ser executada, isto indica
que o MCU parou de funcionar e deve ser resetado, ou seja, reiniciado.
A funo de habilitao da contagem do WDT :
A funo de reset da contagem do WDT :

setup_wdt( WDT_ON );
restart_wdt( )

194

Configurao do tempo de reset do WDT: a diretiva desta configurao indica a quantidade de ciclos que o WDT ir contabilizar, em que ao chegar nesta contagem o WDT reiniciar o programa em execuo. Vale ressaltar que cada ciclo equivale a 4,1 milisegundos
(ms). Esta configurao obedece a diretiva de configurao apresentada abaixo.
Diretiva para desabilitar esta configurao:

#fuses WDTVALOR

Vale ressaltar que o termo VALOR da diretiva apresentada pode receber os valores
1,2,4,8,16,32,64,...,32768. Por exemplo, caso nmero de ciclos do WDT seja configurado
com 1024, em que cada ciclo equivale a 4,1 ms, ento o tempo de reset deste WDT
1024x4,1ms, que igual a 4,2 segundos. Isto quer dizer que se o WDT no reiniciar sua
contagem em um perodo de 4,2 segundos, ento este ser reiniciado. Este exemplo de
configurao apresentado abaixo:
#fuses WDT!

#fuses WDT1024!

//Habilita o uso do WDT

//Configura reset em 1024 X 4,1ms = 4,2

Relembrando que a funo setup_wdt(WDT_ON) deve estar sendo chamada no incio do


programa para habilitar o WDT. Alm disto, a funo restart_wdt deve ser executada para
reiniciar a contagem do WDT em pontos comuns de execuo do cdigo, evitando o estouro de sua contagem e consequente o evitando o reset do programa em execuo pelo
MCU.

195

Vericao da causa do reset


Nos microcontroladores PIC possvel saber a causa do reset atravs de uma funo prpria do CCS. Esta funo retorna um nmero inteiro de 1 a 15 indicando a causa do reset.
Os principais valores possveis do retorno so:
0 Reset por software
7 Reset por WDT
12 Inicializao Normal
15 Reset por hardware
A funo que retorna estes nmeros apresentada abaixo.
restart_cause( )

Esta funo retorna um nmero de 0 a 15, em que este valor normalmente armazendo
em uma varivel para anlise ou registro, conforme apresentado no exemplo abaixo, em
que a varivel res do tipo inteiro ir armazenar tal valor de retorno.
int res = restart_cause ( );

Exemplo de teste da anlise do motivo de reset


A seguir apresentado o hardware e o software de um projeto exemplo da anlise do motivo de reset, em que a funo verifica_inicializacao executada no comeo do programa. Esta funo basicamente captura o modo de inicializao para saber o tipo de reset e
acende um LED especfico indicando o motivo da inicializao para 4 modos: inicializao
normal (LED do pino B7), reset por software (LED do pino B6), reset por hardware (LED do
pino B5) e reset por WDT (LED do pino B4).
Antes do do loop infinito do while(1), a funo verifica_inicializacao chamada, acendendo um LED sempre, o que determina seu modo de inicio. Quando nada aconteceu para re196

setar o MCU, ento o LED do pino B7 acende. Quando a chave do pino A1 acionada, a
funo reset_cpu executada, reiniciando o MCU e o LED do pino B6 acende indicando
reset por software. Quando o boto do pino 1 pressionado, o MCU reinicia por hardware, e o led do pino B5 acende na inicializao. O WDT foi configurado com o comando #fuses WDT, WDT1024 e ativado com a funo setup_wdt(WDT_ON) e a contagem reinicia
em cada loop do while com a funo restart_wdt. Quando a chave do pino A0 pressionada, o programa entra em um loop infinito, que faz com que o WDT seja acionado e o
LED do pino B4 acende na inicializao.
Software:

Hardware:

#include <18F2550.h>
#use delay(clock=2000000)
#fuses HS, WDT, WDT1024
void verifica_inicializacao(void)
{
int cause;
cause = restart_cause();
switch ( cause )
{
!
case 12://Inicializacao Normal
!
output_high(pin_b7);
!
break;
!
case 0: //Reinicializacao por software
!
output_high(pin_b6);
!
break;
!
case 15: //Reinicializacao por hardware
!
output_high(pin_b5);
!
break;
!
case 7: //Reinicializacao por watchdog timeout
!
output_high(pin_b4);
!
break;
} //fim switch
}
main()
{
verifica_inicializacao(); // verifica os flags do RCON
setup_wdt(WDT_ON);
while(1)
{
!
restart_wdt(); //reinicia a contagem do watchdog timer
!
if (input(pin_a0)) while(1); //se chave A0 pressionada, entra em loop e espera watchdog disparar
!
if (input(pin_a1)) reset_cpu(); // se chave A1 pressionada, reseta a cpu por software
}
}
197

11
Sensor ptico Infravermelho
O circuito abaixo composto pelos componentes TIL78 e TIL32, em que o TIL32 um
emissor infravermelho, o que nada mais que um foto-emissor, o qual funciona semelhante a um LED, emitindo um feixe quando est polarizado corretamente e possui corrente suficiente para isto. A corrente no pode ultrapassar o limite determinado pelo fabricante,
pois ir danificar o componente.
J o TIL78 um foto receptor, funcionando semelhante a um transistor, onde o sinal de base deste
transistor um feixe de luz. Quando existe a presena de luz, este componente permite passagem
de corrente no sentido do pino 2 para o pino 1, seguindo a figura ao lado. Quanto maior o sinal de
luz, maior a corrente e menor a tenso em cima
deste componente. O componente TIL78 normalmente preto e o TIL32 normalmente transparente.
Existe diversos circuitos bsicos para conexo destes dois componentes. O circuito mais
bsico apresentado na figura ao lado, mas este no leva em considerao a interferncia de rudos externos, nem filtra o sinal recebido, onde iria processar apenas o sinal de
interesse, podendo sofrer influncia de luz ambiente, de rudos, inclusive de outros sinais
Infravermelhos (IR- Infra Red). Para retirar estas possveis falhas basta inserir uma frequncia especfica no envio e na recepo do sinal.

198

O funcionamento do circuito ao lado simples, o TIL32 envia um sinal IR e a medida que


o TIL78 recebe este sinal, o mesmo aumenta a corrente que passa no sentido do pino 2
para o pino 1, aumentando a tenso em cima do resistor de 10K, consequentemente diminui a tenso em cima do TIL78. Isto ocorre porque a resistncia e o componente esto em
srie, e se a tenso aumenta em um diminui no ouplicaestro (divisor de tenso).
As diversas aplicaes para este tipo de circuito podem ser divididas em dois grupos: deteco por reflexo e deteco por interrupo de feixe.

Aplicaes de deteco por reflexo

Neste tipo de aplicao, um feixe projetado por LED emissor de luz infravermelha
que, ao ser refletido por algum obstculo,
detectado por um foto-transistor. Quanto
mais prximo o obstculo estiver do conjunto emissor-receptor, maior ser a intensidade do sinal recebido. Se este sinal alcanar um limite pr-definido, o sistema indica
sua presena.

Uma aplicao imediata para esta tcnica pode ser


vista na Figura ao lado, onde o conjunto emissor-receptor auxilia no estacionamento de um veculo. Ao
se aproximar a uma distncia de poucos centmetros
da parede o sistema avisa o motorista o ponto exato
de parar.

199

Observe que esta mesma tcnica pode ser utilizada por um rob para o desvio de obstculos,
bem como seguir uma linha demarcada no solo.
Para este ltimo caso, dois foto-receptores detectam a posio de uma linha com coeficiente
de reflexo diferente do piso (ver Figura 5). Um
processador recebe as informaes dos sensores controlando a movimentao do rob.

Por fim, outra aplicao pode ser encontrada na deteco de presena. A Figura ao lado mostra uma porta
com foto-transmissores e receptores instalados no batente. Quando uma pessoa passa pela porta, o feixe
refletido e um sistema de alarme pode reconhecer a presena e tomar as aes necessrias.

Aplicaes de deteco por interrupo de feixe


Neste tipo de aplicao, o emissor e receptor so
instalados um em frente ao outro (visagem direta).
Para este caso, o receptor fica constantemente recebendo o feixe de infravermelho e no momento
em que um obstculo se interpe, o receptor detecta a interrupo do feixe (ver Figura ao lado).

200

Prticas

Prtica 1 - Realizar a leitura do sensor tico IR, acendendo um led quando algum objeto
estiver cortando o sinal entre o TX e RX do sensor IR.

Prtica 2 - Realizar a leitura do sensor tico IR e indicar a cor do objeto de reflexo do sinal do TX para o RX em um display de 7 segmentos, obedecendo a tabela abaixo para
cada cor, sendo 0 para branco e 6 para preto.
N-Display-bCor

Tenso-em-AN0

Observao 1: Considere o AD confi-

1bBranco-

VAN0-<-0,7V-

gurado para 10 bits e a varivel ten-

2bAmarelo

0,7V-<-VAN0-<-1V

so VAN0 declarada como int32, en-

3bVerde
4bAzul

2,1V-<-VAN0-<-2,8V

to poder aplicar a frmula para obteno da tenso:

1,5V-<-VAN0-<-2V
VAN0=(5000*( (int32)read_adc( ) ) )/1023;

5bVermelho
6bPreto

1,2V-<-VAN0-<-1,5V
4V-<-VAN0

Observao 2: Esta prtica 2 consiste no fato de que cada cor reflete quantidades de feixes diferentes, gerando tenes diferentes nos receptores. Estes valores das tabelas so
estimativas e podem ser alterados dependendo da superfcie dos objetos.
Observao 3: O clculo de AN0 segue os mesmos princpios do clculo apresentado no
capitulo 6, onde abordada a leitura do ADC.

201

12
Memria EEPROM
Memria EEPROM memria de dados que no se apaga ou no perdida mesmo ao inicializar ou resetar o MCU. Os Microcontroladores da famlia PIC j possui 256 bytes de
memria EEPROM interna, prpria do MCU, o que pouco dependendo da aplicao.
Nestas aplicaes pode-se utilizar uma memria externa para aumentar a quantidade de
memria EEPROM disponvel na sua aplicao.

Dentre as memrias externas disponveis no mercado, uma das mais utilizadas a

24LC256 que possui 32K bytes de memria e funciona utilizando a comunicao serial
com protocolo i2c. O uso deste componente simples visto que basta montar o hardware
de acordo com o datasheet do fabricante e utilizar a biblioteca fornecida pelo prprio
CCS para manipular este dispositivo.

Hardware bsico do 24LC256 com PIC18F2550 (Memria externa)


Como pode ser observado, neste exemplo bsico apresentado ao lado, os pinos
de 1 a 4 foram aterrados (0V). O pino 8
a alimentao que deve ser 5V. O pino 7
o pino de habilitao de escrita na memria externa, onde 0V habilita escrita e
5V desabilita.

Os pinos 5 e 6 sero conectados no

MCU, em que o pino 6 (SCL) o pinos de


202

clock do funcionamento do dispositivo e serve para o MCU controlar a velocidade do seu


funcionamento. J o pino 5 (SDA) o pino de dados e este serve para comunicao entre
MCU e memria EEPROM, sendo por onde passam os dados propriamente ditos.

Os pinos 5 e 6 devem ser conectados aos pinos especficos de comunicao i2c do

MCU usado. No caso do 18f2550 os pinos so B0 e B1, e para identific-los basta procurar no datasheet as funcionalidades SCL e SDA. Para quem usa o software Proteus para
simulao isto j est descrito na identificao dos pinos B0 e B1.

Aps identificar os pinos SCL e SDA do MCU deve-se conectar estes pinos ao seu

correspondente no 24C256, em outras palavras conectar SCL com SCL e SDA com SDA.
Alm disto deve colocar dois resistores de PULL-UP de 2K nestes dois pinos para que o
dispositivo funcione corretamente. Abaixo est demonstrado o Hardware montado apenas com a memria externa, devendo acrescentar o circuito bsico.

Os pinos A0, A1 e A2 do 24C256 so utilizados para identificar o endereo da memria externa. No caso do hardware adotado neste exemplo bsico os 3 pinos esto aterrados,
sendo o endereo 000 adotado para este dispositivo.

203

Biblioteca de Memria externa "24256.c" fornecida pelo CCS

Para adicionar esta biblioteca na sua aplicao basta inserir a linha de incluso da mesma
logo abaixo da identificao do MCU. Deste modo, a incluso deve ser feita com a seguinte linha de comando:

#include <18f2550.h> ! //identificando MCU


#include <24256.c>!!
//incluindo a biblioteca da memria EEPROM

Algumas vezes ao instalar o CCS esta biblioteca vm com os pinos trocados. Para ve-

rificar se os pinos esto configurados corretamente na biblioteca faa os passos abaixo:


Passo 1: Inclua a biblioteca na sua aplicao conforme foi indicado anteriormente.
Passo 2: Aperte com o boto direito do mouse sobre os nmeros da linha de comando
#include <24256.c> , ir aparecer uma janela com vrias opes. Escolha a opo "Open
File at cursor" que na verso que estou usando a segunda opo de cima para baixo.
Se tiver feito tudo certo ir abrir o arquivo 24256.c. Se no abriu repita o passo 2 at abrir.
Passo 3: Com o arquivo 24256.c aberto procure as
linhas de comando ao lado, o que na minha verso
esto logo no comeo do arquivo.

#define EEPROM_SDA PIN_B1


#define EEPROM_SCL PIN_B0

Se o arquivo estiver indicando que SDA o pino B1


#define EEPROM_SDA PIN_B0
#define EEPROM_SCL PIN_B1

e SCL o pino B0 ento est trocado. Deve-se trocar estas linhas de comando pelas apresentadas
abaixo, trocando B0 com B1 e B1 com B0.

204

Funes da Biblioteca "24256.c" fornecida pelo CCS


A biblioteca 24256 disponibilidade possui basicamente 3 funes necessrias para seu
uso, uma de inicializao, uma de escrita e uma de leitura. Vale ressaltar que esta memria externa possui 32K bytes de posies de memria, que d 32 vezes 1024, o que resulta em 32768 posies de memria de 8 bits. Relembro que os dados de 8 bits so o char,
int e o byte, conforme apresentado no capitulo de reviso.

Funo de inicializao da EEPROM externa:


Funo: init_ext_eeprom();

Descrio: Esta funo configura o incio do uso desta memria externa, devendo ser chamada antes de comear este dispositivo.

Funo para escrever na EEPROM externa:


Funo: write_ext_eeprom(posio da memria, valor);

Descrio: Esta funo escreve o valor que est na segunda entrada da funo na posio de memria que est na primeira entrada da funo. Ressalto que o valor deve ser
at 8 bits, que de o at 255 e a posio de memria deve estar entre 0 e 32768.

Funo para ler na EEPROM externa:


Funo: valor = read_ext_eeprom(posio da memria);

Descrio: esta funo l a posio de memria desejada e retorna um valor de 0 a 255


que est armazenado naquela posio.

205

Funes da memria interna fornecida pelo CCS

Funes da memria interna fornecida pelo CCS


As funes da memria EEPROM interna disponibilidade pelo CCS possui basicamente 2
funes necessrias para seu uso, uma de escrita e uma de leitura. Vale ressaltar que esta
memria interna possui 256 bytes de posies de memria, que so 256 posies de memria de 8 bits. Relembro que os dados de 8 bits so o char, int e o byte, conforme apresentado no capitulo de reviso.

Funo para escrever na EEPROM interna:


Funo: write_eeprom(posio da memria, valor);

Descrio: Esta funo escreve o valor que est na segunda entrada da funo na posio de memria que est na primeira entrada da funo. Ressalto que o valor deve ser
at 8 bits, que de o at 255 e a posio de memria deve estar entre 0 e 32768.

Funo para ler na EEPROM interna:


Funo: valor = read_eeprom(posio da memria);

Descrio: esta funo l a posio de memria desejada e retorna um valor de 0 a 255


que est armazenado naquela posio.

206

Exemplo de cdigo de memria externa

Abaixo apresentado um exemplo utilizando a memria externa do MCU, explicando

na prtica o uso destas funes citadas acima. Ressalta-se tambm que caso no tenha
feito a alterao dos pinos da biblioteca, basta trocar os pinos de conexo do MCU com
a memria EEPROM e ligar SDA com SCL e SCL com SDA no hardware.
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#include <24256.c>
void main()
{
int dado;
printf("Start\n\r");
init_ext_eeprom(); //Inicializando a memria externa, deve sempre ser chamada no inicio do main
delay_us (200);! //Tempo necessrio para inicializar corretamente a EEPROM
write_ext_eeprom(0x20, 0x40); //Escrevendo o valor hexadecimal 0x40 na posio 0x20
delay_ms(200); //Tempo necessrio para escrita na EEPROM
write_ext_eeprom(30, 0xAA); //Escrevendo o valor hexadecimal 0xAA na posio 30
delay_ms(200); //Tempo necessrio para escrita na EEPROM
write_ext_eeprom(100, 10); //Escrevendo o valor 10 na posio 100
delay_ms(200); //Tempo necessrio para escrita na EEPROM
dado= read_ext_eeprom(4); //Lendo o valor da posio 4 e guardando na varivel dado
delay_ms(200); //Tempo necessrio para leitura da EEPROM
dado = read_ext_eeprom(100); //Lendo o valor da posio 4 e guardando na varivel dado
delay_ms(200); //Tempo necessrio para leitura da EEPROM
while(1);
}

207

Prticas

Prtica 1: Projete um sistema com MCU que a cada 1 segundo leia um ADC e armazene
na memria externa. Os dados devem ser armazenados em sequncia, comeando da posio e deve parar quando chegar na posio mxima de memria disponvel.
Prtica 2: Faa o mesmo que a prtica 1 utilizando a memria interna.
Prtica 3: Faa o mesmo que a prtica 1, entretanto quando completar a memria externa, peo que enviem pela porta serial as informaes, e em seguida comecem todo o processo novamente, preenchendo a memria desde a posio 0.
Prtica 4: Faa o mesmo que a prtica 3 utilizando a memria interna.

208