Vous êtes sur la page 1sur 117

MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr

1
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
MCROCONTROLADORES
MCROCONTROLADORES
PC 16F E 18F
PC 16F E 18F
TEORA E PRTCA
TEORA E PRTCA
Instituto NCB
www.newtoncbraga.com.br
contato@newtoncbraga.com.br
2
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Microcontroladores PC 16F e 18F Teoria e Prtica
Autor: Vidal Pereira da Silva Jr.
So Paulo - Brasil - 2013
Palavras-chave: Eletrnica - Engenharia Eletrnica - Componentes Microcontroladores
Copyright by
INTITUTO NEWTON C BRAGA.
1 edio
Todos os direitos reservados. Proibida a reproduo total ou parcial, por qualquer meio ou
processo, especialmente por sistemas grficos, microflmicos, fotogrficos, reprogrficos,
fonogrficos, videogrficos, atualmente existentes ou que venham a ser inventados.
Vedada a memorizao e/ou a recuperao total ou parcial em qualquer parte da obra em
qualquer programa jusciberntico atualmente em uso ou que venha a ser desenvolvido ou
implantado no futuro. Essas proibies aplicam-se tambm s caractersticas grficas da
obra e sua editorao. A violao dos direitos autorais punvel como crime (art. 184 e
pargrafos, do Cdigo Penal, cf. Lei n 6.895, de 17/12/80) com pena de priso e multa,
conjuntamente com busca e apreenso e indenizao diversas (artigos 122, 123, 124,
126 da Lei n 5.988, de 14/12/73, Lei dos Direitos Autorais).
Diretor responsvel: Newton C. Braga
Diagramao e Coordenao: Renato Paiotti
3
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Dedicatria
minha esposa Giane
e as minhas filhas sabella e Nathlia,
que so minhas fontes de energia
para viver cada vez mais.
4
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Avisos importantes
1) Sore as in!orma"es a#ui apresentadas e garantias de #ual#uer tipo:
O autor acredita que todas as informaes aqui apresentadas esto corretas e podem ser
utilizadas para qualquer fim legal. Entretanto, no existe qualquer garantia, explicita ou implcita,
de que o uso de tais informaes conduzir ao resultado desejado.
$) Sore d%vidas relativas ao assunto
A aquisio deste livro no implica no direito do leitor de obter atendimento pessoal sobre
duvidas ou outros questionamentos referentes ao assunto, bem como suporte no uso das
ferramentas apresentadas, as quais so gratuitas ou verses de demonstrao.
&) Sore os ar#uivos para do'nload #ue acompanha este livro
Os arquivos que acompanham este material tm todos os exemplos j digitados para uso,
e mais alguns arquivos auxiliares como databooks de componentes, manuais de uso, entre outros.
Todos os programas so grtis (apenas o compilador C uma verso demo) e podem ser
baixados da internet no site de seus respectivos fornecedores.
Para copi-los para seu computador e instalar os programas, veja o anexo no final deste
livro.
Para (ai)ar o compilador acesse: http:**'''+ccsin!o+com
,-etivo deste material
Permitir ao estudante aprender sobre o funcionamento dos microcontroladores PC em
geral, das famlias 16F e 18F, de forma rpida e simples.
Para tal usaremos a linguagem C, o que reduz bastante o tempo de aprendizado e
permitindo fcil transio para outros modelos de pic's.
.etodologia
Este material de estudo esta dividido em 8 captulos, que o estudante deve acompanhar
na ordem proposta, e 2 anexos auxiliares:
) ntroduo aos microcontroladores e linguagens de programao
) A linguagem C bsica com exerccios simples para fixao dos
conceitos
) Programa mnimo em C para compilao e simulao dos exemplos
V) O ambiente de desenvolvimento e simulao 'Mplab' em C com os exemplos bsicos
dos captulos e
V) A arquitetura dos Pics e seus perifricos mais usuais
V) A linguagem C implementada pela CCS para os pic's, com detalhes
5
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
das diferenas entre as diversas famlias.
V) Arquivo de definies dos modelos usados nos exemplos: 18F458,
16F877 e 16F877A
V) Exemplos prticos com esquemas e programas para estudo de alguns dos perifricos
estudados (exemplos baseados no 16F877, 16F877A e 18F458)
6
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Sore a aordagem utili/ada neste m0todo de estudo
Desde 1988, ministrando os mais diversos tipos de treinamentos, posso assegurar que a
abordagem tradicional usada pela maioria dos autores (geralmente indicada por editoras ou
manuais de redao) transmite o assunto, mas de forma seqencial, um tpico de cada vez.
No mtodo que uso atualmente nos meus treinamentos, pude constatar que se
transmitirmos os tpicos de forma paralela, isto , se formos abordando uma parte de cada rea,
um pouco por vez, o estudante vai assimilando mais facilmente, pois consegue "enxergar, passo
a passo, o fim do tnel.
Em nosso caso, podemos dividir o treinamento em vrios tpicos:
A linguagem de programao 'C'
O hardware do PC
O ambiente de desenvolvimento
Esquemas eltricos dos exemplos
Para permitir que o estudante realmente assimile o conhecimento transmitido, vamos
abordando todos os tpicos simultaneamente, permitindo ao aluno ir praticando desde o inicio do
treinamento, sem ficar muito tempo apenas na teoria.
Desta forma, ao invs de transmitirmos o conhecimento, primeiro analisando somente o
hardware, depois o software, depois as ferramentas e somente ao final os exemplos, vamos
mesclando cada um dos tpicos aos poucos, e o aluno com certeza assimilar mais facilmente.
Espero que o leitor aprecie este trabalho, e tenha o melhor aproveitamento possvel.
Vidal
Site do autor: www.vidal.com.br
7
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
1ndice
- ntroduo aos microcontroladores e linguagens de programao ............................... 12
Os microcontroladores ..................................................................................................... 12
A linguagem C ................................................................................................................. 12
Mtodo de estudo ............................................................................................................. 12
- A linguagem C bsica ..................................................................................................... 14
.1 - niciao linguagem C ......................................................................................... 14
.2 - Algumas regras comuns para a programao em 'C' ........................................... 14
.3 - Modelo bsico de um programa em C ................................................................... 14
.4 - Comentrios ........................................................................................................... 15
.5 - Diretivas de compilao ......................................................................................... 16
.6 - ndicador de fim de instruo ................................................................................. 16
.7 - Definio de variveis, constantes e identificadores ............................................. 17
.7.1 Sinalizadores de nmeros negativos e positivos ............................................. 17
.7.2 - Seqncia de declarao de variveis e constantes ........................................ 18
.7.3 - Atribuindo valores .............................................................................................. 18
.7.4 Atribuindo valores iniciais na declarao ......................................................... 18
.7.5 MPORTANTE: ................................................................................................ 18
.7.6 - Como escrever os nomes de variveis, constantes e funes ......................... 19
.7.7 Typedef - Redefinindo tipos .............................................................................. 19
.8 - Funes e rotinas ................................................................................................... 20
.8.1 - Funes especialmente desenvolvidas para os PC's ...................................... 20
.9 - Expresses numricas e de string (caracteres) .................................................... 21
.10 - Operadores lgicos e aritmticos bsicos da linguagem C .................................. 21
.10.1 - Precedencia (ou prioridade) de operadores ................................................. 23
.10.2 - Converso de tipos (type casting) ................................................................. 23
.11 - Matrizes ................................................................................................................ 25
.11.1 - Matrizes bidimensionais ................................................................................ 26
.12 - Controle do programa em C ................................................................................ 26
.12.1 - Blocos de declaraes .................................................................................... 26
.12.2 - Bloco F (executa se a condio for verdadeira) ........................................... 27
.12.3 - Bloco FOR (executar por um certo nmero de vezes) .................................. 30
.12.4 - O condicional WHLE (enquanto) ...................................................................... 31
.12.5 - O condicional DO . . . . WHLE (faa ... enquanto) ....................................... 33
.12.6 O comando BREAK ....................................................................................... 34
.12.7 O comando CONTNUE ................................................................................. 34
.12.8 - O condicional SWTCH ................................................................................... 35
.12.9 - O comando RETURN ...................................................................................... 36
.13 - Abreviaes teis para instrues aritmticas ...................................................... 37
.13.1 - ncremento e Decremento ............................................................................... 37
.13.2 - Combinando abreviaes ................................................................................ 38
.13.3 Operaes com resultado na mesma varivel ............................................... 38
.14 - Variveis locais, variveis globais e parmetros ................................................... 38
.14.1 - Variveis Globais ............................................................................................. 38
.14.2 - Variveis Locais .............................................................................................. 38
.14.3 - Variveis como parmetros ............................................................................. 39
.15 - A varivel tipo VOD e os prottipos de funes ................................................. 40
.15.1 - Prottipos de funes ..................................................................................... 40
.16 - Estruturas .............................................................................................................. 41
8
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.17 - Unions ................................................................................................................... 42
.18 - A funo MAN ( ) .................................................................................................. 43
.19 - Exemplos de programas simples ......................................................................... 43
- Programa mnimo em C ................................................................................................. 46
V - Usando o Mplab 7.62 em C ........................................................................................... 50
V.1 - Conceitos bsicos ................................................................................................. 50
V.2 - O "Projeto no MpLab ......................................................................................... 50
V.3 - Criando o projeto com o Project Wizard ............................................................... 51
V.4 - Simulando o programa ......................................................................................... 58
V.5 Verificando o registro PORTD durante a simulao ............................................. 60
V - Os Microcontroladores PC e seus perifricos mais usuais - Famlias 16F e 18F -
Teoria de funcionamento ..................................................................................................... 63
V.1 - ntroduo ................................................................................................................ 63
V.2 Circuito mnimo ....................................................................................................... 64
V.3 Memria de Programa ............................................................................................ 64
V.4 Memria de dados .................................................................................................. 65
V.5 Memria EEPROM de dados ................................................................................. 65
V.6 Circuito de Reset e Clock ....................................................................................... 66
V.7 Multiplicao 8 bits x 8 bits por hardware ............................................................... 66
V.8 nterrupes ........................................................................................................... 67
V.8.1 -Trabalhando com interrupes de alta e baixa prioridade. ............................... 68
V.9 Fusveis de configurao ........................................................................................ 68
V.10 O port A e suas funes especiais ....................................................................... 69
V.10.1 Algumas funes de acesso ao portA digital ................................................. 69
V.11 O port B e suas funes especiais ....................................................................... 70
V.12 O port C e suas funes especiais ...................................................................... 70
V.13 Os ports D e E com suas funes especiais. ....................................................... 71
V.14 nterrupes externas ........................................................................................... 71
V.15 Timer 0 .................................................................................................................. 72
V.16 Timer 1 .................................................................................................................. 73
V.16.1 Funes para controle do timer 1 .................................................................. 73
V.17 Timer 2 .................................................................................................................. 73
V.18 Timer 3 - Apenas na linha 18F ............................................................................. 74
V.19 O conversor A/D ................................................................................................... 74
V.20 A comunicao serial Assncrona ......................................................................... 76
V.20.1 Funes para controle da comunicao serial .............................................. 77
V.21 Tipos de osciladores ............................................................................................. 77
V.22 O Watch Dog ........................................................................................................ 78
V.22.1 - O Watch Dog da famlia 16F ........................................................................... 78
V.22.2 - O Watch Dog do pic 18F458 ........................................................................... 79
V.23 Brown-out Reset ................................................................................................... 80
V.24 O modo Power-Down, ou 'Sleep' .......................................................................... 80
V.25 Power-up Timer .................................................................................................... 81
V.26 Oscilator Start-up Timer ........................................................................................ 81
V.27 Mdulo MSSP como SP ...................................................................................... 82
V.28 Mdulo MSSP como 2C ....................................................................................... 82
V.29 Mdulo CCP como 'Capture Mode' ...................................................................... 83
V.30 Mdulo CCP em 'Compare mode' ........................................................................ 83
V.31 Mdulo CCP em 'Pwm Mode' ............................................................................... 83
V.32 Low voltage Detector (LVD) - .............................................................................. 84
9
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.33 Comparador analgico (linha 16F87xA e 18F458) .............................................. 85
V.34 nterfaces CAN, USB, ETHERNET,.... - .............................................................. 86
V - A linguagem C e os PC's ............................................................................................. 87
V.1 - Diretivas de compilao ........................................................................................ 87
V.1.1 - #asm #endasm ............................................................................................. 87
V.1.2 - #case .............................................................................................................. 87
V.1.3 - #define 'nome' 'seqncia' ........................................................................... 88
V.1.4 - #include <arquivo> ........................................................................................ 88
V.1.5 - #fuses 'opes' ............................................................................................. 88
V.1.6 - #ifdef #endif ............................................................................................... 88
V.1.7 - #NT_#### , onde #### indica o nome da rotina ......................................... 89
V.1.8 - #Priority Prioridades por software ............................................................... 89
V.1.9 - #ROM ............................................................................................................ 90
V.1.10 - #use delay (clock= 'valor do clock em Hz') .................................................. 90
V.1.11 - #use Fast_O( port ) ..................................................................................... 90
V.1.12 - #use standard_O( port ) - Default ............................................................. 90
V.1.13 - #use rs232 (BAUD = taxa, XMT = pinoTx, RCV = pinoRx, BTS = n ) ...... 91
V.1.14 - #byte nome = endereo do byte .......................................................... 91
#bit nome = endereo do byte . nmero do bit ................................... 91
V.2 - Funes escritas para os PC's ............................................................................ 91
V.2.1 - Funes matemticas .................................................................................... 92
V.2.2 - Funes de manipulao de bit ..................................................................... 92
V.2.3 - Funes de tempo ......................................................................................... 93
V.2.4 - Funes para interrupes ............................................................................ 93
V.2.5 - Funes para o canal A/D ............................................................................. 94
V.2.6 - Funes para EEPROM de dados interna .................................................... 95
V.2.7 - Funes do Timer 0 (So similares para os demais timers) ......................... 95
V.2.8 - Funes do canal de comunicao serial ...................................................... 96
V.2.9 - Funes de uso geral .................................................................................... 97
V - Os arquivos de definies dos PCs ............................................................................ 98
V Exemplos prticos dos principais perifricos estudados no cap V ............................ 99
V.1 ntroduo ............................................................................................................ 99
V.2 Usando displays de cristal liquido como auxilio de ............................................ 99
V.2.1 - O display LCD 16X2 ....................................................................................... 99
V.3 Exemplos do Captulo ..................................................................................... 101
V.4 Exemplo dos Captulo .................................................................................... 101
V.5 Exemplos prticos para treinamento ................................................................. 101
V.5.1 Usando sadas digitais ................................................................................ 102
V.5.2 Usando entradas e sadas digitais .............................................................. 103
V.5.3 Usando o conversor de analgico para digital com resoluo de 8 bits .... 103
V.5.4 Display LCD 16x2 com interface de 4 bits .................................................. 105
V.5.5 - Usando o conversor de analgico para digital com resoluo de 10 bits e
visualizao dos resultados no LCD .......................................................................... 105
V.5.6 Usando a EEProm de dados ....................................................................... 106
V.5.7 Usando o timer 0 em 8 bits com clock externo ........................................... 107
V.5.8 Usando o timer 1 (16 bits) com clock interno ............................................. 107
V.5.9 Usando a interrupo externa NT0 no pino RB0 ....................................... 108
V.5.10 Enviando um byte pelo canal serial .......................................................... 109
V.5.11 Recebendo um byte pelo canal serial ....................................................... 110
V.5.12 Comunicao serial SP por hardware ..................................................... 111
10
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.5.13 Comunicao serial 2C ........................................................................... 111
V.5.14 CCP em modo "PWM .............................................................................. 112
V.5.15 Multiplexao de displays de 7 segmentos .............................................. 113
V.5.16 Teclado matricial 3x4 ................................................................................ 114
V.5.17 Comunicao serial SP por software ....................................................... 114
Anexos ............................................................................................................................... 116
11
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
- ntroduo aos microcontroladores e
- ntroduo aos microcontroladores e

linguagens de programao
linguagens de programao
Os microcontroladores
Desde meu primeiro livro, em 1.988, utilizo o termo "Microcomputador-de-um-s-chip para definir os
microcontroladores.
A principal caracterstica do microcontrolador esta em reunir em um s chip todos os perifricos
necessrios para o projeto e fabricao de dispositivos eletrnicos dos mais diversos tipos, desde simples
sinalizadores e luzes pisca-pisca at equipamentos mdicos sofisticados.
Hoje temos microcontroladores de apenas 6 pinos, minsculos, ideais para incluir inteligncia em
dispositivos mecnicos em geral (dispositivos mecatrnicos) e at chips com as mais de 80 pinos, com as
mais variadas capacidades, diversos tipos de interfaces (USB, Ethernet, CAN, ...); conversores analgico-
digitais, entre outros.
Para a sua empreitada neste mundo maravilhoso de projetos com microcontroladores, alguns pr-
requisitos so necessrios:
1. Conhecimentos de nvel mdio de eletrnica analgica e digital;
2. Facilidade de uso de computadores da linha PC baseados em Windows, para edio de textos e
manipulao de arquivos;
3. Prtica de montagens eletrnicas para a parte experimental;
4. Noes de programao em qualquer linguagem ou conhecimentos de lgica de programao.
A linguagem C
Neste treinamento utilizaremos a linguagem C para programar os PC's, e no o assembler.
A principal vantagem do uso da linguagem C esta no fato de que a crescente complexidade dos
microcontroladores vai tornando a programao em assembler cada vez mais difcil, dificultando para o
projetista a mudana de modelos, como, por exemplo, a migrao, na linha microchip, da linha 16F para a
linha 18F.
Com o compilador C, as constantes mudanas de arquitetura interna do chip, das instrues, e dos
algoritmos de desenvolvimento de software, passa a ser muito mais simples, pois a recompilao de cada
rotina ou funo especial (por exemplo, a programao dos registros internos para uso do conversor
analgico-digital), que com certeza diferente nas linhas 16F e 18F, passa a ser transparente para o
desenvolvedor.
Desta forma, ao invs de consumir tempo reescrevendo rotinas ou todo um programa, o projetista
apenas vai revisar as funes do seu programa para ajustar-se aos perifricos do novo modelo, dedicando
seu tempo a escrever as funes baseadas em lgica, e no perdendo-se em detalhes de bits e bancos de
memria.
Mtodo de estudo
Neste treinamento no vamos estudar na forma tradicional.
Vamos primeiro ver a linguagem C bsica, sem se preocupar com sua aplicao nos pics, apenas
analisando os detalhes para compilar os programas mnimos apresentados.
Em seguida, veremos o ambiente de desenvolvimento Mplab, da Microchip, e o compilador C da
CCS (verso demo), numa apresentao grfica de como se usa a ferramenta.
Depois estudaremos os principais perifricos das famlias 16F e 18F, baseados nos modelos
16F877, 17F877A e 18F458.
Aps este estudo voltaremos ao estudo da linguagem C, agora j detalhando os comandos
desenvolvidos para os PC's.
Nesta parte do treinamento dedicaremos nosso maior tempo, pois j poderemos estudar e utilizar
simultaneamente o pic, o compilador C, o ambiente Mplab em compilao e sobretudo em simulao.
12
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Teremos ento vrios exemplos completos, com esquema e software detalhado.
Para enriquecer ainda mais este trabalho, temos arquivos para download com todos os programas
j digitados e prontos para serem executados, com a verso demo do compilador PCWH, com o Mplab e
com o software de gravao C-PROG, e os esquemas individuais de cada experincia e de um gravador
para os pic's.
13
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
- A linguagem C bsica
- A linguagem C bsica
.1 - niciao linguagem C
A principal vantagem de se usar linguagens de alto nvel (no nosso caso a linguagem C) esta na
menor interao do projetista com o hardware, no que diz respeito ao controle do mesmo (ajuste de bancos
de registradores, seqncias de inicializao, etc...).
Como exemplo vamos ver a seqncia de escrita na EEPROM de dados do 18F458 em assembler:
MOVLW 223ADD42SS
MOVWF EEADR
MOVLW 223DA5A
MOVWF EEDATA
BCF EECON1, EEPGD
BCF EECON1, CFGS
BSF EECON1, WREN
BCF NTCON, GE
MOVLW 55h
MOVWF EECON2
MOVLW 0AAh
MOVWF EECON2
BSF EECON1, WR
BSF NTCON, GE
e em C:
write_eeprom ( 223ADD42SS , 223DA5A) ;
.2 - Algumas regras comuns para a programao em 'C'
Use letras minsculas em todo o programa (recomendado)
Todas as funes e variveis devem ser declaradas
Palavras reservadas no podem ser usadas como identificadores de variveis e funes
Sempre escreva comentrios em seus programas
.3 - Modelo bsico de um programa em C
Quatro elementos esto presentes em um programa C:
Comentrios
Diretivas de compilao
Definies de dados
Blocos com instrues e funes
Modelo bsico (desconsiderando ser um programa para pic's):
14
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.4 - Comentrios
Comentrios so informaes que voc, durante a escrita do programa fonte (*), vai inserindo e que
permitem a voc (programador) e a outros entenderem o significado do que esta sendo feito.
boa prtica comentar o mximo possvel de linhas, e at mesmo incluir grandes blocos de
comentrios, explicando o porque do que esta sendo feito, pois aps um certo tempo, nem mesmo o criador
do programa lembrar de tudo o que estava pensando no momento da escrita.
O compilador ignora tudo que estiver definido como comentrio.
(*) O programa fonte em C deve ter terminao " .C , por exemplo: teste.c
2)istem dois tipos de comentrios:
Comentrios que ocupam apenas 1 linha
Este tipo de comentrio iniciado com duas barras conjuntas: **
Neste caso, tudo que estiver aps as duas barras ser ignorado pelo compilador, at o final da
linha.
Exemplo:
x = x + 2; // soma 2 varivel x
15
#include <....> (Diretivas de compilao)
// comentrio ocupando uma linha
/ comentrios entre !/ " e ! /" podem ocupar mais de
uma linha /
int# i $ % ; (Variveis de 8 bits)
&loat 'empo; (Varivel de ponto flutuante)
(oid main) *
+
instrues do programa principal
,
(oid dela-) *
+
instrues da funo (rotina) delay
,
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Comentrios com mltiplas linhas
Este estilo de comentrio iniciado com a seqncia * 6 e finalizado pela seqncia 6 * .
Neste caso, tudo que estiver ENTRE estas duas seqncias ser ignorado pelo compilador, no
importando quantas linhas exista entre os dois marcadores.
ideal para excluir temporariamente trechos de cdigo.
Exemplo:
x = x + 2;
/ tempo++;
a !"#$(%&); /
x = .;
No exemplo acima, as linhas tempo++; e a=SQRT(25); sero ignoradas no momento da
compilao.
.5 - Diretivas de compilao
Geralmente so instrues para o compilador, e em alguns casos, devido as necessidades,
implicaro na incluso de alguns trechos de cdigo j pronto.
As diretivas informam, por exemplo, o processador para o qual o cdigo dever ser gerado, o valor
do clock que ser usado pela cpu, etc..
As diretivas sempre comeam com ' 7 '.
Um bom exemplo a diretiva que inclui no processo de compilao as definies do chip.
Por exemplo: #include </#012#.3>
A terminao .H indica um Header File da linguagem C, ou seja, um cabealho.
.6 - ndicador de fim de instruo
O compilador C no um compilador de linha, como o assembler.
O compilador C procura o sinal de que a instruo ou o bloco de instrues j acabou.
Este sinal o " ; " (ponto e virgula) para uma instruo isolada ou o ' } ' para o bloco (mais tarde
falaremos sobre blocos de instrues).
No exemplo abaixo, as duas maneiras so corretas, pois o ' ; ' que sinaliza o fim da instruo.
x = x + 22; x =
x + 22
;
claro que voc vai usar o exemplo da esquerda, pois seu cdigo deve estar sempre bem legvel.
16
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.7 - Definio de variveis, constantes e identificadores
Todas as variveis e constantes usadas no programa devem ser devidamente definidas, com um
nome e um tipo. O mesmo vale para identificadores de funes e rotinas.
Os dados bsicos podem ser de 8, 16 e 32 bits de comprimento, e devido as caractersticas
peculiares dos microcontroladores, variveis de 1 bit tambm podem ser definidas.
Embora as variveis possam ser designadas pelos nomes tradicionais da linguagem C ( char, long
int, ...) vamos usar os nomes abaixo, permitidos pelo compilador da CCS, que so equivalentes e muito
mais simples de entender.
Variveis dentificador Faixa .
varivel inteira de 8 bits: NT8 ( de 0 255 )
varivel inteira de 16 bits: NT16 ( de 0 65.535 )
varivel inteira de 32 bits: NT32 ( de 0 4.294.967.296 )
varivel de ponto flutuante: FLOAT ( - 1.5 E 45 a +3.4 E +38)
varivel de 1 bit: NT1 ( pode assumir 0 ou 1)
.7.1 Sinalizadores de nmeros negativos e positivos
As variveis do tipo NT8, NT16 e NT32 podem ou no ter sinal negativo.
Para garantir que a varivel seja sempre positiva, usamos unsigned antes da definio da mesma.
Caso seja necessrio tratar nmeros negativos, usaremos signed.
Ex.: unsi4ned int/5 tempo; // tempo ir de . 6 52.272
si4ned int/5 espa8o; // espa8o ir de 972.:5# 6 72.:5:
Detalhes importantes:
Observe que o indicativo signed diminui o alcance da varivel pela metade.
O compilador da CCS usa como padro, quando no indicado, o tipo 89S:;92D.
Com variveis FLOAT no precisamos usar indicativos de sinal, pois o alcance j vai de um valor
negativo ao positivo.
Se desejar garantir total compatibilidade com outros compiladores, sempre use os qualificadores
nas definies das variveis.
17
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.7.2 - Seqncia de declarao de variveis e constantes
<ariveis:
Para se declarar uma varivel temos a seguinte ordem das definies:
Sinal Tipo Nome
unsi4ned int# tempo; // a (ari(el !tempo" (ai de . 6 222
(opcional)
Um grupo de variveis de mesmo tipo pode ser declarada na mesma linha.
int# i$ %$ ;; // declara <ue i$ % e ; s=o do tipo int#.
Constantes:
CONST define um 'label' ou 'nome' para valores que no sero alterados pelo programa:
Exemplo: &loat const >I = 7./1;
.7.3 - Atribuindo valores
A atribuio de valores feita pelo sinal de igualdade, ' = ' .
Exemplo: tempo = /27; // a<ui a (ari(el tempo passa a ter o (alor /27 decimal.
.7.4 Atribuindo valores iniciais na declarao
Podemos tambm indicar o valor inicial das variveis na declarao das mesmas.
Desta forma, o compilador j colocar no inicio do programa as instrues necessrias para alocar
os valores.
Sua principal utilidade esta em garantir que no vamos esquecer de inicializar os valores.

Exemplo:
uint8 velocidade'inicial ()); // declaramos e % demos um (alor
.7.5 MPORTANTE:
18
Devemos sempre a-ustar os valores iniciais de cada
varivel do programa antes de us-las= pois o valor no reset 0
:9D2524.:9AD,+
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.7.6 - Como escrever os nomes de variveis, constantes e funes
Todo 'label' (nome ou identificador), seja de varivel, constante ou funo:
Deve comear por letra ou por sublinhado ' _ '
Ter no mximo 32 caracteres
No usar caracteres especiais ou de controle ( ! \ ? % ....).
Nomes de funes e rotinas internas tambm no podem ser utilizados.
- Exemplos de definies:
Corretas ncorretas .
Teste 3local >>> comea com nmero !
teste parte!dois
TESTE ^
_12A caractere invlido ( ! )
x_2_5
MPORTANTE: Este compilador C, inicialmente, NO diferencia letras minsculas de maisculas.
Nos exemplos acima, Teste, teste e TESTE so a mesma varivel para o compilador.
D:CA: 8se nomes de variveis vios e em portugu>s= assim no ter prolemas de
incompatiilidade+
Por exemplo:
Int# (elocidade = /.; // (ari(el % iniciali?ada
Int72 tempo@de@resposta; // esta (ari(el de(era ser iniciali?ada no pro4rama
0loat distancia = /.2;
.7.7 Typedef - Redefinindo tipos
A declarao TYPEDEF usada para definirmos novos tipos baseados em outros j existentes
Vamos ver atravs de um exemplo simples:
t-pede& si4ned int# sint#;
Neste exemplo, vamos fazer com que o compilador "enxergue o novo tipo, S:95?, como se
tivssemos digitado S:;92D :95?
Podemos redefinir quantos tipos quisermos para o mesmo tipo original, e quando criamos um novo
tipo com TYPEDEF o tipo original continua valendo.
Neste exemplo criamos dois novos tipos que tem o mesmo padro:
t-pede& si4ned int# sint#;
t-pede& si4ned int# maismenos#;
19
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Aps estas declaraes, para usar uma varivel de 8 bits com sinal, podemos usar em nosso
programa si4ned int# ou sint# ou maismenos#.
Se colocarmos este trecho de cdigo no inicio de nossos programas, estaremos redefinindo as
variveis de 8, 16 e 32 bits para facilitar a escrita dos programas:
t-pede& unsi4ned int# uint#; // A de unsi4ned
t-pede& unsi4ned int/5 uint/5;
t-pede& unsi4ned int72 uint72;
t-pede& si4ned int# sint#; // B de si4ned
t-pede& si4ned int/5 sint/5;
t-pede& si4ned int72 sint72;
.8 - Funes e rotinas
Chamamos funo um trecho de programa que realiza determinada operao (funo que l
teclado, funo que escreve no display, ...) bem como as funes pr-definidas (SQRT, ABS, ACOS, ...).
Muitas vezes as palavras "funo e "rotinas referem-se a mesma operao.
No exemplo abaixo, temos a funo MAN (falaremos dela depois) que a rotina executada no reset
do programa.
A funo MAN chama uma ROTNA para ler teclas, e a rotina de ler teclas chama uma FUNO
para calcular o valor absoluto da tecla.
Ce'eclas) *
+
DDD
DDD
E = FBB)tecla@lida*;
DDD
DDD
,
main ) * // no reset o processador come8a a rodar a<ui
+
DDD
DDD
Ce'eclas) *;
DDD
DDD
,
.8.1 - Funes especialmente desenvolvidas para os PC's
No captulo V, referente ao compilador da CCS, veremos vrias funes que existem para os PC's
e como funcionam.
20
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.9 - Expresses numricas e de string (caracteres)
Vamos ver neste item os tipos de expresses permitidas para valores numricos e para a
manipulao de caracteres.
Nmeros Decimais: No podem comear por ' 0 ' (zero)
Exemplos: 123; 2; 14534; 3.14; ...
Nmeros Octais: Devem comear por ' 0 ' (zero)
(Pouco utilizados)
Exemplos: 045; 07;...
Nmeros Binrios: Devem iniciar por ' 0b '
Exemplo: 0b10101010
Nmeros Hexadecimais: Devem iniciar por ' 0x '
Exemplo: 0x32; 0xA9; ...
String de 1 caractere: Entre Apstrofos ' '
Exemplo: 'z'; 'A'; ....
String de vrios caracteres: Entre aspas " "
Exemplo: "teste de escrita
.10 - Operadores lgicos e aritmticos bsicos da linguagem C
Temos aqui os principais operadores lgicos e aritmticos da linguagem C:
Operadores aritmticos
+ Adio
++ ncremento da varivel indicada ( D++ equivalente a D = D + 1)
- Subtrao
- - Decremento da varivel indicada ( X- - equivalente a X = X - 1)
* Multiplicao
/ Diviso (parte inteira da diviso para variveis inteiras)
Se a varivel de resultado no for inteira o operador " / " coloca na mesma apenas a parte
inteira do resultado.
Exemplo: x=2/2; // x= 2 e o resto / G descartado
% Resto da diviso (quando realizamos diviso de inteiros)
Se a varivel de resultado for inteira o operador " % " coloca na mesma apenas o RESTO
do resultado.
21
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Exemplo: H=2I2; // H= / e a parte inteira 2 G descartada
Operaes para comparao lgica
< Comparador lgico "menor que

> Comparador lgico "maior que
<= Comparador lgico "menor ou igual que
>= Comparador lgico "maior ou igual que
!= Comparador lgico "diferente de
== Comparador lgico "igual a (*)
(*) Se numa comparao usarmos ' = ', o compilador emitir um aviso, MAS far a atribuio, gerando um
programa errado logicamente.
Exemplo correto: SE A == 5 ..... // Verifica se A igual a 5
Exemplo errado: SE A = 5 ...... // Primeiro faz A igual a 5, e o
// teste acaba dando verdadeiro
Operaes lgicas
&& AND lgico ou relacional (todas as condies verdadeiras)
|| OR lgico ou relacional (uma das condies verdadeira)
! NOT lgico ou relacional (v se a condio TRUE ou FALSE)
Operaes binrias (matemticas)
& AND binrio (bit a bit nas variveis)
| OR binrio (bit a bit nas variveis)
^ XOR binrio (bit a bit nas variveis)
~ NOT binrio (inverte o estado de cada bit da varivel)
:mportante: 9o con!undir opera"es @A;:CAS com opera"es (:9B4:AS Cnum0ricas)

Exemplo: para inverter a varivel X e escrever no port D:
E = JE; // operador NK' Linrio
Kutput@M = ) E *; // escre(e no portd M
Exemplo: para zerar o bit 3 da varivel X
E = E N .L////.///; // operador FNM Linrio
22
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Operaes de deslocamento binrio
<< 'n'
Desloca o valor indicado 'n' bits para a esquerda, descartando os 'n' bits MAS significativos e
acrescentando 'n zeros' direta.
Exemplo: E = .L...././. // E = /. decimal
E = E << /; // E = ..././.. = 2. decimal
E = E << 2; // E = ././.... = #. decimal
>> 'n'
Desloca o valor indicado 'n' bits para a direita, descartando os 'n' bits MENOS significativos e
acrescentando 'n zeros' esquerda.
Exemplo: E = .L...././. // E = /. decimal
E = E >> 2; // E = ....../. = 2 decimal
( 10 dividido por 4 resulta 2 com resto 1, que foi descartado)
.10.1 - Precedencia (ou prioridade) de operadores
Precedencia refere-se a "ordem sequencial com que uma operao executada pelo compilador.
Se numa instruo tivermos
E = a + L c;
Qual seria a primeira operao realizada ? Seria a soma de a e b ?
Prioridade Operao
1 ( ) ++ --
2 & * + - ~ ! ++ --
3 * / %
4 + -
5 << >>
6 < > <= >=
7 == !=
8 &
9 ^
10 |
11 &&
12 ||
13 = *= /= %= += -= <<= >>=
$= ^= |=
Em nosso exemplo, a sequencia real ser:
Primeiro: 6 c gerando um resultado parcial que chamaremos de P
Depois: Z = a + P
23
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.10.2 - Converso de tipos (type casting)
Muitas vezes ocorre de precisarmos copiar uma varivel em outra, ou at mesmo realizar operaes
aritmticas entre elas.
Nestes momentos temos de ter cuidado com as converses entre os tipos de variveis, pois o
compilador no vai avisar caso algum valor venha a ser "truncado na operao.
Apenas para simplificar usaremos os nomes var8 e var16 para variveis de 8 e 16 bits, e para
facilitar usaremos valores em hexadecimal.
Exemplo 1: copiar varivel de 8 bits para uma de 16 bits
var8 = 0x12;
var16 = var8; // resultado = 0x0012
O compilador ajustou a varivel de 16 bits com 'zeros' a esquerda.
Exemplo 2: copiar varivel de 16 bits para uma de 8 bits
Var16 = 0x1234;
Var8 = var16; // resultado = 0x34
Aqui o compilador "matou a parte alta (0x12) e usou apenas a parte baixa na operao.
DICA: Sempre que for usar tamanhos diferentes certifique-se de transformar todos para o mesmo
tipo, pois os erros de clculo decorrentes das converses automticas s!o imprevis"veis e #$% s!o
sinali&ados pelo compilador
Ao invs de deixar o compilador fazer a converso, podemos especificar o tipo de converso que
desejamos com o seguinte formato:
Ctipo) valor
Este formato de escrita chamado de TYPE CASTNG.
Quando escrevemos desta forma temos uma converso temporria em memria para uso apenas
na operao desejada.
Se multiplicarmos duas variveis de 8 bits, o resultado ser outra varivel de 8 bits, mesmo que o
resultado seja direcionado para uma varivel de 16 bits, porque a aritmtica realizada ANTES do resultado
ser escrito na varivel final.
int# a = .;
int# L = .;
int/5 c = .;
a = /..;
L = /..;
c = a L;
Neste caso o resultado sera 16. Vejamos:
100 * 100 = 10000
Em hexadecimal temos um valor de 16 bits igual a 0x2710. Como o resultado ser de 8 bits, apenas
o byte final ser aproveitado, resultando 0x10 que em decimal da 16
24
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Como resolver com o type casting ?
int# a = .;
int# L = .;
int/5 c = .;
a = /..;
L = /..;
c = )int/5* a L; // primeiro passa a (aria(el !a" para /5 Lits$ lo4o a
// multiplica8=o ser em (ari(eis de /5 Lits
Estude o exemplo que est na pasta
c:DapostilaP:CrevEDcap$DtFpecasting
.11 - Matrizes
Define-se como matriz um grupo de dados que podem ser agrupados num mesmo nome,
diferenciando-se apenas pela posio no grupo.
Como exemplo temos uma rua com vrias casas. A rua seria nossa matriz, por exemplo, Rua
Paran. Cada casa tem um nmero que indica sua posio na rua (na matriz).
Exemplo: casa 32 da Rua Paran
Poderamos escrever Rua Parana [32]
Em C, a definio de uma varivel ou de uma constante como matriz feita apenas pela incluso de
seu tamanho entre colchetes [ ].
Exemplo:
Matriz para os 20 valores de temperatura lidos, variveis de 8 bits:
int8 temperatura [20]; // reserva espao de memria para
// 20 bytes que indicaro a temperatura
Para acessar os elementos da matriz basta escrever o nome da varivel com o ndice do valor
desejado.
Exemplo:
valor = temperatura [12]; // o 13
o
elemento da matriz temperatura
// copiado para a varivel valor.
Podemos ainda utilizar variveis para acessar os elementos da matriz.
Exemplo:
int8 qual; // usaremos esta varivel como ndice
int8 dados [20]; // declarao da matriz em memria, com
// 20 elementos
Em nosso programa podemos fazer o seguinte:
qual = 10; // ajustamos o ndice no 11
o
elemento
dados [qual] = 40; // e escrevemos na matriz na posio
// indicada na varivel
25
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
:.P,45A952:
1. O ndice de acesso a matriz vai de 0 at tamanho-1.
No nosso exemplo, ir de 0 19.
2. CUDADO! Se voc usar como ndice da matriz um numero maior que o seu limite,
o compilador usar uma posio de memria RAM de outra varivel.
Exemplo:
qual = 30;
dados [qual] = 10; // onde este valor ser armazenado, se nossa
// matriz tem apenas 20 elementos?
.11.1 - Matrizes bidimensionais
Podemos ainda usar matrizes bidimensionais, ou seja , como em um tabuleiro de xadrez.
Exemplo: int16 tabela [10][10];
Neste exemplo criamos uma matriz com 100 elementos ( 10 X 10) de 16 bits, ou seja, usamos 200
posies de memria de dados.
.12 - Controle do programa em C
Um dos pontos mais importantes do aprendizado da linguagem C esta na sua sintaxe, isto , como
o programa deve ser escrito.
At agora vimos apenas teorias sobre variveis, dados, e funes.
Veremos a partir de agora como tudo isto integrado de forma a produzir um resultado til.
Para tal vamos estudar as estruturas de montagem de programas e ver como se controla o fluxo de
"aes que o programa deve tomar.
Para facilitar o aprendizado no vamos nos preocupar agora com o PC e nem com as funes
criadas para o mesmo, mas apenas com a forma como escrevemos o programa em C.
.12.1 - Blocos de declaraes
Sempre que mais de uma instruo tiver de ser executada para uma certa rotina, as mesmas
devero estar contidas dentro de um BLOCO de declaraes.
Um bloco de declaraes tem incio com a abertura de uma chave ' { ' e finalizado pelo
fechamento da chave ' } '.
Como um bloco no termina no fim da linha, mas sim ao fechar a chave, podemos escrever o
mesmo de forma mais clara, colocando seus elementos em vrias linhas e tabulando as colunas conforme
os blocos vo se integrando, permitindo melhor colocao de comentrios e visualizao do programa.
26
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Exemplo 1: + x = /; tempo = x 2; ,
Exemplo 2: +
x = /; // posso colocar um
tempo = x 2; // comentrio para cada
, // linha
Os dois exemplos acima realizam a mesma tarefa, mas o exemplo 2 mais fcil de ser lido e
posteriormente entendido.
::+1$+1+1 G 8tili/ao de !lu)ogramas para representar a se#H>ncia das instru"es
Vamos sempre que possvel utilizar fluxogramas simples para auxiliar nosso entendimento do fluxo
do programa.
Em nossos fluxogramas temos os desenhos bsicos:
Testes para tomadas de decises
Bloco de linhas de cdigo, que podem ser usadas
em vrias situaes
Setas indicativas de deciso ou de seqncia do
programa
.12.2 - Bloco F (executa se a condio for verdadeira)
Podemos entender o bloco F como um teste simples, onde o programa far um teste e em funo
da resposta ao mesmo (falso ou verdadeiro), executar uma ou outra ao, prosseguindo a partir dai.
Temos duas opes bsicas, sendo que a condio de teste dever estar entre parnteses:
Temos vrios formatos possveis para o F
F simples, com apenas uma declarao caso o teste seja verdadeiro
if ( A == 0 ) A = 10; // SE a varivel A estiver zerada, atribui 10 mesma.
F com mais de uma declarao caso o teste seja verdadeiro.
Neste caso o grupo de declaraes dever estar num BLOCO, entre chaves ' { } '.
27
- SE (teste = ok!) "eec!ta e"ta#"$ declara%o#&e"$
- SE (teste = ok!) "eec!ta e"ta#"$ declara%o#&e"$
SENO "eec!ta e"ta#"$ o!tra" declara%o#&e"$
Teste OK ?
Bloco de
funes
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
if ( tempo > 10 )
{
tempo = 0;
contador = contador + 1;
}
F com exceo (se o teste falha, executa outra declarao ou bloco).
Pode na exceo executar uma instruo apenas ou um bloco.
if ( teste ok )
declara%o individ!al o! 'loco
else
declara%o individ!al o! 'loco da ece%o
mportante: A instruo (declarao) simples no precisa estar na mesma linha do F ou do ELSE. (Ver item
.11.2.1, nos exemplos de F's aninhados).
'lu(ograma gen)rico para o controle I':
Sim No
Podemos ento resumir numa tabela todas as combinaes dos F's:
if (teste a realizar)
in"tr!%o para te"te (O)*
if (teste a realizar)
{
+r!po de in"tr!&e" para te"te (O)*
}
if (teste a realizar)
instruo para teste "OK
else
instruo para teste "NO OK
if (teste a realizar)
{
+r!po de in"tr!&e" para te"te (O)*
}
28
Teste OK ?
Bloco para
teste falso
(opcional)
Bloco para
teste verdadeiro
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
else
in"tr!%o para te"te (N,O O)*
if (teste a realizar)
in"tr!%o para te"te (O)*
else
{
+r!po de in"tr!&e" para te"te (N,O O)*
}
if (teste a realizar)
{
+r!po de in"tr!&e" para te"te (O)*
}
else
{
+r!po de in"tr!&e" para te"te (N,O O)*
}
::+1$+$+1 - :IJs aninhados Cemutidos um no outro)
Chamamos a estrutura de "F's aninhados quando a instruo a ser executada para um teste (seja
verdadeiro ou falso) na verdade outro F.
Vamos ver dois exemplos que ajudaro a esclarecer o assunto.
2)emplo 1: Observe os dois trechos de programa a seguir:
i& ) E * O i& ) E *
i& )H* O +
a = a 2; O i& )H*
else O a = a 2;
a = a 1; O ,
O else
O a = a 1
No trecho da esquerda, o 'else' refere-se ao i! CK), pois esta "mais prximo deste. Somente se os
if's (X) e (Y) resultarem falsos que a linha a = a * 4 ser executada.
Se o if (X) resultar -al"o, nenhuma operao ser realizada.
No trecho da direita, o else refere-se ao i! CL)= pois o if (Y) esta dentro de um bloco, no sendo
visvel para o else.
Se o if (X) resultar verdadeiro mas o if(Y) resultar -al"o, nenhuma operao ser realizada.
29
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
2)emplo $: Vrios F's seqenciais
i& ) posi8=o == /* // PQ se posi8=o = /.
peso = /; // R /. 0a? peso = /.
else i& )posi8=o == 2* // N=o G /. PQ se posi8=o= 2.
peso = 2; // R 2. 0a? peso = 2.
else i& )posi8=o == 7* // N=o G 2. PQ se posi8=o = 7.
peso = 1; // R 7. 0a? peso = 1.
else i& )posi8=o == 1* // N=o G 7. PQ se posi8=o = 1.
peso = #; // R 1. 0a? peso = #.
else peso = .; // N=o G 1. 0a? peso = ..
.12.3 - Bloco FOR (executar por um certo nmero de vezes)
A idia do bloco FOR executar uma instruo ou um bloco de instrues repetidamente, por um
nmero de vezes determinado pela chamado do loop.
Sua sintaxe a seguinte:
'lu(ograma gen)rico para o controle '%*:
No

Sim
Continua o programa
30
Teste OK ?
Bloco para
teste OK
nicializao
Se o teste for
falso, sai
do loop.
for ( inicializa%o M condi%o de te"te M a.!"te o! incremento )
instruo M
o!
for ( inicializa%o M condi%o de te"te M a.!"te o! incremento )
{
( grupo de instrues )
}
Ajuste ou
incremento
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Exemplo 1:
Para melhor entendimento, vejamos um exemplo de um loop que conta de 1 a 100, e escreve este
valor numa varivel chamada CONTADOR.
&or ) i = /; i < /./ ; i++ *
CKN'FMKS = i;
/erc0cio propo"to: faa numa folha de papel a simulao do FOR acima para ver se entendeu o conceito
Exemplo 2:
Se desejarmos escrever na varivel 'contador' e ainda somar estes nmeros, podemos usar o
seguinte programa:
int# contador; // declarei contador como (ari(el de # Lits
int/5 soma; // declarei a (ari(el soma como /5 Lits.
int# i; / a (ari(el <ue G usada no loop tamLGm
. precisa ser declarada. Neste caso$ /
. L-te G su&iciente /
.
.
soma = .; // &a8o soma = . para iniciali?ar a (ari(el
&or ) i = /; i < /./; i++* // i (ai de / 6 /..
+
contador = i; // escre(e ! i ! em contador
soma = soma + i; // a soma anterior G somada a ! i !
,
::+1$+&+1 - @oop in!inito com I,4
Podemos criar um loop infinito com a declarao
!or C M M ) in"tr!%o o! -!n%o 1!e "er eec!tada inde-inidamente
ou
!or C M M )
{
Grupo de instrues que sero executadas indefinidamente
}
Lembre-se que o programa de um microcontrolador no tem fim, sempre esta rodando.
Geralmente nosso programa sempre ter ao menos 1 loop infinito.
31
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.12.4 - O condicional WHLE (enquanto)
O WHLE executa a instruo ou o bloco de instrues "enquanto a condio de teste for
verdadeira.
NSe logo no inicio do teste a condio resultar O!alsaO= nada ser e)ecutado+P
Sintaxe:
'lu(ograma gen)rico para o controle +,I-.:

No
Sim
Continua...
Vamos proceder novamente a soma dos nmeros de 1 a 100 como no exemplo anterior.
i = /; // nunca es<uecer de iniciali?ar
soma = .; // todas as (ari(eis do pro4rama.
Thile ) i < /./ * // &a8a en<uanto i </./
+
soma = soma + i;
i++; / como o U3ICV apenas &a? o teste
de(o incrementar a (ari(el /
,
32
Teste OK ?
Bloco para
teste OK
Se o teste for
falso, sai
do loop.
while ( teste )
in"tr!%o para te"te verdadeiro
o!
while ( teste )
{
( grupo de instrues para teste verdadeiro)
}
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
::+1$+E+1 - @oop in!inito com QR:@2
while ( 1 ) // ou podemos escrever while (true)
{
( declaraes executadas eternamente )
}
A condio booleana "1 sempre ser verdadeira (1 = true), logo o bloco do while ser executado
eternamente, MAS aconselha-se usar o FOR(;;) para evitar que o compilador emita um aviso sobre o fato da
condio sempre resultar verdadeira.
.12.5 - O condicional DO . . . . WHLE (faa ... enquanto)
O condicional DO . . . . WHLE funciona de forma semelhante ao WHLE, exceto pelo seguinte fato:
/pelo menos uma ve& a instru0!o ou o 1loco ser!o e(ecutados2+
Sua sintaxe :
A instruo (ou o bloco) executada "pelo menos uma vez porque neste formato o teste dentro do
While ser realizado APS a execuo do bloco, enquanto que no bloco While comum o teste executado
ANTES.
'lu(ograma gen)rico para o controle D%...+,I-.:




Sim

No
Continua...
33
Teste OK ?
Bloco de
declaracoes
Se o teste for
falso, sai
do loop aps
executar 1 vez
o bloco.
do in"tr!%o para te"te verdadeiro
while ( teste ) M
o!
do
{
( grupo de instrues para teste verdadeiro)
}
while ( teste ) M
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.12.6 O comando BREAK
O comando BREAK permite a saida de qualquer loop.
Ao encontrar o break, o programa pula para a instruo logo aps o loop.
Exemplo:
int i;
int/5 soma = .;
(oid main)(oid*
+
&or) i=/ ; i<2/ ; i++ * // a%ustamos para <ue !i" ( de / a 2.
+
soma = soma + 2;
i& ) i == 2* // se !i" &or 2$ sai do loop
Lrea;;
, //>>>>>>>>>>>>>>>>>>>>>>>> este ponto G o &inal do loop
,
Este programa vai somando 2 varivel soma, at que i seja igual a 5, independente do loop ir ate
50. Neste caso o valor final da soma ser 10.
Estude o exemplo que esta na pasta reaS no arquivo para download no link
http://www.newtoncbraga.com.br/cap2.zip
.12.7 O comando CONTNUE
O comando BREAK visto anteriormente permite a "sada do loop a qualquer momento, encerrando
sua execuo.
J o comando CONTNUE funciona de forma similar, mas sem sair do loop, apenas pulando para o
prximo valor do mesmo.
Ao encontrar o comando CONTNUE, o programa "pula todas as instrues entre o CONTNUE e o
ponto onde faz a atualizao do loop
Exemplo:
int# i;
int/5 soma = .;
(oid main)(oid*
+
&or) i=/ ; i<// ; i++ * // i (ai de / a /.
+
i& ) i > 2*
continue; // (ai para o &inal do loop$ WFB n=o sai$ apenas
// a%usta o contador do mesmo
soma = soma + i; // so &a? a soma se !i" &or menor <ue 5
, //>>>>>>>>>>>>>>>>>>>>>>>> este ponto G o &inal do loop
,
34
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Estude o exemplo que esta na pasta continue no arquivo para download no link
http://www.newtoncbraga.com.br/cap2.zip
.12.8 - O condicional SWTCH
O SWTCH testa a varivel e conforme seu valor "pula (isto , realiza um desvio) diretamente para
o grupo de instrues conforme a clusula CASE.
Caso nenhuma das condies previstas nos vrios CASE sejam satisfeitas, executa o bloco
DEFAULT, se houver (o de-a!lt no obrigatrio).
'lu(ograma gen)rico para o controle S+I3C,:
.......
Mesmo que apenas uma instruo seja usada para um certo CASE, devemos incluir a instruo
(42AT, que faz com que o programa v imediatamente para o fim do SWTCH, continuando a partir da
(ver item .12.6 acima).
Caso o BREAK no seja colocado, o programa continuar pelo CASE logo abaixo do que foi
chamado (ou no DEFAULT), resultando em erro de seqncia lgica.
Seu formato geral :
switch ( varivel )
{
case con"tante1
( instruo ou grupo de instrues )
break;
case con"tante2
( instruo ou grupo de instrues )
break;
+
+
+
default:
( instruo ou grupo de instrues para falso geral )
break;
}
35
Case
1
Case
4
Case
3
Case
2
Defaul
t
Teste da varivel (para cada resultado h um case)
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Vamos ver um exemplo que faz o mesmo que o F aninhado que vimos anteriormente.
sTitch ) posi8=o *
+
case /X // CFBK posi8=o = / ....
peso = /;
Lrea;; // sai do CFBV.
case 2X
peso = 2;
Lrea;;
case 7X
peso = 1;
Lrea;;
case 1X
peso = #;
Lrea;;
de&aultX // CFBK posi8=o NYK se%a /$ 2$ 7
// ou 1$ executa este Lloco
peso = .;
Lrea;;
,
Em alguns casos, embora nem sempre seja recomendvel, podemos escrever vrias declaraes
em uma s linha quando apenas 1 ou 2 instrues so usadas:
sTitch ) posi8=o *
+
case /X peso = /; Lrea;; // CFBK peso=/$ ....
case 2X peso = 2; Lrea;; // CFBK peso=2$ ....
case 7X peso = 1; Lrea;;
case 1X peso = #; Lrea;;
de&aultX peso = .; Lrea;;
,
.12.9 - O comando RETURN
O comando RETURN encerra imediatamente a execuo da funo e executa um retorno para a
funo de chamada.
o mesmo que encontrar o fim da funo, mas de forma proposital.
O comando RETURN permite ainda indicar um valor para ser devolvido para a funo de chamada.
Se nenhum valor for indicado, e a funo de chamada estiver esperando um retorno, o valor
recebido ser indefinido.
Exemplo: Chamamos a funo dobrar enviando um valor e a mesma RETORNA o resultado
int# i;
int# doLro = .;
int# doLrar )int# (alor* // receLe um (alor e de(ol(e o doLro
36
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
+
return (alor+(alor;
,
(oid main )(oid*
+
&or) i=/ ; i<// ; i++ * // i (ai de / a /.
+
doLro = doLrar ) i *;
,
,
MPORTANTE:
1) Veremos adiante que todo programa deve ter a funo MAN ( ). S para constar, no reset o
processador ser desviado sempre para a funo MAN( ).
2) No item .14.3 vamos detalhar a idia de passar valores entre as funes
Estude o exemplo que esta na pasta return no arquivo para download no link
http://www.newtoncbraga.com.br/cap2.zip
.13 - Abreviaes teis para instrues aritmticas
.13.1 - ncremento e Decremento
Duas delas foram mostradas no item .8 (Operadores lgicos e aritmticos bsicos da linguagem
C), a saber:
++ ncremento da varivel indicada
O operador '++' facilita a escrita de instrues para o incremento de variveis.
Ao invs de escrever: tempo = tempo + 1;
podemos escrever: tempo++; o! ++tempo;
(ver item .12.2 a seguir)
- - Decremento da varivel indicada
O operador '- -' facilita a escrita de instrues para o decremento de variveis.
Ao invs de escrever: tempo = tempo - 1;
podemos escrever: tempo- -; o! - -tempo;
37
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.13.2 - Combinando abreviaes
Podemos combinar numa nica linha abreviaes e atribuies, de forma a facilitar a escrita do
programa.
3mportante4 Os iniciantes na linguagem devem usar inicialmente as instrues bsicas para no se
confundirem.
Vamos explicar com alguns exemplos:
Y = ++ X; X = X + 1;
Y = X;
Como o ++ esta 'ANTES' do X, primeiro o X ser incrementado para depois Y receber o valor.
Alterando a posio do incremento, teremos:
Y = X ++; Y = X;
X = X + 1;
Como o ++ esta 'DEPOS' do X, primeiro o valor de X ser copiado para Y e depois incrementado.
Estude o exemplo que esta na pasta arevia"es no arquivo para download no link
http://www.newtoncbraga.com.br/cap2.zip
.13.3 Operaes com resultado na mesma varivel
Sempre que utilizarmos no resultado a mesma varivel, podemos abreviar a operao, o que reduz
o trabalho de digitao.
3n"tr!%o normal
Tempo_de_resposta = Tempo_de_resposta * 10;
3n"tr!%o a'reviada
Tempo_de_resposta * = 10;
.14 - Variveis locais, variveis globais e parmetros
Existem duas maneiras principais para a alocao de variveis em memria:
.14.1 - Variveis Globais
As variveis globais tm "validade para todas as rotinas e funes existentes no programa.
sto significa que qualquer rotina ou funo poder utiliz-la.
.14.2 - Variveis Locais
As variveis locais tem "validade apenas dentro das rotinas ou funes onde foram criadas.
sto significa que apenas a rotina ou funo onde a mesma foi criada poder utiliz-la.
Vamos ver um fragmento de cdigo como exemplo:
38
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
int# F$B$C; // F$ B e C s=o (ari(eis 4loLais$ pois est=o
// &ora de <ual<uer &un8=o ou rotina.
main ) *
+
F = .; // 0a? F=.
'empo) *; // chama rotina 'empo
Vspera) *; // chama rotina Vspera
,
.
.
'empo) *
+
int# Z; // cria uma (ari(el chamada Z.
// Bomente a rotina 'empo) * poder utili?Dla
Z = F;
,
.
Vspera) *
+
int# E; // cria uma (ari(el chamada E.
// Bomente a rotina Vspera) * poder utili?Dla
E = F;
E = Z; // >>>>>>>>>>> VSSKX F (ari(el Z n=o existe para esta rotina
,
Vantagens: A principal vantagem no uso das variveis locais est em que a memria RAM ocupada
pela mesma poder ser compartilhada por outras variveis locais, permitindo um "aumento relativo no
espao de memria, pois as variveis locais de duas rotinas que nunca se comunicam podero estar no
mesmo endereo fsico de memria.
Este trabalho de alocao de memria feito automaticamente pelo compilador. Cabe ao
programador apenas declarar as variveis corretamente (locais ou globais).
.14.3 - Variveis como parmetros
Outra facilidade da linguagem C esta na passagem de valores de uma rotina ou funo para outra.
Estes valores so conhecidos por "parmetros.
Vamos imaginar uma rotina que calcula o quadrado de um certo nmero.
4odemos chamar a rotina assim:
...
N[mero = 2; // atriLui um (alor a (ari(el \n[mero\
]uadrado) *; // chama a &un8=o <uadrado e o resultado ser
// arma?enado na (ari(el \result\
E = result;
.
.
(oid ]uadrado) *
+
Sesult = N[mero N[mero;
,
39
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
O! podemo" chamar de -orma mai" ele+ante4
E = ]uadrado)2*; // chama a &un8=o \<uadrado\ en(iando
// como par^metro o n[mero dese%ado
// e o resultado ser automaticamente
// arma?enado na (ari(el usada na
// chamada$ E
...
int/5 ]uadrado)int# 3* // crio uma (ari(el local para receLer o
// par^metro
+
return)3 3*; // retorna uma (ari(el \int/5\
,
.15 - A varivel tipo VOD e os prottipos de funes
Existe um tipo de varivel especial chamada VOD. Seu significado seria mais ou menos do tipo
VAZO, e no ocupa espao de memria.
usada principalmente na chamada de rotinas ou no retorno das mesmas, para indicar que
nenhum valor foi "enviado ou ser "retornado pela funo.
Para melhor entendimento, vejamos uma rotina que no precisa de parmetros e nada retorna:
Ce'eclas) *; // chama a rotina sem en(iar nada
.
(oid Ce'eclas) * // este (oid indica <ue a rotina n=o
+ // en(ia par^metros de (olta
.
,
.15.1 - Prottipos de funes
Os prottipos de funes indicam ao compilador:
- qual o tipo de varivel a funo retorna
- quantas e tambm quais os tipos das variveis a funo recebe (mais conhecidas por parmetros ou
argumentos)
Caso durante a chamada da funo o programador escreva mais ou menos argumentos, ou erre o
tipo (declarou int e manda float) o compilador sinaliza o erro, ajudando no desenvolvimento do programa
Outra facilidade esta na 'localizao' da funo.
Vejamos:
Por padro, durante o processo de compilao, o compilador C sempre busca as funes acima do
ponto onde so chamadas. Para evitar erros de compilao, como por exemplo o compilador no encontrar
uma rotina porque a mesma esta abaixo do ponto de chamada OU em outro arquivo (como uma biblioteca),
podemos avisar o compilador da existncia das rotinas usando o conceito de prottipo.
Esta declarao da rotina, feita apenas com seu nome, sem suas instrues e finalizada pelo " M "
conhecida por prottipo+
40
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Exemplos:
(oid Ce'eclas )(oid*; // Vste prot_tipo indica <ue a rotina Ce'eclas n=o
// receLe par^metros e tamLGm n=o retorna
// (alores.
(oid 'empo )int# ---*; // Vste prot_tipo indica <ue a rotina 'empo
// receLer um (alor do tipo int#$ <ue receLer o
// nome de --- para seu uso$ mas n=o retornar
// nada.
.16 - Estruturas
Uma estrutura um agrupamento de variveis formando uma nova varivel, mais complexa, que da
ao programador mais flexibilidade na manipulao de dados.
Podemos resumir que uma estrutura um conjunto de variveis, de vrios tamanhos, que so
agrupadas em uma matriz, mas cujos elementos so chamados pelos seus nomes mais o nome da matriz.
Vejamos um exemplo que vai esclarecer tudo
magine que voc quer criar um conjunto de dados para salvar os seguintes elementos relativos a 3
veiculos:
- velocidade
- distncia
- tempo
Voc poderia criar assim:
int# (elocidade/$ (elocidade2$ (elocidade7;
int/5 distancia/$ distancia2$ distancia7;
int72 tempo/$ tempo2$ tempo7;
Uma maneira mais elegante e fcil de ser visualizada pela utilizao de uma estrutura, onde
agruparemos os tipos bsicos dos dados em um conjunto com um nome genrico, usado apenas para
referenciar ao compilador o tipo de dados, e que chamaremos de "veiculo.
struct Mados`erais // nome 4enGrico da estrutura
+
int# (elocidade;
int/5 distancia;
int72 tempo;
, ;
struct Mados`erais (eiculo/$(eiculo2$(eiculo7;
// nome das (ari(eis <ue conter=o os dados da estrutura
Para usar as variveis no precisaremos mais usar os nomes individuais, mas sim o nome do
conjunto + o ponto decimal + o nome da varivel.
Por exemplo, para escrever 10 na varivel velocidade do veiculo 2, usaremos a seguinte notao:
41
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
veiculo5.velocidade 6 789
Neste caso a varivel velocidade "escrita de forma individual no ser reconhecida pelo
compilador.
velocidade 6 789 ** 244, D2 C,.P:@AUV,
Agora imagine que voc quer fazer isto para 100 veculos.
Ao invs de criar uma estrutura e colocar nela100 variveis, ou seja,
struct Mados`erais // nome 4enGrico da estrutura
+
int# (elocidade;
int/5 distancia;
int72 tempo;
, ;
struct (eiculo/$(eiculo2$(eiculo7$.........(eiculoaa$(eiculo/..;
podemos utilizar uma matriz na estrutura, assim:
struct Mados`erais // nome 4enGrico da estrutura
+
int# (elocidade;
int/5 distancia;
int72 tempo;
,
(eiculo b/..c ; // temos a<ui /.. d(eeculosf
// declarados
e a velocidade do veculo 13 pode ser salva da seguinte forma:
veiculo :7;< . velocidade 6 7889
Podemos ver nestes exemplos que estruturas e matrizes nos do uma enorme flexibilidade na
manipulao de variveis complexas e ainda torna o programa mais 'legivel' para o usurio.
Estude o exemplo que esta na pasta estruturas no arquivo para download no link
http://www.newtoncbraga.com.br/cap2.zip
.17 - Unions
Embora a declarao de uma UNON seja similar a declarao de estruturas, a UNON tem como
caracteristica principal o fato de que todas as variveis da mesma "COMPARTLHAM a mesma rea de
memria. (na estrutura as variveis so seqenciais e independentes).
Vejamos um exemplo que vai esclarecer tudo.
magina que voc tem uma varivel float ( ponto flutuante que ocupa 4 bytes de ram) e deseja salva-
la na eeprom de dados.
Com o exemplo da UNON vamos mostrar como fazer isso facilmente.
Primeiro vamos criar uma union que vai compartilhar a varivel float com uma matriz de 4 bytes:
42
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
union pacote // nome 4enGrico da union
+
&loat Palor72; // (ari(el &loat de 72 Lits
int# L-tesb1c; // matri? para aLri4ar os 1 L-tes do &loat
, ;
union pacote dado; // dado G a (ari(el <ue ANV os dados
.apa de memria ocupada pela union:

++++
W
++++
Exemplo de utilizao:
(alor72 = /72.27; // (alor ponto &lutuante. Como sal(ar na
// eeprom g
// com o auxilio da union
// sal(amos L-te a L-te
// os 1 L-tes <ue compoem
Trite@eeprom ) . $ L-tes b . c *; // a union
Trite@eeprom ) / $ L-tes b / c *;
Trite@eeprom ) 2 $ L-tes b 2 c *;
Trite@eeprom ) 7 $ L-tes b 7 c *;
Estude o exemplo que esta na pasta unions no arquivo para download no link
http://www.newtoncbraga.com.br/cap2.zip
.18 - A funo MAN ( )
Todo programa em C deve ter uma funo chamada MAN ( ), que a rotina que ser executada
quando o programa for chamado (em nosso caso aps o reset da cpu).
Exemplo de um programa que nada faz, mas que pode ser compilado:
#include <16F877A.H>
void main (void) // a funo MAN no recebe ou devolve valores
{
}
.19 - Exemplos de programas simples
43
Varivel
'dado'
nt8 bytes[0]
float
'Valor32'
Ocupa
4 bytes
nt8 bytes[1]
nt8 bytes[2]
nt8 bytes[3]
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Veremos neste item alguns programas pequenos e simples, sem funo tcnica especfica, apenas
para ilustrar os conceitos vistos at agora. Use-os para treinar o uso do Mplab e do compilador C (Cap. ).
Programa 1: Calcula a soma dos nmeros de 1 a 100.
Programa 2:
Conta indefinidamente de 1 a 10. Sempre que chegar a 10 incrementa a varivel X e recomea.
Programa 3:
ncrementa indefinidamente a varivel chamada contador e escreve nos leds colocados no portd D
44
#include <16F877A.H>
int8 i; // varivel i usada no loop (0 a 255)
int16 soma; // soma pode ir de de 0 a 65535
void main( )
{
for ( ;; )
{
soma = 0; // inicializei a varivel soma
for ( i = 1; i < 101; i++)
soma = soma + i;
}
}
#include <16F877A.H>
int8 i, x; // declarei que i e x so
// variveis do tipo int8
void main ( void)
{
i = 0; x = 0; // inicializei as variveis
for ( ;; ) // fica eternamente neste loop
{
i++; // incrementa i
if ( i == 10 ) // v se i = 10.
{
x++; // . ncrementa x e faz i = 0.
i = 0;
}
}
}
#include <16F877A.H>
int8 contador; // declarei que 'contador' uma
// varivel do tipo int8 (8 bits)
void main ( void)
{
contador = 0;
for ( ;; ) // fica eternamente neste loop
{
output_D ( contador);
contador ++;
}
}
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Estes 3 programas esto nas pastas ex1, ex2 e ex3 no arquivo para download no link
http://www.newtoncbraga.com.br/cap2.zip
45
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
- Programa mnimo em C
- Programa mnimo em C
Temos neste item uma listagem de um programa bsico para compilao. Todos os exemplos
anteriores so compilveis e podem ser simulados, mas para gravao no chip mais alguns ajustes so
necessrios, conforme abaixo.
Este programa est no arquivo para download http://www.newtoncbraga.com.br/livros/cap3.zip na pasta
Programa .Xnimo
Todos os programas prticos que esto no arquivos para downloads, esto preparados para serem
compilados para o pic 16F877, 16F877A, 18F452 ou para o pic 18F458.
Como informamos ao compilador qual modelo ser usado ?
Observe que as primeiras linhas logo aps o cabealho inicial so as seguintes:
///////////////////////////////////////////////////////////////////////
// BVCVCFK MK 'I>K MV >SKCVBBFMKS
// >>>>>>>>>>>>>>>>>>> Fpenas / de&ine pode existir.
// Colo<ue como \comentario\ os <ue nao esti(er usando
//#de&ine 12#
//#de&ine 122
//#de&ine #::
#de&ine #::F
///////////////////////////////////////////////////////////////////////
//////////////////////// KB FZAB'VB BFK FA'IWF'ICFWVN'V SVFCIhFMKB
//////////////////////// CKN0KSWV K WKMVCK MK >SKCVBBFMKS BVCVCIKNFMK
#i&de& 12#
#include </#012#.3> // Me&ine processador /#012#
#I0MV0 mododeLu44er
#de(ice icd=true
#&uses noUS'M$ noUS'B$ noC>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ no>SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ deLu4
#else
#&uses noUS'M$ noUS'B$ C>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ >SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ nodeLu4
#VNMI0
#endi&
#i&de& 122
#include </#0122.3> // Me&ine processador /#0122
#I0MV0 mododeLu44er
#de(ice icd=true
#&uses noUS'M$ noUS'B$ noC>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ no>SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ deLu4
#else
#&uses noUS'M$ noUS'B$ C>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ >SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ nodeLu4
#VNMI0
#endi&
46
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
#i&de& #::
#include </50#::.3> // Me&ine processador /50#::
#I0MV0 mododeLu44er
#de(ice icd=true
#0uses 3B$NKUM'$>A'$NK>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#else
#0uses 3B$NKUM'$>A'$>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#VNMI0
#endi&
#i&de& #::F
#include </50#::F.3> // Me&ine processador /50#::F
#I0MV0 mododeLu44er
#de(ice icd=true
#0uses 3B$NKUM'$>A'$NK>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#else
#0uses 3B$NKUM'$>A'$>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#VNMI0
#endi&
Neste trecho de cdigo temos quatro 'defines' (veremos com detalhes no captulo V), um que indica
EY$= EY?= ?ZZ e ?ZZA+
AP29AS 8. P,D24B 2S5A4 RA(:@:5AD,+
Os outros "defines, referentes aos modelos que NO sero usados, devem ser precedidos do
marcado de comentrio, " / / ". Em nossos exemplos, todos estaro pr-habilitados para o 16F877A.
Em vrios pontos do programa teremos os indicadores de "compilao condicional, isto , o
compilador decidir, baseado em qual 'define' esta ativo,qual trecho de cdigo ser compilado. Desta forma
podemos ter um nico programa fonte para mais de um modelo de pic.
47
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
.,D2@,
///////////////////////////////////////////////////////////////////////
// >ro4rama modelo para os pics /#0122$ /#012#$ /50#:: e /50#::F
// Fpenas para estudo da lin4ua4em e do amLiente de desen(ol(imento
/////////////////////////////////////////////////////////////////////////////////
// PIEVW Wicrocontroladores
// Curso de Wicrocontroladores >IC
// Se(is=oX .2/.//2..#
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// BVCVCFK MK 'I>K MV >SKCVBBFMKS
// >>>>>>>>>>>>>>>>>>> Fpenas / de&ine pode existir.
// Colo<ue como \comentario\ os <ue nao esti(er usando
//#de&ine 12#
//#de&ine 122
//#de&ine #::
#de&ine #::F
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//////////////////////// KB FZAB'VB BFK FA'KWF'ICFWVN'V SVFCIhFMKB
//////////////////////// CKN0KSWV K WKMVCK MK >SKCVBBFMKS BVCVCIKNFMK
#i&de& 12#
#include </#012#.3> // Me&ine processador /#012#
#I0MV0 mododeLu44er
#de(ice icd=true
#&uses noUS'M$ noUS'B$ noC>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ no>SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ deLu4
#else
#&uses noUS'M$ noUS'B$ C>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ >SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ nodeLu4
#VNMI0
#endi&
#i&de& 122
#include </#0122.3> // Me&ine processador /#0122
#I0MV0 mododeLu44er
#de(ice icd=true
#&uses noUS'M$ noUS'B$ noC>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ no>SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ deLu4
#else
#&uses noUS'M$ noUS'B$ C>M$ noC>B$ noUS'$ noUS'C$ noVB'S$ noVB'SB
#&uses NKKBCBVN$ noB'PSVN$ NKCP>$ >SK'VC'$ noUM'$ UM'/2#
#&uses noBSKUNKA'$ BKSP2:$3B$ >A'$ nodeLu4
#VNMI0
#endi&
#i&de& #::
#include </50#::.3> // Me&ine processador /50#::
#I0MV0 mododeLu44er
#de(ice icd=true
#0uses 3B$NKUM'$>A'$NK>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#else
#0uses 3B$NKUM'$>A'$>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#VNMI0
#endi&
#i&de& #::F
#include </50#::F.3> // Me&ine processador /50#::F
#I0MV0 mododeLu44er
#de(ice icd=true
#0uses 3B$NKUM'$>A'$NK>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#else
48
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
#0uses 3B$NKUM'$>A'$>SK'VC'$NKBSKUNKA'$NKCP>$NKC>M$NKUS'
#VNMI0
#endi&
#use dela-)cloc;=/.......*
//////////////////////////////////////////////////////////////////////////////////
// PFSIFPVIB
////////////////////////////////////////////////////////////////////////////
(oid main) *
+
//////// Iniciali?acao de hardTare
setup@adc@ports)no@analo4s*; // se nao usar F/M$ de(emos a%ustar os ports para di4ital
#i&nde& #:: // o #:: nao tem comparador
setup@comparator)NC@NC@NC@NC*; // se nao usar o comparador$ de(emos desli4ar o mesmo
#endi&
/////////////////////////// MVWFIB FZAB'VB MV BVA >SK`SFWF
/////////////////////////// >SK`SFWF >SINCI>FC
&or );;*
+
,
,
//
// 0im do pro4rama &onte
49
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V - Usando o Mplab 7.62 em C
V - Usando o Mplab 7.62 em C
V.1 - Conceitos bsicos
O MpLab um ambiente integrado para o estudo e desenvolvimento com a famlia PC de
microcontroladores.
Sua principal caracterstica a total integrao de seus mdulos com o ambiente Windows, e
principalmente com o compilador C da CCS, permitindo a fcil copia de arquivos e trechos de arquivos de
um aplicativo para outro.
Para se escrever um programa no MpLab, precisamos antes assimilar o conceito de "projeto.
V.2 - O "Projeto no MpLab
Entende-se por pro-eto um conjunto de arquivos e informaes que diz ao MpLab qual a situao
de um certo trabalho em particular.
Por exemplo, num certo projeto designado EXEMPLO.PJT temos duas janelas abertas, exemplo.c
e exemplo.lst.
Em outro projeto designado TESTE.PJT temos trs janelas abertas, teste.c, teste.lst. e File Register
Window.
Com o gerenciamento de projetos presente no MpLab no precisamos "lembrar quais as janelas
que cada projeto estava usando no momento em que encerramos o trabalho, pois ao carregarmos o projeto
desejado todas as informaes relativas ao mesmo sero recuperadas.
356O7T8NT/4 9 a.!"tando a" .anela" para 1!e -i1!em mai" o! meno" na" me"ma" po"i&e" e
dimen"&e" apre"entada" ne"te cap0t!lo: para -acilitar "e! aprendizado.
50
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.3 - Criando o projeto com o Project Wizard
nicie o MpLab.
Na tela inicial selecione 6ro.ect > 6ro.ect ;izard como na figura 1 e na janela que vai se abrir
selecione AVANAR.
Figura 1
51
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Caso o PC indicado no seja o 18F458, selecione no menu conforme figura 2
Figura 2
E de um click no boto "Avanar.
52
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Ao pressionar o boto "Avanar, iremos para a janela de seleo do tipo de compilador. Na
primeira vez voc provavelmente obter a janela da figura 3 (que indica o compilador padro MPASM
Toolsuite):
Figura 3
Se for o caso, selecione na linha Active Toolsuite a opo CCS c Compiler ...... e obter a tela a
seguir:
Figura 3a
53
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Caso os ajustes no estejam iguais aos acima, ajuste um a um e pressione o boto "Avanar mais
uma vez. Aparecer a janela da figura 4, para ajuste do nome e local do projeto
Figura 4
Selecione pelo boto BROWSE qual diretrio (ou pasta) deseja usar, ou crie uma pasta para este
estudo, chamada CURSOPC, no drive C, e preencha o nome do projeto como CURSOPC.
Ao final sua tela devera estar assim:
Figura 5
Na janela que vai aparecer apenas selecione "Avanar mais uma vez, pois ainda no criamos o
arquivo do programa fonte.
54
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Depois selecione "Concluir e o Mplab voltara a tela inicial.
Para continuar, selecione no menu principal a seqncia: <ile > Ne= e obteremos uma janela
padro como na figura 6:
Figura 6
Nesta janela digite o texto exatamente como abaixo:
#include <18f458.h>
void main ( )
{
for ( ; ; )
{
output_high (pin_d);
output_lo! (pin_d);
"
"
55
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
e depois selecione no menu <ile > Save a"... ajustando conforme figura 7 abaixo:
Figura 7
Selecione salvar e o mplab ficar assim (ou similar redimensione suas janelas se necessrio):
Figura 8
56
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Para podermos compilar o programa, devemos avisar ao Mplab que este fonte ser usado, e para
tal usamos a seqncia
6ro.ect > 8dd <ile" to 6ro.ect....
Na janela da figura 9, selecione o fonte "cursopic.c e de um click em "Abrir:
Figura 9
Neste ponto, por segurana (vai que o windows trava !?!?!?!) salvamos tudo:
6ro.ect > Save 6ro.ect
Agora podemos continuar.....
Para saber se esta tudo correto, pressione I1[ para compilar o programa.
Caso nenhum erro tenha sido cometido, obteremos a janela da figura 10:
57
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Figura 10
Em caso de erros, verifique na janela P,utputP= na aba N(uildP qual o primeiro erro indicado+
Caso seja necessrio, com o mouse desloque a janela ate chegar no primeiro erro indicado pelo
compilador.
D um click-duplo exatamente sobre a linha de erro.
O Mplab vai alternar as janelas, e ir para a janela do programa fonte, com o cursor j colocado
sobre a linha onde encontrou o erro.
Corrija este erro e tecla F10 novamente para compilar, repetindo tantas vezes quantas o compilador
indicar erro, at no haver mais erro algum.
mportante: Algumas vezes a linha que indica estar com erro esta correta. Neste caso, verifique a linha
anterior, pois a falta de um simples ' M ' ao fim de uma linha gera erro na prxima.
V.4 - Simulando o programa
Para podermos simular o programa no Mplab, como se estivesse gravado no pic, devemos ajustar o
Mplab para trabalhar com o .pla Sim.
Veja na figura 11 como configurar o exemplo para usar o simulador:
58
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Figura 11
Neste instante observe que na barra de comandos do Mplab apareceram alguns botes novos
(figura 12, NO CANTO SUPEROR DRETO):
Figura 12
59
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Os principais botes so:
Boto RUN. >>> Executa rapidamente sem atualizao na tela
Boto PAUSE. >>> Para a simulao
Boto ANMATE. >>> Roda a simulao passo a passo
Boto RESET. >>> Reinicia o processador
Boto STEP. >>> A cada clique executa um passo de programa
e para esperenado outro comando.
De um click no boto ANMATE e veja na tela do programa fonte um cursor indicando qual linha
esta sendo executada (simulada).
Depois de um click no boto PAUSE para parar a simulao e continuar o estudo.
V.5 Verificando o registro PORTD durante a simulao
No menu principal selecione View > Watch, conforme figura 13 a seguir:
Figura 13
Voc obter a janela da figura 14:
60
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Figura 14
O boto Add SI4= e sua respectiva janela de seleo (que esta indicada com ADCON0), serve para
visualizarmos os registros "do pic, e o boto Add SFmol com sua janela de seleo (indicando CCP_1),
serve para vermos as variveis criadas no programa ou definidas no arquivo de definies (por exemplo, no
arquivo 18F458.H).
Vamos selecionar o PORTD para visualizao. Com o mouse selecione a caixa onde inicialmente
esta ADCON0 e escolha o PORTD e depois de um clique em Add SI4 (figura 15):
Figura 15
Suas janelas devero estar como na figura 16 (ajuste-as com o mouse para ficarem parecidas):
61
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Figura 16
Para ver o PORTD sendo ajustado pelo programa, de um clique no boto ANMATE e observe tudo
ocorrendo simultaneamente:
na tela do fonte, o cursor indica cada linha sendo executada;
na janela Watch voc ver o valor do PORTD alternando entre 0 e 128
Para visualizar o PORTD em binrio ou decimal, de um clique com o boto DRETO do mouse
SOBRE a varivel PORTD, e no item propriedades, selecione o formato desejado e quais opes deseja.
4raticando ) que se aprende
Repita esta seqncia com outros nomes de arquivos usando todos os exemplos dados nos
captulos e para treinar o uso do Mplab. Modifique, escreva comandos novos, escreva comandos
errados para ver as mensagens de erro, enfim, PRATQUE !
Aps ter baixado e copiado os arquivos conforme indicado no anexo , veja as pastas:
Cap$D+++. onde temos os exemplos 1, 2, 3 e regras dados no capitulo ;
Cap&D+++. onde temos o programa mnimo para simulao no mplab.
62
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V - Os Microcontroladores PC e seus
V - Os Microcontroladores PC e seus

perifricos mais usuais - Famlias 16F e 18F -
perifricos mais usuais - Famlias 16F e 18F -

Teoria de funcionamento
Teoria de funcionamento
V.1 - ntroduo
Neste captulo vamos descrever o hardware dos microcontroladores PC, iniciando pela memria de
programa e depois passando para cada perifrico.
Sempre que um perifrico for exclusivo de uma certa famlia (por exemplo, a multiplicao por
hardware existe apenas na famlia 18F) daremos destaque a esta diferena. Quando no mencionado,
considere que o perifrico existe em toda a linha pic.
Usaremos como base em nosso estudo o pic 16F877 e o 18F458, suportados pela verso de
demonstrao do compilador C (o 16F877A tem como diferena do 16F877 apenas o comparador
analgico).
Para ver as diferenas em relao aos demais modelos de pic, consulte o databook do mesmo, que
pode ser encontrado no site www.microchip.com
Os pics estudados tem como principais caractersticas:
Podem rodar at 10 MPS (milhes de instrues por segundo) 18F
At 34 pinos para uso como entrada ou sada
Capacidade de drenar/fornecer 25 mA/pino
Vrias fontes de interrupo
Timers programveis de 8 e 16 bits
mdulos PWM
Comunicao
2
C ou SP
Comunicao Serial Assncrona TTL
Conversor A/D de 8 ou 10 bits de resoluo com at 8 entradas
Comparador analgico
Watch Dog programvel
Modo Sleep para economia de energia
Proteo contra leitura do cdigo
63
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.2 Circuito mnimo
+5V
10K Vdd
MCLR
22pF Osc1
10 MHz
Osc2
22pF
47R Vss

Figura 1 Circuito mnimo com o PC
V.3 Memria de Programa
A memria de programa tem por objetivo armazenar as "instrues a serem executadas pelo
processador.
Esta memria tem como principal caracterstica no ser voltil, isto , no perde as informaes
quando a energia desconectada. Em contrapartida, no pode ser usada como memria temporria de
dados.
A complexidade interna do hardware acaba criando para o estudante uma certa dificuldade inicial,
por isto o uso da linguagem C torna-se uma opo atraente, pois alm de ser mais fcil a implementao do
programa aplicativo (tambm conhecido por firmware), precisamos apenas conhecer o funcionamento
bsico de cada perifrico, visto que o compilador C j possui implementadas todas as funes para tal.
O mapa de gravao da memria de programa ser automaticamente preenchido pelo compilador.
1><?@@ e 1?<?@@84 Temos 8.192 palavras de programao de 14 bits
1?<AB?4 Temos 16.384 palavras de programao de 16 bits
64
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.4 Memria de dados
na memria de dados que o processador realiza todas as suas funes de clculo e
armazenamento de informaes transitrias.
Esta memria tem como principal caracterstica 'ser' voltil, isto , perde as informaes quando a
energia desconectada. Em contrapartida, pode ser alterada a vontade e rapidamente (na mesma
velocidade de execuo do programa) pelo firmware para armazenar resultados de clculos, estado dos
pinos de entrada/sada, entre outros.
1><?@@ e 1><?@@84
Nos microcontroladores 16F877 e 16F877A temos 368 posies de memria RAM com 8 bits de
comprimento, isto , os valores podem variar entre 0 e 255 (ver anexo sobre sistemas de numerao)
1?<AB?4
No microcontrolador 18F458 temos 1.536 posies de memria RAM com 8 bits de comprimento,
isto , os valores podem variar entre 0 e 255 (ver anexo sobre sistemas de numerao)
A memria RAM automaticamente organizada pelo compilador C, e o mesmo nos permite
trabalhar com variveis de vrios tamanhos com nmeros inteiros de 8, 16, e 32 bits, bem como com
nmeros de ponto flutuante, conforme vimos anteriormente no captulo .
V.5 Memria EEPROM de dados
Esta uma memria especial que temos no microcontrolador, pois rene algumas caractersticas
muito teis das memrias de programa e de dados.
A principal caracterstica da eeprom de dados, ou apenas EEPROM, esta em poder ser alterada a
vontade pelo firmware para armazenar valores, e de NO perder estes resultados ao se desconectar a
energia
Mas, como tudo tem um preo, o acesso para 'gravar' na EEPROM no e feito de forma rpida
como na RAM (apenas a leitura da EEPROM pode ser feita rapidamente,) podendo a escrita levar vrios
milissegundos.
Assim sendo, os usos mais indicados para a EEPROM so:
Gravao de parmetros de configurao
Senhas
Dados de contadores, ...
Tanto no 16F877, 16F877A e no 18F458 temos 256 posies de EEPROM com 8 bits de
comprimento, e como na memria RAM, os valores podem variar entre 0 e 255.
A rotina de acesso a memria EEPROM automaticamente organizada pelo compilador C, onde
devemos apenas nos lembrar de que a cada escrita o processador vai esperar um tempinho at o fim da
mesma.
65
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.6 Circuito de Reset e Clock
Conforme vimos na figura 1, para funcionar corretamente o pic precisa, alm da alimentao, de
mais 2 circuitos auxiliares:
Circuito de reset
Circuito de clock
Circuito de 4eset: O circuito de reset tem por objetivo gerar no pino MCLR\ um sinal ascendente e
rpido, de 0 a 5Vcc.
5 V
0 V
Existem vrias configuraes possveis para esta ligao, at mesmo um fio direto do Vcc para o
pino MCLR\.
Estamos usando o resistor e o diodo para permitir a fcil conexo de gravadores in-circuit ou
debuggers linha de reset.
Circuito de clocS: A CPU dos microcontroladores PC usa 4 pulsos de clock para gerar um ciclo de
maquina interno.
Desta forma, com cristal de 20 MHz (valor mximo tpico), o clock interno ser de 5 MHz, e teremos
ciclo de mquina de 200 ns.
1?<AB?4
Para a famlia 18F, temos a configurao HS-PLL, onde a freqncia do cristal ter seu valor
quadruplicado internamente. Assim sendo, com cristal de 10 MHz, o clock interno ser de 40 MHz (limite
operacional da linha18F), e teremos internamente um sinal de 10 MHz, ou um ciclo de mquina de 100 ns.
( Tcy = 100 ns).
V.7 Multiplicao 8 bits x 8 bits por hardware
Apenas na linha 7='
O pic 18F458 possui em seu circuito interno um multiplicador por hardware, isto , podemos realizar
a multiplicao de duas variveis de 8 bits em apenas 1 Tcy (1 ciclo de mquina).
Esta caracterstica permite o uso de complexas operaes matemticas com uma velocidade
considervel.
Apenas para ilustrao, uma rotina de multiplicao escrita sem usar esta caracterstica consome
aproximadamente 69 Tcy, ou seja, 69 vezes mais lenta, alem de ocupar 13 posies de memria de
programa.
O interessante esta em que ao se usar a linguagem C, o compilador j otimiza o programa final,
usando onde for possvel a multiplicao por hardware.
66
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.8 nterrupes
Neste tpico veremos apenas uma breve teoria sobre o que so interrupes e seu mecanismo de
funcionamento.
Nos exemplos prticos teremos mais detalhes sobre as interrupes de alguns perifricos.
A interrupo
Uma interrupo nada mais que uma "breve parada na atividade atual para executar "outra
atividade, onde ao final desta o processador retornar a atividade anterior. No caso das interrupes, esta
'parada' solicitada por um evento externo ou interno ao processador, de forma assncrona, isto , no
sabemos quando vai ocorrer.
Diferente de rotinas que so chamadas pelo programa conforme desejado, onde neste caso
sabemos o ponto de 'parada'.
Podemos imaginar uma interrupo como o simples ato de pararmos uma atividade, como ler ou
assistir televiso, para atender a campainha que tocou (no sabemos de antemo o instante em que a
campainha vai tocar).
De uma maneira bem simples, podemos considerar que aps atendermos a esta "interrupo,
voltaremos ao que estvamos fazendo (no vamos levar em conta a incrvel capacidade humana de
abandonar uma atividade para se dedicar apenas a outra. No microcontrolador no funciona desta maneira).
\uantidade de interrup"es
1><?@@ e 1><?@@84
O pic 16F877 possui 14 fontes de interrupo e o 16F877A possui 15.
1?<AB?4
O pic 18F458 possui 21 fontes de interrupo, e com exceo da interrupo externa NT0, todas
podem ter alta ou baixa prioridade, e ainda podemos no utilizar esta caracterstica, quando as interrupes
tero todas a mesma prioridade (compatvel com linha 16XXX).
.ascaramento
Este termo indica a capacidade de se habilitar ou desabilitar as interrupes.
Na linha PC todas as interrupes podem ser a qualquer momento habilitadas ou desabilitadas pelo
software.
Se uma interrupo estiver desabilitada, o seu hardware correspondente poder ate ajustar o bit
que sinaliza o evento, mas o processo de interrupo no ocorrer.
Prioridade
1><?@@ e 1><?@@84
A linha 16FXXX possui APENAS 1 nvel de prioridade para as interrupes.
1?<AB?4
A linha 18FXXX possui 2 nveis de prioridade para as interrupes: alta ou baixa.
67
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Resumidamente podemos dizer que uma interrupo qualquer sempre poder interromper o
programa, se estiver habilitada.
1?<AB?4
Mas, se esta interrupo for de baixa prioridade, tambm poder ser interrompida, com a chegada
de um pedido de alta prioridade.
J uma interrupo de alta prioridade nunca ser interrompida, nem mesmo por outra interrupo de
alta prioridade.
V.8.1 -Trabalhando com interrupes de alta e baixa prioridade.
Apenas na linha 7='
At o presente momento vimos o tratamento de interrupes da mesma forma que ocorre na linha
16FXXX, isto , apenas 1 interrupo ativa por vez.
Veremos agora como se ajusta uma ou mais interrupes para serem consideradas de alta
prioridade, e assim poderem "interromper o atendimento de uma interrupo de baixa prioridade.
Para definir uma interrupo como sendo de alta prioridade, devemos na declarao da mesma
indicar com o parmetro HGH:
Exemplo: interrupo do timer 0 de alta prioridade:
#NT_timer0 HGH
void Relogio()
{
// rotinas da interrupo do timer 0
}
V.9 Fusveis de configurao
Os fusveis de configurao tem por objetivo ajustar o funcionamento do chip, como tipo de
oscilador, proteo de cdigo, uso do watch dog, entre vrios outros.
Como alguns pics tem muitos fusveis, vamos detalhar apenas os mais importantes.
Nos programas de exemplo a linha de fusveis sempre estar configurada para o mais usual.
Caso o leitor deseje se aprofundar no assunto consulte o databook do pic na seo "Configuration
Words).
A-ustes mais importantes
Oscilator type: ndica com que tipo de oscilador estaremos trabalhando, como, por exemplo, RC,
cristal de baixa velocidade, de alta velocidade, cristal com o PLL interno que quadruplica o clock, ...
Brown Out: Liga ou desliga a capacidade do chip entrar em reset caso a tenso caia abaixo do valor
programado.
Watch Dog: Liga ou desliga o monitor interno, que serve para resetar o processador em caso de
eventual travamento do software.
68
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Code protect: Permite proteger todo o cdigo ou parte do mesmo.
As funes do watch dog, brown out e outros sero vistas em tpicos dedicados mais a frente.
Um ajuste tpico dos fusveis do pic 16F877 o seguinte:
Todos os ajustes em apenas 1 linha
#fuses PROTECT, HS, CPD, NOLVP, NOWDT, NOBROWNOUT, PUT
Cada ajuste em uma linha (pode facilitar seu entendimento)
#fuses PROTECT //
#fuses HS //
#fuses CPD //
#fuses NOLVP // gravacao em baixa tensao desab.
#fuses NOWDT //
#fuses NOBROWNOUT //
#fuses PUT // power up timer habilitado
V.10 O port A e suas funes especiais
Neste tpico estudaremos o port A, suas funes de entrada e sada digital e sua multiplexao com
o conversor de analgico para digital (A/D).
O uso do conversor A/D ser estudado em um captulo a parte.
Pinos presentes no port A:
RA0 / AN0 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '0'
RA1 / AN1 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '1'
RA2 / AN2 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '2'
RA3 / AN3 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '3'
RA4 / T0Cki - Pino de entrada ou sada (sada OPEN-DRAN) digital.
Tambm pode ser a entrada do timer 0 para sinal externo
RA5 / AN4 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '4'
Para uso do port A como entrada e sada digital, temos funes especficas em 'C', que permitem
ler e escrever no port A inteiro ou em bits individuais.
V.10.1 Algumas funes de acesso ao portA digital
Escrever 1 em um pino: output_high (pin_a3);
Escrever 0 em um pino: output_low (pin_a3);
Escrever no portA inteiro: output_A (valor_desejado_8_bits);
69
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Ler o estado de 1 pino: VarBit = input (pin_a2);
Ler o portA inteiro (8 bits): Var8 = input_A ( );
:mportante: Todas as funes acima servem para os ports B, C, D e E.
Para uma referncia completa ver a parte V A linguagem C e os pic's
V.11 O port B e suas funes especiais
Neste tpico estudaremos o port B, suas funes de entrada e sada digital e sua multiplexao com
as interrupes externas.
Pinos presentes no port B:
RB0 / NT0 - Pino de entrada ou sada digital.
Tambm pode ser a entrada de interrupo
externa '0'
RB1 / :951 - Pino de entrada ou sada digital.
Apenas na linha 7='
Tambm pode ser a entrada de interrupo
externa '1'
RB2 / :95$ * Can5) - Pino de entrada ou sada digital.
Apenas na linha 7='
Tambm pode ser a entrada de interrupo
externa '2' ou CAN Tx
RB3 / Can4L - Pino de entrada ou sada digital.
Apenas na linha 7='
Tambm pode ser usado para o CAN Rx
RB4 - Pino de entrada ou sada digital.
RB5 - Pino de entrada ou sada digital.
RB6 / PGC - Pino de entrada ou sada digital.
Usado na gravao.
RB7 /PGD - Pino de entrada ou sada digital.
Usado na gravao.
Assim como no portA, para uso do port B como entrada e sada digital, temos funes especficas
em 'C', que permitem ler e escrever no port B inteiro ou em bits individuais.
Para uma referncia completa ver a parte V A linguagem C e os pic's
70
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.12 O port C e suas funes especiais
Neste tpico estudaremos o port C, suas funes de entrada e sada digital e sua multiplexao
com o timer 1, PWM, comunicao
2
C, SP e serial assncrona.
Pinos presentes no port C:
RC0 / T1Cki - Pino de entrada ou sada digital.
Entrada de clock externo para o timer 1
RC1 / - Pino de entrada ou sada digital.
RC2 / CCP1 - Pino de entrada ou sada digital.
Sada do pwm
RC3 / Sck/Scl - Pino de entrada ou sada digital.
Sada de clock Spi ou
2
C
RC4 / Sdi/Sda - Pino de entrada ou sada digital.
Entrada de dado Spi ou entrada/sada
2
C
RC5 / Sdo - Pino de entrada ou sada digital.
sada de dado Spi
RC6 / Txd - Pino de entrada ou sada digital.
sada serial assncrona
RC7 / Rxd - Pino de entrada ou sada digital.
Entrada serial assncrona
V.13 Os ports D e E com suas funes especiais.

Neste tpico estudaremos os ports D e E, suas caractersticas de entrada e sada digital e a
multiplexao do port E com o canal analgico.
Pinos presentes no port D:
RD0 - Pino de entrada ou sada digital.
RD1 - Pino de entrada ou sada digital.
RD2 - Pino de entrada ou sada digital.
RD3 - Pino de entrada ou sada digital.
RD4 - Pino de entrada ou sada digital.
RD5 - Pino de entrada ou sada digital.
RD6 - Pino de entrada ou sada digital.
RD7 - Pino de entrada ou sada digital.
Pinos presentes no port E:
RE0 / AN5 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '5'
RE1 / AN6 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '6'
RE2 / AN7 - Pino de entrada ou sada digital.
Tambm pode ser a entrada analgica '7'
V.14 nterrupes externas
Um dos melhores perifricos presentes em qualquer microcontrolador formado pelas chamadas
"entradas de interrupo externa.
Atravs de 1 ou mais pinos (1 na famlia 16F 3 na famlia 18F), o processador pode receber do
mundo externo um sinal indicando a ocorrncia de um evento.
71
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Para comparao, imagine que sua campainha esta quebrada. Teoricamente voc deveria ficar a
cada instante dando uma olhada na porta, para ver se tem algum. Este processo, conhecido por varredura,
tambm muito utilizado, dependendo da aplicao ou das limitaes do chip em uso.
Com o uso de interrupes, o seu programa no precisar de rotinas de varredura. Quando um dos
sinais de interrupo externa for ativo, o processador para o programa principal e vai atender a rotina de
interrupo, voltando depois ao ponto onde estava.
1><?@@ e 1><?@@84 Temos 1 pino com capacidade de interrupo externa:
RB0 / NT a chamada interrupo externa
1?<AB?4 Temos 3 pinos com capacidade de interrupo externa:
RB0 / NT0 a chamada interrupo externa 0
RB1 / NT1 a chamada interrupo externa 1
RB2 / NT2 a chamada interrupo externa 2
Cada uma das interrupes pode ser individualmente habilitada ou desabilitada a qualquer
momento, permitindo total flexibilidade do nosso programa.
<+1E+1 G Iun"es para controle das interrup"es e)ternas
Enable_interrupts ( int_ext0 ); // para habilitar
Disable_interrupts (int_ext2 ); // para desabilitar
Ext_int_edge ( 0, L_TO_H ); // para ajustar int0 na subida do sinal
V.15 Timer 0
Em microcontroladores, os timers so de grande utilidade pois podem realizar contagem de eventos
externos ou ainda, usando o clock da mquina como referncia, criar bases de tempo precisas, como por
exemplo, contar de 2 ms em
2 ms.
Tem ainda a capacidade de pedir interrupes ao fim de certos eventos, como, por exemplo no
'overflow' ou estouro de contagem. Temos ento um hardware muito verstil, que alia a contagem de
tempos ou eventos com pedido de interrupes, liberando o nosso programa para realizar outras funes.
O timer 0 tem as seguintes caractersticas comuns as duas famlias (16F e 18F):
Registro de contagem de 8 bits.
Pode ser lido ou alterado a qualquer momento
Divisor de frequncia (prescaler) ajustvel
Sinal interno (pino RA4 livre) ou externo (pino RA4 como entrada)
(Sinal externo o padro aps o reset)
Gera pedido de interrupo no 'overflow'
Sensvel a borda do sinal externo na subida ou descida
1?<AB?4
O registro de contagem pode ser configurado para de 8 bits ou 16 bits
(ajuste realizado por software)
Quando usamos sinal interno o timer 0 incrementa seu valor a cada ciclo de mquina (Tcy), sem
considerar o prescaler.
72
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
O prescaler pode dividir os pulsos de entrada (sinal externo ou interno) por 1 (prescaler
desabilitado), 2, 4, 8, 16, 32, 64, 128 ou 256.
1><?@@ e 1><?@@84
Na linha 16F o prescaler do timer 0 COMPARTLHADO com o Watch Dog (ver tem V.22)
<+1Y+1 G Iun"es para controle do timer [
Setup_timer_0 ( fonte_de_sinal , prescaler );
Set_timer0 ( valor inicial de contagem );
X = get_timer0 ( );
V.16 Timer 1
O timer 1 tem as seguintes caractersticas:
Timer de 16 bits
Pode ser lido ou alterado a qualquer momento
Divisor de frequncia (prescaler) ajustvel
Sinal interno (pino RC0 livre) ou externo (pino RC0 como entrada)
Gera pedido de interrupo no 'overflow'
Sinal externo ativo na borda de subida
Pode usar cristal prprio (at 200 KHz) nos pinos RC0 e RC1
Quando usamos sinal interno o timer 1 incrementa seu valor a cada ciclo de mquina (Tcy), sem
considerar o prescaler.
O prescaler pode dividir os pulsos de entrada (sinal externo ou interno) por 1 (prescaler
desabilitado), 2, 4 ou 8.
Assim como para as interrupes, diferente do assembler, onde o programador deve se preocupar
com o controle e verificao dos bits de controle, disposio do cdigo e outros, quando programamos em
'C' este trabalho no existe.
Toda a organizao de memria, ajuste de hardware e outros automaticamente realizada pelo
compilador C.
V.16.1 Funes para controle do timer 1
Setup_timer_1 ( fonte_de_sinal 'ORed' prescaler );
Set_timer1 ( valor inicial de contagem );
X = get_timer1 ( );
V.17 Timer 2
O timer 2 tem as seguintes caractersticas:
73
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Timer de 8 bits
Registro de comparao de 8 bits
Pode ser lido ou alterado a qualquer momento
Divisores de frequncia (prescaler e postscaler) ajustveis
Somente sinal interno
Gera pedido de interrupo quando a contagem atinge o valor do registro
de comparao, e recomea do 0 neste instante.
Gera a base de tempo do mdulo PWM.
O prescaler pode dividir os pulsos de contagem por 1 , 4 ou 16.
O postscaler pode dividir os pulsos na sada do timer por 1 , 2, 3, 4, 5, .... 14, 15 e 16, aumentando
a base de tempo nos pedidos de interrupo.
A sada do timer 2, ante" do po"t"caler, pode gerar a base de tempo para o mdulo PWM.
Assim como para as interrupes, diferente do assembler, onde o programador deve se preocupar
com o controle e verificao dos bits de controle, disposio do cdigo e outros, quando programamos em
'C' este trabalho no existe.
V.17.1 Funes para controle do timer 2
Setup_timer_2 ( modo_e_prescaler , perodo , postscaler );
Set_timer2 ( valor inicial de contagem );
X = get_timer2 ( );
V.18 Timer 3- Apenas na linha 18F
O timer 3 do pic 18F458 funciona de forma idntica ao timer 1.
A nica diferena esta no fato de que o timer 3 NO tem pinos para entrada de sinal ou para cristal
externo.
Neste caso o timer 3 pode usar a mesma base de tempo externa do timer 1 (pino RC0 ou cristal em
RC0 e RC1) ou rodar de forma autnoma pelo clock interno, Tcy.
Apenas as funes de acesso devem enderear este timer em particular.
V.19 O conversor A/D
Neste tpico estudaremos o conversor de analgico para digital, mais conhecido por conversor A/D
ou apenas A/D.
O objetivo do conversor A/D converter um sinal analgico, em nosso exemplo, de 0 a 5 V, em
equivalentes digitais.
Como o conversor pode ser ajustado para converso de 8 ou 10 bits, vejamos os dois casos:
74
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
A) Converso com resoluo de 8 bits
Neste caso, com 8 bits temos 2
8
= 256 possibilidades, o que da aproximadamente 20 mV por
converso (Vref = 5V). Assim sendo, poderamos fazer a seguinte tabela:
Valor da Entrada Valor Binrio de 8 bits
0,000 V 00000000
0,020 V 00000001
0,040 V 00000010
. .
4,980 V 11111110
5,000 V 11111111
Para usarmos o conversor A/D com resoluo de 8 bits devemos colocar o resultado em uma
varivel de 8 bits.
B) Converso com resoluo de 10 bits
Neste caso, com 10 bits temos 2
10
= 1.024 possibilidades, o que da aproximadamente 5 mV por
converso (Vref = 5V). Assim sendo, poderamos fazer a seguinte tabela:
Valor da Entrada Valor Binrio de 10 bits (usar varivel de 16 bits)
0,000 V 0000000000
0,005 V 0000000001
0,010 V 0000000010
. .
4,995 V 1111111110
5,000 V 1111111111
Para usarmos o conversor A/D com resoluo de 10 bits devemos colocar o resultado em uma
varivel de 16 bits (onde os 6 bits mais significativos sero zerados).
<+1]+1 G Iun"es para controle do conversor analgico*digital
Setup_Adc_Ports ( seleo_dos_pinos_analogicos ); // C6)
Setup_Adc ( modo_de_funcionamento );
Set_Adc_channel ( qual_canal_vai_converter );
X = read_adc ( );
Conforme a resoluo desejada usar uma das diretivas a seguir:
#device adc=8 >>>> para que o compilador ajuste o conversor para
resoluo de 8 bits
#device adc=10 >>>> para que o compilador ajuste o conversor para
resoluo de 10 bits
C6) Consultar o arquivo " .H " do pic utilizado para ver quais as configuraes
possveis para os pinos analgicos.
>UI3% I>4%*3A#3.
Aps o reset o hardware do conversor A/D automaticamente configurado para o modo analgico,
e os pinos que servem para entrada analgica j esto configurados para tal.
Assim sendo, mesmo que no desejemos usar o conversor analgico, devemos configura-lo.
75
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Verifique que em todos os exemplos prticos temos no inicio da funo MAN( ) o comando:
Setup_adc_ports ( 'parametro' )
Onde o "parmetro depende de nossa configurao.
V.20 A comunicao serial Assncrona
Estudaremos aqui qual o princpio de funcionamento da comunicao serial assncrona.
Este tipo de comunicao muito utilizada quando queremos comunicar nosso sistema baseado em
microprocessador com outros equipamentos, mais usualmente um computador tipo PC.
As principais caractersticas desta comunicao so:
- Ligao ponto a ponto;
- Pode ser realizada com apenas 2 fios de sinal e um terra de referncia;
- Com conversores apropriados podemos ampliar o alcance;
- Enviamos e recebemos byte a byte;
- Tratamento simples.
Formato mais usual dos dados (considerando o PC, nvel TTL):
5V
0V
D0 D1 D2 D3 D4 D5 D6 D7
=0, Start Bit =1, Stop Bit
Transmisso:
Para transmitir, o transmissor interno do Pic inicia a comunicao descendo (=0) a linha de dados ,
pino TX, por um tempo dT, depois vai colocando no pino TX, a intervalos "dT, cada um dos bits do byte a
ser enviado, iniciando pelo menos significativo (D0), e depois do bit D7, leva o pino de volta para o nvel 1,
encerrando o envio do byte.
Recepo:
Quando o receptor interno do Pic 'sente' a descida do sinal no pino RX, inicia um processo de
varredura automtica neste pino, e a cada intervalo fixo copia o nvel do pino ( 0 ou 1) para um registro
interno. Aps receber o bit D7, espera o Stop Bit, que deve ser nvel 1. Em caso afirmativo, salva o byte
recebido no registro RCREG e sinaliza um pedido de interrupo.
Tempo de cada bit:
Cada bit ter a durao equivalente a 1 / Taxa de transmisso.
Para uma comunicao em 9.600 bits por segundo, cada bit ter a durao de aproximadamente
104 us.
76
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Conversores de tenso:
Como a maioria dos equipamentos (PC's e outros) usa nveis baseados no padro RS-232,
devemos no caso do pic utilizar um chip conversor de tenso, em nosso caso o Max232 ou equivalente.
Este chip, alimentado apenas com +5V, pode gerar internamente as tenses de +9V e 9V
necessrias para atender esta especificao.
Para mais detalhes ver o esquema do exemplo de comunicao.
Protocolos de troca de dados:
Veremos nos exemplos de recepo e transmisso um exemplo bem simples de comunicao entre
o Pic e um microcomputador PC, com todos os detalhes das rotinas de interrupo e tratamento dos dados.
V.20.1 Funes para controle da comunicao serial
Devemos antes do inicio das rotinas, usar as seguintes definies:
#use delay (.....) para indicarmos a velocidade da cpu
#use Rs232 (......) para indicarmos os pinos, velocidade, ....
e no programa devemos usar estas funes:
x = Getchar ( ); // para ler um dado recebido pelo serial
putchar ( dado) ; // para enviar um dado pelo serial
Maiores detalhes de todas as funes de ajuste sero vistos no captulo V
V.21 Tipos de osciladores
Existem vrias possibilidades para as fontes de clock para o pic:
Com cristal ou ressonador (necessidade de bases de tempo mais precisas):
LP > Cristal de baixa potncia (at 200 KHz)
XT > Cristal ou ressonador normal (at 4.0 MHz)
HS > Cristal de alta velocidade (acima de 4.0 Mhz, at 20 MHz)
1><?@@ e 1><?@@84
> Nos modos acima aceita clock fornecido por fonte externa
1?<AB?4
HS + PLL > Cristal de alta velocidade com PLL para quadruplicar o
clock, que resultar em clock equivalente a 40 MHz
(mximo)
Com 7e"i"tore" e capacitore" #6ara aplica&e" 1!e n%o nece""itam de clocC de preci"%o$
RC > Rede Resistor/Capacitor externa com sada do 'clock/4'
em Osc2
1?<AB?4
77
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
RCO > Rede Resistor/Capacitor externa com mais um pino de
entrada e sada (o pino osc2 Torna-se RA6)
Com clocC eterno
1?<AB?4
EC > Clock Externo com sada do 'clock/4' em Osc2
ECO > Clock externo com mais um pino de entrada e
sada (o pino osc2 Torna-se RA6)
Ciclo de m#uina:
Em todos os nossos exemplos o modo usado ser o HS, com cristal de 10 MHz, e Tcy = 400 ns,
onde Tcy o tempo de cada ciclo de mquina, calculado assim:
E
5cF W 33333333333333333
clocS em Rert/
V.22 O Watch Dog
O watch dog um timer interno que roda livremente, independente do clock do sistema, sem
qualquer componente externo.
Neste caso, continua funcionando mesmo durante o modo Power Down, ou Sleep.
Princpio de funcionamento:
Se o watch dog estiver habilitado, de tempos em tempos o nosso programa dever "dar um clear
no mesmo, caso contrario o watch dog provocar um reset no sistema.
Seu objetivo primrio o de reinicializar o programa em caso de travamento.
Devemos em nosso programa colocar a instruo Restart_Wdt( ) naqueles pontos onde o programa
sempre dever passar em caso de normalidade.
Como o watch dog diferente nas duas famlias, vamos estudar separadamente cada caso:
V.22.1 - O Watch Dog da famlia 16F
MPORTANTE: o Watch Dog da linha 16F compartilha o prescaler com o timer 0, de forma que se o
prescaler estiver DRECONADO para o timer 0, o watch dog NO ter o clock dividido, rodando no seu
tempo nominal, e se o prescaler estiver direcionado para o watch dog, o timer 0 NO TERA DVSO de
freqncia.
Ajuste do Watch Dog:
O watch dog da famlia 16F tem ajuste APENAS nos fusveis, e estes ajustes so:

Ligar:
Quando ligado via fusvel na programao (WDT), SEMPRE ficar ligado, no podendo ser
desligado por software. (acrescentar a seguinte linha de configurao)
7!uses QD5
78
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Desligar:
Quando estiver desligado nos fusveis (NOWDT), ser como se no existisse. (acrescentar a
seguinte linha de configurao)
7!uses 9,QD5
Tempo de reset:
O tempo nominal do watch dog de 18 ms, e podendo ser multiplicado por 1, 2, 4, 8, 16, 32, 64 ou
128, via fusveis (no pode ser alterado pelo programa).
Seu ajuste feito na funo de ajuste do timer 0.
<+$$+1+1 G Iun"es para controle do 'atch dog da linha 1^I
Setup_counter ( ajuste do timer0, ajuste do prescaler)

Restart_wdt ( ); // para zerar o contador e reiniciar a
// contagem
V.22.2 - O Watch Dog do pic 18F458
Ajuste do Watch Dog:
O watch dog da famlia 18F tem ajustes tanto nos fusveis como via programao, e estes ajustes
so: ligado / desligado E ajuste do tempo de reset.
Ligar e Desligar:
Quando ligado via fusvel na programao (WDT), SEMPRE ficar ligado, no podendo ser
desligado por software. (acrescentar na linha #fuses a palavra QD5)
Quando estiver desligado nos fusveis (NOWDT), poder ser ligado ou desligado via software.
(acrescentar na linha #fuses a palavra 9,QD5)
Tempo de reset:
O tempo nominal do watch dog de 18 ms, e pode ser multiplicado por 1, 2, 4, 8, 16, 32, 64 ou
128, via fusveis (no pode ser alterado pelo programa)
Acrescentar na linha #Fuses .... uma das opes abaixo:
QD51 QD5$ QD5E QD5? QD51^ QD5&$ QD5^E QD51$?
<+$$+$+1 G Iun"es para controle do 'atch dog
Setup_wdt ( ligar ou desligar ); // somente no caso da opo NOWDT
Restart_wdt ( ); // para zerar o contador e reiniciar a
// contagem
79
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.23 Brown-out Reset
Este circuito interno permite ajustar o pic para ser "resetado caso a tenso de alimentao caia
abaixo de um determinado valor.
Toda a configurao feita via linha de fusveis e NO pode ser alterada pelo programa durante o
funcionamento do chip.
As palavras de ajuste para os fusveis so:
1><?@@ e 1><?@@84
NOBROWNOUT > No usar o brown-out reset
BROWNOUT > USAR o brown-out reset
Na famlia 16F a tenso de brown out fixa e determinada pelo parmetro <or, tipicamente em 4.0 V .
1?<AB?4
NOBROWNOUT > No usar o brown-out reset (os ajustes de
tenso so ignorados)
BROWNOUT > USAR o brown-out reset (o ajuste de
tenso necessrio)
BORV20 > O reset ocorrer em 2.0 V
BORV27 > O reset ocorrer em 2.7 V
BORV42 > O reset ocorrer em 4.2 V
BORV45 > O reset ocorrer em 4.5 V
V.24 O modo Power-Down, ou 'Sleep'
Este um modo especial de funcionamento no qual o processador para a execuo do programa,
desligando o circuito interno de clock passando para um modo de economia de energia.
Muito til para aplicaes movidas a baterias.
Consumo:
Em modo XT com clock de 4 MHz, o consumo tpico do 18F458 de 1,7 mA
Em modo sleep, o consumo mdio de 2 uA (0,002 mA, ou quase 900 vezes menos)
:mportante: Apenas o chip passa a economizar energia. O restante do circuito permanece ligado.
Todos os perifricos que dependem do clock interno sero desligados (Ver no databook quais
perifricos continuam funcionando durante o sleep)
O processador sair do modo sleep das seguintes maneiras:
1. Reset externo no pino MCLR\
2. Estouro do timer do watch dog
3. Pedido de interrupo de alguns perifricos (Ver no databook quais perifricos podem tirar o pic do
80
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
modo sleep)
No caso de reset pelo pino MCLR\, ou pelo estouro do watch dog, o processador reiniciar o
programa como se fosse ligado naquele momento, pelo inicio da funo main( ).
Para sabermos se o pic iniciou pelo reset ao ligar (normal), pelo reset forado no pino ou pelo watch
dog, usamos funo RESTART_CAUSE( ), cujos retornos possveis so:
WDT_TMEOUT > Ressetou pelo watch dog
MCLR_FROM_SLEEP > Estava em sleep e foi ressetado no pino
NORMAL_POWER_UP > Boot normal ao ligar
BROWNOUT_RESTART > Reset pelo brown-out (Veremos depois)
Se o pic sair do modo sleep devido ao pedido de alguma interrupo (das que podem realizar esta
funo), o processo um tanto diferente:
Apenas as interrupes habilitadas podem tirar o pic do sleep. Se uma interrupo existir em
nosso programa, mas estiver desabilitada ao entrar em sleep, mesmo que seja um perifrico
que no dependa do clock, o pic no sair do sleep;
Caso a habilitao Global no esteja ativada, o pic continuar o programa da instruo seguinte
a que o colocou em sleep;
Caso a habilitao global esteja ativada, o pic executar UMA instruo aps sair do sleep e ir
imediatamente para a interrupo.
Como acionar o modo sleep ?
Usando a instruo SLEEP( );
mportante: Sempre que a instruo SLEEP ( ) for executada, o timer do watch dog ser resetado,
garantindo assim um tempo conhecido caso o watch dog venha a tirar o pic do modo sleep. Equivale a
usarmos a seguinte seqncia:
Restart_Wdt ( );
Sleep ( );
V.25 Power-up Timer
Este circuito interno permite ajustarmos o hardware do reset para 'esperar' um tempo, logo aps a
energizao, para que o pic seja "ressetado, visando garantir que a fonte j esteja estabilizada quando o
pic comear a rodar o programa.
O tempo nominal de espera de 72 ms.
Toda a configurao feita via linha de fusveis e NO pode ser alterada pelo programa, e as
possibilidades so:
PUT > Ligado
NOPUT > Desligado
V.26 Oscilator Start-up Timer
Este circuito interno acrescenta, aps o tempo do power-up timer (se este estiver habilitado) um
delay fixo de 1.024 Tcy, com o objetivo de garantir a estabilizao do cristal.
81
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Este modo automtico para os seguintes modos de oscilao:
XT - LP - HS - HS+PLL (apenas 18F458)
V.27 Mdulo MSSP como SP
A comunicao SP faz parte do mdulo chamado de Master Syncronous Serial Port (MSSP), que
pode funcionar no modo SP ou
2
C (nunca nos dois modos simultaneamente).
Sua principal aplicao a comunicao entre perifricos ou entre microcontroladores entre si.
Na comunicao SP usamos 3 linhas de comunicao, a saber:
Serial Data Out, ou apenas SDO, no pino RC5
Serial Data n, ou SD, no pino RC4
Serial Clock, ou SCK, no pino RC3
Dependendo do perifrico podemos usar um outro pino qualquer do pic como seletor ou CS (Chip
Selector).
A comunicao feita de 8 em 8 bits de forma sncrona, isto , usa o sinal de CLOCK para
sincronizar toda a comunicao.
Veremos depois dois exemplos completos com um potencimetro digital da Microchip, MCP 41010,
o primeiro usando o mdulo SP interno ao pic e o segundo com funes escritas especialmente para esta
finalidade, que neste caso permitem o uso de qualquer pino do pic (til para o caso do pic no ter modulo
SP ou do mesmo j estar sendo usado em
2
C).
As funes para usar o MSSP no modo SP so:
Setup_Spi ( ) Spi_Read ( ) Spi_Write ( )
V.28 Mdulo MSSP como
2
C
A comunicao
2
C, como vimos no item anterior, faz parte do mdulo chamado de Master
Syncronous Serial Port (MSSP), que pode funcionar no modo SP ou
2
C (nunca nos dois modos
simultaneamente).
Sua principal aplicao tambm a comunicao entre perifricos ou entre microcontroladores
entre si.
Na comunicao
2
C usamos 2 linhas de comunicao, a saber:
Serial Data, ou SDA, no pino RC4 (Os dados entram e saem pelo mesmo pino)
Serial Clock, ou SCL, no pino RC3
Os dispositivos
2
C costumam ter internamente endereos base pr-configurados, e pinos para
seleo binria de endereos individuais.
Por exemplo, um dispositivo pode ter endereos-base 0xA0 e 0xA1, e mais dois pinos de seleo, o
que daria 4 opes (2
2
= 4 combinaes).
Assim sendo, os endereos possveis seriam:
0xA0 e 0xA1 - 0xA2 e 0xA3
0xA4 e 0xA5 - 0xA6 e 0xA7
82
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.29 Mdulo CCP como 'Capture Mode'
Temos um bloco de captura, CCP1.
No modo Capture, o valor de 16 bits do Timer 1 (ou do Timer 3) ser "capturado, isto , copiado em
um registro especial, chamado CCP_1 e j declarado no arquivo .H do pic, na ocorrncia de um dos
seguintes eventos:
A cada pulso de descida no pino RC2/CCP1
A cada pulso de subida no pino RC2/CCP1
A cada 4 pulsos de subida no pino RC2/CCP1
A cada 16 pulsos de subida no pino RC2/CCP1
Sua principal aplicao a medida do tempo entre dois eventos (ou a freqncia). Devido a ser
totalmente configurado por software, ele pode ter seu modo de funcionamento alterado a qualquer momento
conforme nossa necessidade.
Vrios exemplos podem ser vistos no documento: "Pic Micro CCP and ECCP Tips 'n Tricks e em
vrios outros documentos no site www.microchip.com
V.30 Mdulo CCP em 'Compare mode'
Neste modo, o valor de 16 bits escrito por nosso programa em um registro especial, chamado
CCP_1 e j declarado no arquivo .H do pic, ser constantemente comparado, pelo prprio hardware interno,
ao valor do Timer 1 (ou do Timer 3).
Assim que ficarem iguais, um dos eventos abaixo poder ocorrer no pino RC2/CCP1:
r ao nvel 1
r ao nvel 0
Ficar inalterado
Ter seu nvel invertido
Sua principal aplicao esta na gerao de uma base de tempo repetitiva, com o mnimo de
interveno do usurio, podendo ainda acionar ou no o pino RC2/CCP1.
V.31 Mdulo CCP em 'Pwm Mode'
No modo PWM, o pino CCP1 produzir uma onda quadrada com at 1024 divises entre ciclos
( resoluo interna de at 10 bits).
Um sinal PWM tem um "perodo de repetio (constante) e um tempo (varivel) em que a sada
fica em nvel lgico 1, chamado de "duty cycle.
83
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Duty-cycle
(0 100%
do perodo)

Perodo
(Sempre igual)
(com at 1024 divises)
Sua principal aplicao esta no controle de potencias, como, por exemplo, acionar uma lmpada ou
uma outra carga com energia varivel de 0 a 100%, e ainda no controle de velocidade de motores DC.
Pode ainda ser usado para gerar sinais analgicos ou at mesmo sinais de udio, com o auxlio de
filtros externos.
Vrios exemplos podem ser vistos no documento:"Pic Micro CCP and ECCP Tips 'n Tricks e em
vrios outros documentos no site www.microchip.com
Veja a seo "Dicas de PC" no site http://www.newtoncbraga.com.br/index.php/dicas-de-pic
V.31.1 Funes para controle para o mdulo CCP
setup_ccpX ( )
set_pwmX_duty ( )
setup_power_pwm ( )
setup_power_pwm_pins ( )
set_power_pwmx_duty ( )
set_power_pwm_override ( )
V.32 Low voltage Detector (LVD)-
Apenas na linha 7='
No brown-out detector temos um hardware interno que ressetava (e mantinha ressetado) o
processador, caso a tenso de alimentao estivesse abaixo de um dos 4 nveis programados.
Neste caso, o LVD no resseta o processador. Este circuito fica monitorando a tenso de
alimentao e comparando com nveis pr-determinados (ou uma tenso qualquer externa, atravs do pino
RA5/LDEM) e quando estiver abaixo do valor programado, aciona um pedido de interrupo. Desta forma o
programa pode ser desviado para uma rotina de tratamento adequada.
Como exemplo, podemos imaginar um circuito alimentado a bateria, que ao atingir um nvel de
tenso ligeiramente superior ao mnimo necessrio para o funcionamento, realizar alguma funo como,
por exemplo, desligar motores, acionar alarmes, salvar dados na EEPROM interna, entre outros, antes da
bateria atingir um nvel crtico no operacional.
A ativao ou no da funo, e os ajustes de tenso so totalmente controlados por software, pela
funo "setup_low_volt_detect ( )
Exemplo 1: Para acionar quando a tenso for menor que a tenso no pino LVDN, usar:
setup_low_volt_detect ( LVD_LVDN );
Exemplo 2: Para acionar quando a tenso for menor que 3,6V, usar:
setup_low_volt_detect ( LVD_36 );
para outros nveis de deteco, ver o arquivo 1?IEY?+R
84
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.33 Comparador analgico (linha 16F87xA e 18F458)
O mdulo comparador composto de 2 comparadores de tenso analgicos, configurveis via
software.
As entradas do comparador so multiplexadas com os pinos de /O (entrada e sada) a saber:
7?'=@@A 4
Neste caso temos uma observao especial. Na linha16F, o pic 16F877 comum NO TEM
comparadores internos, apenas o 1^I?ZZA.
RA0/Vin-1 e RA3/Vin+1 para o comparador 1 e com os pinos RA1/Vin-2 e RA2/Vin+2 para o
comparador 2, e as sadas C1Out e C2Out podem ser direcionadas para os pinos RA4 e RA5
respectivamente ou apenas internamente, via bits de sinalizao (os comparadores podem ainda pedir
interrupo se ajustados para tal).
7='AB= - Ce 1?IEE? ___ ou se-a= apenas nos modelos de E[ pinos) 4
RD0/Vin+1 e RD1/Vin-1 para o comparador 1 e com os pinos RD2/Vin+2 e RD3/Vin-2, e as sadas
C1Out e C2Out podem ser direcionadas para os pinos RE1 e RE2 respectivamente ou apenas
internamente, via bits de sinalizao (os comparadores podem ainda pedir interrupo se ajustados para
tal).
Configurao dos comparadores:
+
Vin+1
C1out
-
Vin-1
+
Vin+2
C2out
-
Vin-2
>UI3% I>4%*3A#3.
Aps o reset, o hardware do comparador automaticamente configurado para o modo analgico, e
os pinos que servem para entrada dos comparadores j esto configurados para tal.
Assim sendo, mesmo que no desejemos usar o comparador analgico, devemos configura-lo.
Verifique que em todos os exemplos prticos temos no inicio da funo MAN( ) o comando:
Setup_Comparators ( 'parametro' )
Onde o "parmetro depende de nossa configurao.
Princpio de funcionamento:
Sempre que a tenso do pino Vn+ for superior a tenso do pino Vn- (este ajuste pode ser invertido
por software), a sada estar em nvel 1, caso contrario estar em nvel 0 (este ajuste tambm pode ser
invertido por software).
85
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Entradas Vin+ e Vin-

Vin- (referncia)
Vin+


Tempo
sada
5V

0

Tempo

V.33.1 - Funes para controle do comparador:
Setup_comparator ( ajuste ) ;
onde "ajuste pode ter vrias opes, como:
NC_NC_NC_NC - para desligar o comparador
(devemos fazer este ajuste se
no formos usar os comparadores)
D1_D0_NC_NC_OUT_ON_E1 - Apenas o comparador 1 ligado,
com a sada no pino RE1
Para ver todas as opes possveis consulte o databook do pic em questo e seu arquivo +R
V.34 nterfaces CAN, USB, ETHERNET,....-
Apenas na linha 7='
A interfaces especiais esto presentes em vrios modelos da linha 18F
Devido a grande complexidade tcnica e a necessidade de outros pr-requisitos para seu
entendimento, no estudaremos estas interface neste material.
Para visitar o site da microchip especifico sobre alguma interface, basta acessar a pgina inicial e
aps a '/' colocar o perifrico desejado
Exemplo: '''+microchip+com*8S(
86
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V - A linguagem C e os PC's
V - A linguagem C e os PC's
Veremos nesta parte como escrever programas em C para os PC's, acessando registros, portas e
memria, alm de estudar algumas funes criadas pela CCS para facilitar o trabalho do desenvolvedor de
sistemas.
No vamos estudar todas as funes criadas, apenas as mais usadas, de forma a permitir ao
estudante aprofundar-se com facilidade posterior quando do uso do software completo e sem limitaes.
Para este estudo usaremos uma verso de demonstrao do compilador PCW, funcional por 30
dias.
Nota importante: para manter compati'ilidade com chip" e !"!rio" mai" anti+o" da linha 63C: em al+!ma"
-!n&e" o T35/7 D E chamado pelo "e! nome anti+o: 7TCC.
V.1 - Diretivas de compilao
Ver item .3 para teoria sobre as diretivas de compilao.
V.1.1 - #asm #endasm
Permite a incluso de trechos em assembler dentro do programa em C.
Muito cuidado deve ser tomado com o uso esta diretiva, pois toda ao gerada em assembler de
inteira responsabilidade do usurio, e pode vir a prejudicar outras variveis ou posies de RAM usadas
pelo compilador.
Exemplo:
.
x = a;
#asm
bsf PORTB,3 // estas duas instrues geram um pulso
bcf PORTB,3 // no pino RB3.
#endasm
x += 5;
.
:.P,45A952: Observe que embora seja um trecho em assembler o comentrio esta no formato da
linguagem C.
V.1.2 - #case
ndica para o compilador ser "sensitivo a diferenas entre letras maisculas e minsculas.
Embora a linguagem C de forma padro seja sensvel ao tipo de letra, sem esta diretiva, o
compilador ignora as diferenas.
Exemplo: com o #case
Te"te, te"te e T/ST/ so variveis diferentes
Exemplo: sem o #case
Te"te, te"te e T/ST/ so a mesma varivel
87
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.1.3 - #define 'nome' 'seqncia'
Permite a substituio, no momento da compilao, do FnomeG pela cadeia de caracteres (string)
definida em F"e1HIncia'.
Exemplo:
#define largura 4
portb = largura; // ser visto pelo compilador como portb = 4
largura = 5; // ERRO. No uma varivel.
Sua principal vantagem esta em no precisarmos trocar constantes em todo o programa, bastando
alterar na definio, ou ainda para facilitar a escrita de funes mais complexas.
Outras aplicaes sero vistas nos exemplos.
V.1.4 - #include Jar1!ivo>
O arquivo indicado ser adicionado ao fonte no 'momento da compilao'.
deal para incluir trechos pr-definidos, evitando sua digitao a cada programa novo.
Exemplo tpico o arquivo 16F877A.H que contm as definies sobre o processador usado.
Exemplo: #include < 16F877a.H >
V.1.5 - #fuses Gop&e"G
Avisa ao compilador para incluir no arquivo .HEX informaes sobre os fusveis de configurao,
facilitando na hora de se gravar o chip.
Algumas opes so:
Oscilador: XT (cristal at 4 MHz), LP (cristal baixa potncia),
HS (cristal alta velocidade), RC (oscilador RC), ...
WatchDog: WDT (ligado) e NOWDT (desligado)
Cdigo: PROTECT (protegido) e NOPROTECT (no protegido)
Power-up: PUT (Com power-up) e NOPUT (Sem power-up)
Ajuste usado nos exemplos com o 18F458
#fuses HS, noWRTD, noWRTB, CPD, noCPB, noWRT, noWRTC, noEBTR
#fuses NOOSCSEN, noSTVREN, NOLVP, PROTECT, noWDT, WDT128
#fuses noBROWNOUT, BORV27, PUT, nodebug, noEBTRB
Veja nos arquivos .H quais os fusveis suportados pelo modelo de PC que estiver usando.
V.1.6 - #ifdef #endif
Usado para "compilao condicional, isto , permite selecionar se o trecho entre as duas diretivas
ser includo no momento da compilao ou no.
Exemplo:
#define EmModoreal
.
#ifdef EmModoreal
88
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
delay_ms(200);
#endif
No exemplo, caso o #define EmModoreal tenha sido declarado, a chamada para a rotina de tempo
ser includa no programa final. Caso contrario no ser includa.
Neste caso poderia servir para tirarmos o atraso durante os testes no simulador, sem termos de
ficar apagando vrias linhas.
V.1.7 - #NT_#### , onde #### indica o nome da rotina
ndica para o compilador que o trecho a seguir refere-se a uma rotina de interrupo.
O compilador gerar um cdigo padro para entrar e sair da rotina, salvando o estado da mquina e
zerando o flag de requisio de interrupo ao sair da mesma.
mportante: Para manter compatibilidade com a linha 16XXXX, apenas uma interrupo poder ser
atendida de cada vez. Para permitir que uma interrupo possa ser interrompida por outra mais importante,
ver o parmetro HGH abaixo.
Algumas das interrupes reconhecidas so:
NT_EXT (RB0/nt0)
NT_EXT1 (RB1/nt1)
NT_TMER0 (overflow do timer 0)
Para uma lista completa do nome das diretivas de interrupo das vrias dezenas de chips
existentes, consultar o manual da CCS e o arquivo .H do chip utilizado.
O nome da rotina definido pelo seu programa.
Exemplo:
#NT_EXT // indica que a rotina a seguir a da interrupo. externa
void SincronismoDeRede( )
{
.....
}
V.1.7.1 Declarando interrupes de alta prioridade Apenas na linha 7='
Se na declarao da rotina usarmos a palavra HGH a rotina ser de alta prioridade e poder
interromper outra interrupo j em andamento.
Ex:
#NT_timer0 R:;R
void Relgio()
{
// rotinas da interrupo do timer 0
}
V.1.8 - #Priority Prioridades por software
Permite ao programador escolher a prioridade no atendimento das interrupes habilitadas. A
primeira da lista a mais prioritria (para as que no usam o parmetro HGH visto acima).
89
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Exemplo:
#priority timer0, ext // Timer 0 mais prioritria que a interrupo externa.
V.1.9 - #ROM
Permite a gravao de constantes na memria de programa ou na EEPROM de dados interna no
momento da compilao.
No influencia no programa, apenas informa ao gravador para gravar os valores no endereo
indicado.
Exemplo:
Determinando os 10 primeiros bytes da eeprom de dados (inicio em F00000H na linha 18F):
#ROM int8 0xF00000 = { 0,1,2,3,4,5,6,7,8,9 }
V.1.10 - #use delay (clock= Fvalor do clocC em KzG)
nforma ao compilador o valor do clock da CPU em Hertz. Serve para permitir o uso de funes de
tempo baseadas no clock da mquina.
Caso o watch dog seja usado, devemos informar por esta diretiva, para que o mesmo seja resetado
nas rotinas de tempo.
Exemplos:
1) Sem o watch dog: #use delay(clock=4000000)
2) Com o watch dog: #use delay(clock=10000000, Restart_Wdt)
V.1.11 - #use Fast_O( port )
nforma ao compilador que o controle da direo dos ports (registro TRS do port indicado) ser
executado pelo programa. Gera operaes de entrada e sada mais rpidas.
Exemplo:
#use fast_io(A) // quem deve controlar o trisa o programa.
Neste caso devemos controlar os registros TRS manualmente (ver item V.2.7, nmero 8)
V.1.12 - #use standard_O( port ) - Le-a!lt
A cada acesso as portas ou pinos de /O o compilador gerar cdigo para o controle do tris
correspondente.
Permite maior flexibilidade nos casos de bits com dupla funo ou usurios com pouca experincia,
mas consome um pouco mais de tempo (alguns micro ou nanosegundos) e memria de programa.
O DEAL PARA QUEM EST NCANDO.
90
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.1.13 - #use rs232 (BAUD = taa, XMT = pinoT, RCV = pino7, BTS
= n )
Ajusta os pinos indicados como pino4L e pino5L para funcionarem como entrada e sada serial
com velocidade indicada em ta)a, e com palavra de n bits.
O compilador tem incorporado rotinas que permitem a transmisso e recepo no formato
assncrono tpico da comunicao serial.
Para o uso destas rotinas a diretiva acima deve ser utilizada.
#os 4ICCs com USA*3 interna, se os pinos indicados forem os pinos da USA*3 o softDare
usara o ,ardDare interno.
Embora o nome da diretiva nos de a sugesto de usar RS232, devemos lembrar que os sinais do
PC so de nvel TTL.
mportante: antes do uso desta diretiva o #use delay obrigatrio.
Exemplo:
Recebe pelo pino RB7 e depois envia o mesmo byte, com clock de 4 MHz, pelo pino RA4 a 9600
bps e palavra de 8 bits:
#use delay (clock=4000000)
#use rs232 (BAUD = 9600, XMT = pin_A4, RCV = pin_B7, BTS = 8 )
X = getchar ( ); // fica esperando um byte chegar pelo serial
// e ento escreve na varivel X
putchar ( X ); // e depois envia o mesmo de volta.
Observao: os nomes de pinos e outras constantes sero vistos ao final e esto no arquivo .H
correspondente ao chip utilizado.
V.1.14 - #byte nome = endereo do byte
#bit nome = endereo do byte . nmero do bit
Permite o acesso a posies de RAM (Registros e memria geral) pela indicao de seu endereo
real (lembre-se de que o gerenciamento das variveis em C j realizado pelo compilador).
Exemplo: Sabemos que o port D esta no endereo F83H da memria RAM (ver o databook do
18F458), e se desejarmos acessar o port D como se fosse uma varivel devemos usar:
#byte portd = 0xF83 (veja o anexo sistemas de numerao)
Vale o mesmo para variveis representando bits:
#bit RD0 = portd.0 // RD0 agora uma varivel em C
mportante: Para tal devemos usar o sistema de acesso fast_io( )
V.2 - Funes escritas para os PC's
Neste item veremos algumas das funes escritas especialmente para a famlia PC. Uma descrio
completa de todas as funes pode ser encontrada no manual do usurio da CCS.
91
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.2.1 - Funes matemticas
Para o uso de funes matemticas especiais, como raiz quadrada, seno, exponencial, entre outras,
obrigatrio incluir a biblioteca math.h (seja curioso e de uma olhada nesta biblioteca), da seguinte forma:
#include < math.h >
V.2.2 - Funes de manipulao de bit
1) it3clear Cvarivel = it )
Zera o 'it indicado na varivel indicada. Como podemos ter variveis de 8, 16 ou 32 bits, o nmero
do bit pode ir de 0~7 ou de 0~15 ou de 0~31.
Exemplo:
int8 x;
x = 0b10001000
bit_clear(x,7); // x = 00001000
$) it3set Cvarivel = it )
Seta o 'it indicado na varivel indicada. Como podemos ter variveis de 8, 16 ou 32 bits, o nmero
do bit pode ir de 0~7 ou de 0~15 ou de 0~31.
Exemplo:
int8 x;
x = 0b10001000
bit_set(x,0); // x = 10001001
&) it3test Cvarivel = it )
Efetua um teste no 'it indicado na varivel indicada. Como podemos ter variveis de 8, 16 ou 32
bits, o nmero do bit pode ir de 0~7 ou de 0~15 ou de 0~31.
Se o bit estiver em '1' a funo retorna um verdadeiro #tr!e$ e caso contrrio retorna -al"o #-al"e$.
Para o caso de desejamos testar se est em '0' basta usarmos um ` (NOT lgico) antes do teste.
Exemplo:
if ( bit_test(x,1) || ! bit_test(x,0) ) // Se o bit 1 de x for 1
{ // ,8 ( || )
...... // o bit 0 de x for [
} // executa o bloco.
E) ,utput3RighC pino ) -- ,utput 3@o'C pino ) -- ,utput35oggle C pino)
Servem para setar , zerar e para inverter o estado de pinos de /O.
Y) it W inputC pino )
L o estado do pino indicado e escreve na varivel indicada.
Exemplo: espera o pino RB0 ir de 0 para 1.
while ( ! input (pin_b0) ); // realiza bit test . o teste deal.
ou
92
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
while ( pin_b0 == 0); // realiza teste lgico em byte. Evitar ! !
Observao: os nomes de pinos e outras constantes sero vistos ao final e esto no arquivo .H
correspondente ao chip utilizado.
V.2.3 - Funes de tempo
1) DelaF3cFcles C ) )
Gera um delay equivalente a ' x ' ciclo" de in"tr!%o.
Exemplo: delay_cycles (1); // equivale a 1 nop
delay_cycles (4); // equivale a 4 nop's
$) DelaF3.s C ) )
Gera um delay de ' x ' milissegundos.
O programa deve conter a diretiva "#use delay(...)" antes de se usar esta funo.
Exemplo:
A seqncia abaixo gera um pulso no pino RB2 com 10 ms (aproximadamente).
output_high (pin_b2); // RB2 = 1
delay_ms (10); // espera 10 ms
output_low (pin_b2); // RB2 = 0
&) DelaF38s C ) )
Gera um delay de ' x ' microssegundos.
O programa deve conter a diretiva "#use delay(...)" antes de se usar esta funo.
V.2.4 - Funes para interrupes
1) enale3interrupts C tipo )
Permite habilitar interrupes individualmente ou globalmente. Quando habilitando globalmente
apenas o bit de mascaramento geral ser afetado, e no as habilitaes individuais.
Alguns tipo" so os seguintes:
global (GE), int_ext (RB0), int_timer0,
Exemplo: habilitando a interrupo do timer 0 e do A/D
enable_interrupts (int_timer0);
enable_interrupts (int_ad);
enable_interrupts (global);
$) disale3interrupts C tipo )
Funciona de forma semelhante ao "enable_interrupts ( ), desabilitando individualmente ou
globalmente as interrupes.
93
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
&) e)t3int3edge C #ual= modo )
A varivel 1!al indica qual das 3 interrupes externas estamos ajustando. Os valores podem ser 0
(int0), 1 (int1) ou 2 (int2).
A varivel modo indica se a interrupo externa indicada ser reconhecida quando ocorrer a
descida do sinal ( modo = H_TO_L ) ou na subida do sinal
( modo = L_TO_H ).
Exemplo: reconhece interrupo externa 1 na subida.
ext_int_edge ( 1, L_TO_H);
E) Clear3interrupt C 5ipo )
Permite "zerar o pedido de uma interrupo pendente. til para os casos em que no precisaremos
mais atender a uma certa interrupo, mas a mesma j esta a espera do atendimento.
V.2.5 - Funes para o canal A/D
1) read3adcC )
L o canal analgico do chip.
MPORTANTE: Como podemos ajustar a resoluo em 8 ou 10 bits, devemos fazer com que o resultado
seja direcionado para a varivel de tamanho adequado.
Antes de usar esta funo devemos usar "setup_adc( ), "set_adc_channel( ) e setup_adc_ports( ).
Exemplo:
Temperatura = read_adc( ); // l o canal j selecionado e
// escreve na varivel
$) setup3adc C modo )
Ajusta o conversor A/D. Alguns dos modos possveis so:
adc_off, adc_clock_div_2, adc_clock_div_8,
adc_clock_div_32, adc_clock_div_64, adc_clock_div_internal
Para saber qual o melhor ajuste, consultar o databook do modelo utilizado para ver os detalhes de
'tempo de converso X clock'.
&) set3adc3channel C canal )
Especifica qual o canal que ser lido pela funo read_adc( ).
E) setup3adc3ports C a-uste ) ,8 setup3port3A C a-uste )
Ajusta os pinos para serem entradas analgicas ou no. Seu ajuste depende de cada chip em
particular, devendo o programador cuidar para no escolher um ajuste errado para um certo modelo
(consultar o arquivo .H correspondente).
94
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Veja alguns ajustes para o 18F458
NO_ANALOGS Todos os pinos analgicos desligados
ALL_ANALOG Todos os pinos analgicos ligados
AN0 Apenas o pino RA0 analgico
Exemplo: Lendo o canal 0:
setup_port_a( AN0 );
setup_adc( ADC_CLOCK_NTERNAL );
set_adc_channel( 0 );
value = Read_ADC( );
V.2.6 - Funes para EEPROM de dados interna
1) 4ead32eprom C endereo )
L o dado presente na posio endereo da EEPROM interna.
O limite para o endereo depende do modelo (de 0 a 255 no 18F458).
Exemplo: Posio_0 = read_eeprom(0);
$) Qrite32eprom C endereo = valor )
Escreve no endereo da EEPROM interna o valor indicado.
mportante: Esta instruo leva em mdia 4 ms para ser finalizada.
(Lembre-se que para a CPU rodando a 10 MHz internamente, o Tcy ser de 100 ns, o que implica
que a escrita na EEPROM leva em media o equivalente a 40.000 Tcy)
V.2.7 - Funes do Timer 0 (So similares para os demais timers)
1) get3timer[ C )
L o valor atual do registro TMR0.
Exemplos:
if ( get_timer0 ( ) == 0 ) { ..... } // executa o bloco se TMR0 = 0
Valor_do_timer = get_timer0 ( ); // copia TMR0 para a varivel
>>>>> Funciona de forma idntica para os timers 1, 2 e 3
$) set3timer[ C valor )
Ajusta o valor do registro TMR0.
Lembre-se que sempre que escrevemos no registro TMR0 a contagem fica suspensa por dois ciclos
de mquina.
Exemplo: Se o registro TMR0 for maior que 100 zera o registro.
if ( get_timer0( ) > 100 )
set_timer0( 0 );
95
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
&) setup3timer3[ C .odo a prescaler a 5amanho )M
Ajusta o modo de funcionamento do timer 0, se 8 ou 16 bits e a diviso do prescaler.
Modos para ajuste do timer 0:
rtcc_internal --> timer 0 clock interno
rtcc_ext_h_to_l --> timer 0 clock externo, transio de 1 para 0
rtcc_ext_l_to_h --> timer 0 clock externo, transio de 0 para 1
Tamanhos da contagem do timer 0 (se no indicar, ser de 16 bits):
RTCC_8_BT --> timer 0 de 8 bits, similar a famlia 16F
Constantes para ajustes do prescaler:
rtcc_div_1 --> Sem prescaler para o timer 0
rtcc_div_2 --> Prescaler para o timer 0, dividindo por 2
rtcc_div_4 --> Prescaler para o timer 0, dividindo por 4
rtcc_div_8 --> Prescaler para o timer 0, dividindo por 8
rtcc_div_16 --> Prescaler para o timer 0, dividindo por 16
rtcc_div_32 --> Prescaler para o timer 0, dividindo por 32
rtcc_div_64 --> Prescaler para o timer 0, dividindo por 64
rtcc_div_128 --> Prescaler para o timer 0, dividindo por 128
rtcc_div_256 --> Prescaler para o timer 0, dividindo por 256
Exemplo 1: Ajustando o timer 0 modo interno em 1:4, 8 bits
setup_timer_0(RTCC_NTERNAL | RTCC_8_BT | rtcc_div_4);
Exemplo 2: Ajustando o timer 0 modo externo, na descida do sinal, prescaler em 1:16, contagem 16
bits
setup3timer3[Crtcc3e)t3h3to3l rtcc3div31^)M
V.2.8 - Funes do canal de comunicao serial
1) getcC )= getchC ) ,8 getcharC ) C 6 )
So a mesma funo. Entra numa rotina para esperar a chegada de um caractere pelo pino RCV
definido na diretiva #use RS232.
Exemplo: espera a chegada do caractere 'A' :
=hile # +etchar# $ !M F8G $N
$) putcC valor ) ,8 putcharC valor ) C 6 )
So a mesma funo. Envia (valor serialmente pelo pino XMT definido na diretiva #use RS232.
Exemplo: Enviar a palavra 'OLA' pelo serial.
putchar ( 'O' ); OU putchar ( "ola);
putchar ( 'L' );
putchar ( 'A' );
C 6 ) ,servao: Estas funes somente usaro o canal serial de hardware presente em alguns modelos
se os pinos XMT e RCV forem os pinos da USART interna. Caso contrrio, sero usadas funes de
software escritas para este fim. Neste caso devemos levar em conta que embora ocupem apenas uma linha
de cdigo em C, podem ocupar bastante memria e demorar vrios milissegundos para serem executadas.
96
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.2.9 - Funes de uso geral
1) port33pullups C opo )
Controla os pull-ups da porta B ( apenas para os bits ajustados entrada).
Temos como op%o TRUE, ligando os pull-ups ( RBPU\ = 0) e FALSE, desligando os pull-ups
( RBPU\ = 1 ).
$) restart3'dtC )
Reseta o watch dog.
&) SleepC )
Coloca o processador no modo de economia de energia.
E) set3tris3A C a-uste ) ---_ b origatrio o uso da diretiva 7!ast3ioCA)
set3tris3( C a-uste ) ---_ b origatrio o uso da diretiva 7!ast3ioC()
set3tris3C C a-uste ) ---_ b origatrio o uso da diretiva 7!ast3ioCC)
set3tris3D C a-uste ) ---_ b origatrio o uso da diretiva 7!ast3ioCD)
set3tris32 C a-uste ) ---_ b origatrio o uso da diretiva 7!ast3ioC2)
Ajusta o registro TRS indicado. Deve ser usado sempre que as diretivas #fast_io ( port ), #byte ou
#bit forem utilizadas, pois estas determinam nosso controle sobre os ports.
Exemplo: Ajustando bits do portd todos para sada
set_tris_d ( 0 );
Ajustando os bits 0, 1 e 4 do portA parasada
set_tris_A ( 0b11101100 );
Y) ,utput3L Cvalor de ? its)M
Escreve o valor de 8 bits nos pinos do port X indicado.
Diferente da funo output_high( ) e output_low( ), que escrevem em apenas 1 bit, esta funo
permite escrever em todos os bits do port indicado de uma s vez.
Aconselha-se usar estas funes em standard_io() somente se TODOS os pinos do port forem
sada, pois em standard_io() os pinos sero ajustados para serem TODOS pinos de sada antes da real
escrita no port.
^) valor? W :nput3L C):
L o valor dos pinos do port X indicado e armazena na varivel valor8.
Aconselha-se usar estas funes em standard_io() somente se TODOS os pinos do port forem
entrada, pois em standard_io() os pinos sero ajustados para serem TODOS pinos de entrada antes da
real leitura no port.
97
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V - Os arquivos de definies dos PCs
V - Os arquivos de definies dos PCs
Os arquivos de definies dos pics, mais conhecidos como HEADER FLES, so os arquivos com
terminao .H
Estes arquivos servem para indicar ao compilador o nome das variveis, dos fusveis, das funes,
entre outros.
Voc deve sempre consultar o arquivo de definies do pic que estiver usando.
E nosso caso os arquivos relevantes so os seguintes:
- 16F877.H
- 16F877A.H
- 18F452.H
- 18F458.H
Se voc usou o caminho padro de instalao dos programas, estes arquivos estaro na pasta
C: E arquivos de programas E picc E devices
98
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V Exemplos prticos dos principais
V Exemplos prticos dos principais

perifricos estudados no cap V
perifricos estudados no cap V
V.1 ntroduo
Neste captulo veremos vrios exemplos com o pic 18F458. Cada exemplo ser apresentado com
uma breve introduo terica sobre o mesmo, e para acompanhamento o leitor deve usar o Mplab abrindo
o projeto (arquivo .MCP) na pasta correspondente ao exemplo.
Todos os programas exemplo esto prontos para serem usados, no link abaixo, e em cada exemplo
estar indicado o local do mesmo, no formato
cap8\...... http://www.newtoncbraga.com.br/livros/cap8.zip
onde cada capitulo tem sua pasta de arquivos (no exemplo acima, capitulo 9), e cada exemplo esta em
uma pasta separada.
V.2 Usando displays de cristal liquido como auxilio de
aprendi/ado
Para permitir fcil visualizao dos resultados de vrios exemplos, usaremos como dispositivo de
sada um display de cristal liquido com 2 linhas de 16 caracteres cada, bem usual no mercado, mais
conhecido como LCD 16X2.
Veremos neste item seu principio bsico de funcionamento e as rotinas usadas para ajustes e
acesso ao display.
V.2.1 - O display LCD 16X2
Os displays LCD so divididos em 2 tipos: Displays inteligentes e displays bsicos.
Nos displays bsicos devemos gerar todos os sinais de controle para acesso a cada ponto ou
segmento.
J nos displays inteligentes, cada unidade possui um chip dedicado apenas para permitir o acesso
ao mesmo. Neste caso basta que nosso programa acesse o controlador do display para escrever
caracteres, mudar o cursor de lugar, apagar, etc...
4otinas prontas para o @CD
Temos 1 arquivo extra neste programa: @cd3@i3D+c
Este arquivo devera ser anexado ao nosso programa imediatamente antes do mainC ) com a
diretiva #include, a saber:
7include cDapostilaP:CrevEDliDlcd3li3D+c_
MPORTANTE: Estas rotinas esto escritas para acesso ao displays pelo port D, Bits 2 a 7
No esquea de fazer o ajuste
set_tris_D(0b00000011);
caso esteja usando o Fast_io(D);
Sobre as bibliotecas:
99
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Damos o nome de "bibliotecas (do ingls Library) para funes prontas e que geralmente so
acrescentadas ao nosso programa, evitando que tenhamos de redigitar trechos de cdigo j testados.
Em nosso caso, para todas as experincias que usaro o display LCD, vamos apenas acrescentar
a biblioteca LCD_LB_D.C e chamar as funes da mesma.
Iun"es escritas para o @CD
Temos as seguintes funes prontas para o LCD:
1$ void LCLO3N3T#void$N
Funo obrigatria antes de se usar qualquer outra. nicializa o LCD para uso em 4 bits, cursor
deslocando a direita.
2$ void LCL/nviaBPte#void$N
Envia para o LCD um byte dividido em 2 pacotes de 4 bits. Antes devemos indicar se o byte de
dado ou de comando.
Q$ void LCLClear#void$N
Limpa todos os caracteres do display.
A$ void C!r"or #int? linha:col!na$N
Posiciona o cursor para o prximo caractere na linha e coluna indicadas, onde LNHA pode ser 1 ou
2, e COLUNA de 1 16.
B$ void 8pa+arLCL#void$N
Desliga apenas o cristal, mantendo os caracteres na memria do LCD
>$ void 8cenderLCL#void$N
Religa o cristal, reapresentando os caracteres na memria do LCD.
@$ void C!r"or8pa+ado#void$N
No mostra o cursor no display.
?$ void C!r"or6i"cando#void$N
Mostra o cursor sempre piscando no display.
9) void EnviaOCaractere(int8 qual);
Envia o caractere indicado para a posio atual do cursor.
Devido as caractersticas especiais do compilador C usado, caso enviemos uma string de
caracteres, o compilador gera automaticamente um loop onde enviar cada byte da string.
Por exemplo, se executarmos
EnviaOCaractere ( "Teste);
O compilador far a seguinte seqncia equivalente:
EnviaOCaractere ('T');
EnviaOCaractere ('e');
100
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
EnviaOCaractere ('s');
EnviaOCaractere ('t');
EnviaOCaractere ('e');
V.3 Exemplos do Captulo
Nestes exemplos, na pasta cap$ do arquivo cap$+/ip no link
http:**'''+ne'toncraga+com+r*livros*cap$+/ip =. temos os exemplos vistos na teoria da linguagem C
prontos para serem simulados no Mplab.
So eles:
Na pasta +++D2)1 temos o programa que calcula a soma dos nmeros de 1 a 100.
Na pasta +++D2)$ temos o programa que conta indefinidamente de 1 a 10. Sempre que chegar a
10 incrementa a varivel X e recomea.
Na pasta +++D2)& temos o programa que incrementa indefinidamente a varivel chamada
contador e escreve nos leds colocados no port D.
Na pasta +++DPrograma 4esumo ;eral temos o programa que mostra a estrutura de todos os
itens vistos no capitulo sobre a linguagem C.
Na pasta +++Dareviacoes temos o programa de exemplo para o uso de ABREVAES.
Na pasta +++DreaS temos o programa de exemplo para o uso do BREAK.
Na pasta +++Dcontinue temos o programa de exemplo para o uso do CONTNUE.
Na pasta +++Destruturas temos o programa de exemplo para o uso de ESTRUTURAS.
Na pasta +++Dreturn temos o programa de exemplo para o uso do RETURN.
Na pasta +++DtFpecastings temos o programa de exemplo para o uso de TYPECASTNGS.
Na pasta +++Dunions temos o programa de exemplo para o uso de UNONS.
V.4 Exemplo dos Captulo
Na pasta cap&DPrograma .XnimoD . do arquivo disponvel para download
(http://www.newtoncbraga.com.br/livros/cap3) temos a listagem do programa mnimo para voc desenvolver
seus estudos de simulao no Mplab.
V.5 Exemplos prticos para treinamento
Temos a seguir uma lista de cada exemplo desenvolvido para estudo, com uma breve descrio do
mesmo e a pasta onde esta localizado.
Para facilitar o estudo, cada exemplo a seguir ter inicio em uma nova pagina.
101
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
2s#uemas el0tricos de cada e)emplo
Para preferencias de hardware, consulte o esquema de cada experincia no link abaixo
http://www.newtoncbraga.com.br/livros/esquemas.zip
onde temos os esquemas de cada experincia.
Consulte-os sempre que necessrio.
Aconselhamos baixar o arquivo http://www.newtoncbraga.com.br/livros/cap8.zip para baixar os
exemplos dos itens abaixo.
V.5.1 Usando sadas digitais
Objetivo:
Estudar as funes de acesso aos pinos como sada tanto bit a bit quanto byte a byte.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (Sdig.c) est na seguinte pasta:
cap?D[1-Sdig do arquivo cap?+/ip
Fundamentao Terica
funo bsica de qualquer microcontrolador acessar pinos individualmente ou at mesmo em uma
porta inteira para controles de entrada ou sada.
Os pinos de Entrada e sada so muitas vezes descritos apenas como "pinos de E/S, ou ainda pela
sua denominao em ingls, "nput/Output, ou /O.
Geralmente os pinos de E/S tem primariamente a funo de escrever ou ler sinais com nvel de
tenso TTL, isto , nvel 0 ( de 0 at 0,8V) e nvel 1 ( de 2 ate 5V).
No caso dos microcontroladores pic e desta nossa experincia, vamos ver a funo para escrever 0
ou 1 em um bit individualmente, e ento veremos a funo para escrever em um port inteiro.
Funo output3high C qualpino )
Esta funo faz com que o pino indicado em qualpino v para nvel lgico 1.
Funo output3lo' C qualpino )
Esta funo faz com que o pino indicado em qualpino v para nvel lgico [.
Funo output3L C valorde=1its )
Esta funo escreve no port F o valorde=1its indicado.
Detalhes do programa exemplo:
Neste programa simples, apenas ficamos alterando o estado de alguns pinos e escrevendo valores
no port D para visualizao nos leds.
102
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.5.2 Usando entradas e sadas digitais
Objetivo:
Usando os conceitos adquiridos na experincia 1, veremos como ler sinais digitais e para
sinalizao usar as funes de sada nos leds no port D.
Veremos as funes de acesso aos pinos de entrada tanto bit a bit quanto byte a byte.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (ESDig.c) esta na seguinte pasta:
cap?D[$-2SDig do arquivo cap?+/ip
Fundamentao Terica
Chamamos de entrada digital aquela cujos sinais so, como j dissemos, de nvel TTL.
No caso dos microcontroladores pic e desta nossa experincia, vamos ver a funo para ler o
estado de 1 bit individualmente, e ento veremos a funo para ler um port inteiro.
Funo input C qualpino )
Esta funo retorna o estado do pino indicado em qualpino.
Funo input3L C )
Esta funo retorna o valor presente nos pinos do port F indicado.
Detalhes do programa exemplo:
Neste programa, vamos realizar as seguintes funes:
- Se a tecla T7 estiver pressionada (nvel 0), apagamos o led 1
- Se a tecla T4 estiver pressionada (nvel 0), acendemos o led 1
- Se a tecla T1 estiver pressionada (nvel 0), faremos portD = 0 (apagaremos todos os LEDs)
- Se a tecla T* estiver pressionada (nvel 0), faremos portD = 255 (acendemos todos os LEDs)
V.5.3 Usando o conversor de analgico para digital com resoluo de
8 bits
Objetivo:
Estudar o funcionamento do conversor A/D configurado para 8 bits e escrever o valor convertido nos
8 leds do port D.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (Ad8Pd.c) esta na seguinte pasta:
cap?D[&-Ad?pd do arquivo cap?+/ip
103
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Fundamentao Terica
Chamamos de sinal analgico aquele cuja variao no tempo continua, e no discreta ou ponto a
ponto. Podemos dizer que no mundo real todos os sinais so analgicos. J no mbito dos
microprocessadores, os sinais so digitais, isto , variam no tempo em "pacotes ou em passos, chamados
de pontos discretos.
No caso dos microcontroladores pic e desta nossa experincia, vamos ver como utilizar o conversor
analgico-digital interno para ler uma tenso cujo valor vai de 0 a 5 V (este valor gerado por um trimpot) e
indicar o valor convertido para verificao no port D.
Como vamos usar o conversor com resoluo de 8 bits (veremos em outro exemplo o conversor
com resoluo de 10 bits), teremos 256 variaes possveis para o sinal, de forma que para 5 V de fundo de
escala teremos aproximadamente 20 mV por diviso:

2
8
= 256 e 5.0 V / 256 divises = 19,53125 mV/diviso
As 256 opes so contadas de 0 a 255, assim vemos que na converso A/D o sinal no varia mais
linearmente, isto , indo do 0 ao 5V, vamos em "passos de aproximadamente 20 mV.
5enso Analgica <alor Digital em decimal <alor digital em inrio
Capro)imada)
0 a 19 mV 0 00000000
20 a 39 mV 1 00000001
40 a 59 mV 2 00000010
60 a 79 mV 3 00000011
. . .
. . .
4940 a 4939 mV 253 11111101
4960 a 4979 mV 254 11111110
4980 a 5000 mV 255 11111111
Iun"es para acesso ao canal A*D:
Conforme a apostila de linguagem C para pics, devemos usar as seguintes funes para poder usar
o conversor A/D:
1- Logo aps o #include <..> devemos usar a diretiva
7device adcW?
para ajustar o compilador para 8 bits (quando for 10 bits usaremos =10)
2- Logo que entrarmos no main( ) devemos ajustar o canal A/D, inclusive para que possamos usar os
demais pinos do port A como E/S digital.
setup3adc Cadc3clocS3div3&$)M // para ajustar a velocidade dce converso.
setup3adc3portsC4A[3analog)M // RA0 analgico, demais pinos dos ports
// A e E digitais.
setup3adc3channel C[)M // j indicamos que vamos ler o canal 0.
3- E sempre que desejarmos ler o valor analgico usaremos a funo
varivelOdeO?O'it" = read3adc C )M
que retorna o valor do canal analgico.
Detalhes do programa exemplo:
104
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Este programa realiza a seguinte funo:
1. L o valor do canal analgico e salva na varivel ValorAD8
2. Copia esta varivel no port D
3. Espera 50 ms (temos uma media de 20 leituras por segundo)
V.5.4 Display LCD 16x2 com interface de 4 bits
Objetivo:
Estudar as funes para acesso ao display LCD com apenas 4 bits de via de dados.
Desta forma poderemos usar o display como interface de sada visual em vrios exemplos.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (Lcd4.c) esta na seguinte pasta:
cap?D[E-@cdE do arquivo cap?+/ip
Fundamentao Terica
Neste exemplo vamos apenas escrever uma varivel, de 0 9, no display, usando as funes j
vistas no item V.2.1
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
1. Conta de 0 a 9 com intervalo de 1 segundo.
2. Escreve no display LCD
V.5.5 - Usando o conversor de analgico para digital com resoluo de
10 bits e visualizao dos resultados no LCD
Objetivo:
Nesta experincia vamos ler o canal analgico com resoluo de 10 bits e escrever no LCD o valor
de 10 bits em decimal e a tenso equivalente de 0 a 5V.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (AdLcd.c) esta na seguinte pasta:
cap?D[Y-Ad@cd do arquivo cap?+/ip
Fundamentao Terica
Esta experincia combina a leitura do A/D com o acesso ao display LCD, conforme j visto nas
experincias anteriores.
E como apresentamos no displays nmeros maiores que 9 ?
Para que possamos mostrar no display nmeros maiores que 9, como por exemplo o fundo de
escala do A/D (1023) que uma varivel de 16 bits, devemos DECOMPOR a mesma em dgitos individuais,
que sero armazenados em 4 bytes (milhar, centena, dezena e unidade) e posteriormente enviados ao
LCD. Para tal, usaremos a funo Decomp"e C )= que nada tem de especial, apenas comandos da
linguagem C. Estude esta funo detalhadamente para assimilar o conceito da diviso e do resto da diviso
de nmeros inteiros.
Sobre o ajuste da resoluo do A/D:
105
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Observe na listagem do programa que usamos a diretiva #device ACD=10 neste caso, para
obtermos a resoluo de 10 bits
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
- L o canal 0 com resoluo de 10 bits
- calcula a tenso equivalente de 0 5 Volts
- decompe em 4 dgitos o valor do A/D
- decompe em 2 dgitos o valor da tenso
- escreve no LCD o valor de 10 bits e a tenso equivalente.
V.5.6 Usando a EEProm de dados
Objetivo:
Vamos nesta experincia usar as funes de escrita e leitura na EEPROM de dados interna.
Usaremos o display LCD para acompanhar o funcionamento do programa.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (eeprom.c) esta na seguinte pasta:
cap?D[^-eeprom do arquivo cap?+/ip
Fundamentao Terica
A EEPROM de dados tem a seguinte caracterstica bsica:
Permite a fcil escrita de valores e sua leitura, como uma memria RAM,
combinado ao fato de no perder os valores com o desligamento da energia.
O nico inconveniente est no tempo de escrita que pode chegar a ate 10 ms dependendo do chip.
Funes de acesso a eeprom
write_eeprom ( end8, valor8 );
Escreve no endereo end8 (endereo de 8 bits) a varivel valor8 (varivel de 8 bits)
valor8 = read_eeprom ( end8 );
L o endereo end8 (endereo de 8 bits) e devolve como resultado um valor de 8 bits.
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
-No reset recupera do endereo 0 da EEPROM a varivel 'valor8'
-Tecla T7 = decrementa valor8 (ate 0)
-Tecla T4 = incrementa valor8 (ate 255)
-Tecla T1 = salva valor8 na eeprom, endereo 0
-Tecla T* = l valor8 da eeprom
- Decompe a varivel em 3 dgitos e mostra no display LCD (funes j
estudadas).
106
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.5.7 Usando o timer 0 em 8 bits com clock externo
Objetivo:
Vamos ajustar o timer 0 para usar sinal externo, com prescaler dividindo por 32 (a cada 32 pulsos
externos o timer incrementa 1 vez) e ler o valor do mesmo para mostrar no display.
Vamos usar um oscilador externo (baseado no 555) para gerar pulsos no pino RA4/T0Cki.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (t0.c) esta na seguinte pasta:
cap?D[Z-5[ do arquivo cap?+/ip
Fundamentao Terica
Como j vimos na teoria, o timer 0 um contador de 8 bits ou de 16 bits. Usaremos nesta
experincia o timer em 8 bits, com sinal externo.
Nesta experincia o timer 0 ser incrementado a cada 4 pulsos externos, cuja freqncia pode ser
alterada via trimpot do circuito baseado no 555. A cada pressionar da tecla S1 o seu valor ser lido e
mostrado no display LCD. Depois o valor do timer ser zerado reinicializando o contador.
Funes de acesso ao timer0
set_timer0 ( valor8 );
Escreve no registro de contagem do timer a varivel valor8.
valor8 = get_timer0 ( );
L o registro de contagem do timer 0 e devolve como resultado um valor de 8 bits
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
Ao pressionar a tecla T* l o valor do timer 0 (de 0 a 255)
Zera o timer 0
decompe em 3 dgitos
escreve no lcd
V.5.8 Usando o timer 1 (16 bits) com clock interno
Objetivo:
Gerar uma base de tempo de 10 ms fixa, que pode ser usada como base de tempo para varreduras,
aquisio de dados, ...

Localizao dos arquivos:
O fonte e o projeto para esta experincia (t1.c) esta na seguinte pasta:
cap?D[?-51 do arquivo cap?+/ip
Fundamentao Terica
Vamos ajustar o timer 1 para usar sinal interno, isto , sua velocidade ser fixa baseada no Tcy
(ciclo de maquina) com prescaler em 1. Com clock de 10 MHz, teremos Tcy = 0,4 us / ciclo.
107
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
A cada 10 ms o timer 1 estoura e pede uma interrupo.
A cada 50 interrupes (0,5 seg) inverte o estado do pino RD7, gerando um sinal visual com
intervalo de 1 segundo entre piscadas.
Para obtermos 10 ms (10.000 us), o timer devera contar 25.000 Tcy
(25000 x 0,4 us = 10000 us).
Como o timer 1 crescente, a cada interrupo vamos somar ao valor do Timer 1 um offset para
que contando MAS 25000, resulte 65.536 ( que seria o 65.535 mais 1 para estourar).
O offset tem ento o valor de 40.536, pois se o timer iniciar em 45.536 vai estourar (ira de 65.535
para 0) apos 25.000 pulsos.
Mais. A cada interrupo incrementar uma varivel auxiliar para contar o tempo e gerar o sinal visual de 1
segundo
Funes de acesso ao timer1
set_timer1 ( valor16 );
Escreve no registro de contagem do timer 1 a varivel valor16 (varivel de 16 bits)
valor16 = get_timer1 ( );
L o registro de contagem do timer 1 e devolve como resultado um valor de 16 bits
V.5.9 Usando a interrupo externa NT0 no pino RB0
Objetivo:
Vamos ver como se implementa uma funo de interrupo externa para sincronismo de um evento
externo.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (intext.c) esta na seguinte pasta:
cap?D[]-inte)t do arquivo cap?+/ip
Fundamentao Terica
Chamamos de interrupo externa qualquer evento que ocorra fora do chip e que sinalize ao
processador a ocorrncia deste evento sem que o mesmo tenha realizado uma varredura para ver o sinal.
Estaremos nesta experincia simulando um encoder incremental. Neste tipo de encoder dois sinais
so gerados: O sinal de Sincronismo, indicando o movimento do mesmo, e um sinal de Referncia,
indicando a direo do movimento (esquerda/direita, sobe/desce, sentido horrio/anti-horrio, ....).
O sinal de Sincronismo esta sendo gerado por um 555 astvel com freqncia varivel e a
referencia pelo pressionar da tecla S1.
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
- A cada interferncia externa l o estado da tecla T*.
- Se T* estiver pressionada, decrementa o contador
- Se T* no pressionada, incrementa o contador
- Apresenta no display o valor da simulao
108
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.5.10 Enviando um byte pelo canal serial
Objetivo:
Vamos ver como se implementa a funo que envia um byte pelo canal serial a 9600 bps.
Como auxlio para esta experincia utilizar no PC o programa 4ecee313Fte+e)e e um cabo
simples, descrito abaixo.
Localizao dos arquivos:
O fonte, o projeto para esta experincia (txd.c), e o programa auxiliar esto na seguinte pasta:
cap?D1[-t)d do arquivo cap?+/ip
Fundamentao Terica
A cada 100 ms o valor do canal analgico ser lido com resoluo de 8 bits, mostrado nos leds do
port D e depois enviado ao PC pelo canal serial usando a interface Rs-232 a 9600 bps.
mportante: Lembre-se de que os sinais do pic so TTL e no podem ser ligados diretamente ao PC. Veja
esquema da experincia ao final da apostila.
Funes de acesso a transmisso serial
Para usar o canal serial devemos antes do main( ) incluir as diretivas:
7use delaFCclocSW1[[[[[[[)
para indicar qual o clock utilizado e
7use rs$&$ C(A8DW]^[[= L.:5WP:93C^= 4C<WP:93CZ= (:5SW?)
para que o compilador C j ajuste o canal serial interno do chip nas condies indicadas, e no programa
devemos usar a funo
putchar C valor? )M
que escreve no registro de transmisso serial a varivel valor8 (varivel de 8 bits).
O cabo de comunicao:
O cabo para esta experincia muito simples. So dois conectores DB9 fmea interligados da
seguinte forma:
Pino do lado do Pic Pino do lado do PC
2 2
3 3
5 5
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
- A cada 100 ms l o canal RA0 e envia para o programa do PC, que indicara o valor recebido via
texto e via grfico de barra
109
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.5.11 Recebendo um byte pelo canal serial
Objetivo:
Vamos ver como se implementa a funo que recebe um byte pelo canal serial a 9600 bps usando a
interrupo de recepo do serial.
Como auxilio para esta experincia utilizar no PC o programa 2nvia313Fte+e)e
Localizao dos arquivos:
O programa, o projeto para esta experincia (rxd.c), e o programa auxiliar esto na seguinte pasta:
cap?D11-r)d do arquivo cap?+/ip
Fundamentao Terica
O programa no PC apresenta uma barra que pode ser ajustada pelo usurio com o mouse, e a
posio (de 0 a 255) indicada em um texto.
A cada ajuste realizado pelo usurio, o valor enviado pelo serial e recebido pelo PC, e este valor
indicado nos leds do portD em binrio.
Funes de acesso a recepo serial
Para usar o canal serial devemos antes do main( ) incluir as diretivas:
7use delaFCclocSW1[[[[[[[)
para indicar qual o clock utilizado e
7use rs$&$ C(A8DW]^[[= L.:5WP:93C^= 4C<WP:93CZ= (:5SW?)
para que o compilador C j ajuste o canal serial interno do chip nas condies indicadas, e no programa
devemos usar na interrupo 4DA a funo
) W getchar C valor? )M
que l o byte do buffer de recepo serial e escreve no registro X.
O cabo de comunicao:
O cabo para esta experincia muito simples. So dois conectores DB9 fmea interligados da
seguinte forma:
Pino do lado do Pic Pino do lado do PC
2 2
3 3
5 5
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
A cada ajuste do usurio no programa do PC, o mesmo envia para a placa o byte indicado
A placa recebe o byte e escreve nos leds do port D em binrio.
110
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
V.5.12 Comunicao serial SP por hardware
Objetivo:
Estudar a comunicao serial padro SP com o auxilio de um potencimetro digital da Microchip,
modelo MCP 41010, usando o canal SP interno.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (spi_hw.c) esto na seguinte pasta:
cap?D1$-SP:3RQ do arquivo cap?+/ip
Fundamentao Terica
Podemos ver os potencimetros digitais como uma rede resistiva controlada por um hardware, e
desta forma podemos selecionar o ajuste desta rede interna de forma a combinar estes resistores e obter
um efeito similar ao de um trimpot. No caso do MCP41010, temos um trimpot de 10 Kohms, com 256
divises possveis.
Nosso programa envia pelo canal serial SP 2 bytes, 1 de comando e outro indicando qual a posio
desejamos para nosso trimpot. Esta variao no obrigatoriamente linear como nos trimpots mecnicos ou
como em outros modelos disponveis no mercado. Podemos da posio 10 ir para a posio 100
diretamente e de forma muito rpida.
Podemos considerar que o trimpot digital na verdade um conversor D/A integrado.
Valores ao ligar o chip:
Ao alimentar o trimpot, o mesmo ira automaticamente para a posio central (128), de forma que
nosso software deve posicion-lo na posio desejada, que pode ser fixa no programa ou ter sido
recuperada da EEPROM.
Caractersticas da experincia:
Ao reset do pic, o trimpot ser ajustado na posio 128. Na sada do mesmo, teremos ento 2,5 V
(ver esquema desta experincia).
Ao pressionar a tecla T*, vamos diminuir (ate 0) o valor do ajuste com delay de 50 ms entre ajustes.
Ao pressionar a tecla T7, vamos aumentar (ate 255) o valor do ajuste com delay de 50 ms entre
ajustes.
O ajuste do trimpot poder ser observado nos leds do port D (em binrio) e com um voltmetro na
sada do mesmo.
V.5.13 Comunicao serial
2
C
Objetivo:
Estudar a comunicao serial padro
2
C com o auxilio de uma memria EEPROM 24C64.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (i2c.c) esto na seguinte pasta:
cap?D1&-:$C do arquivo cap?+/ip
Fundamentao Terica
Neste exemplo temos uma EEPROM serial 24C64 ligada ao canal MSSP do pic em modo
2
C.
111
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Como j vimos na teoria, as e EEPROM s so teis para o armazenamento de informaes que no
podem ser perdidas com o fim da alimentao.
A memria interna dos pics est hoje limitada a 256 bytes, o que em algumas aplicaes no o
suficiente, como coletores de dados, por exemplo.
Neste caso, usamos uma EEPROM com mais capacidade, mas externa ao pic. A grande vantagem
das EEPROM s
2
C esta no fato de utilizar apenas 2 pinos do pic, e quando usamos linguagem C, o
software fica muito simples de ser implementado.
S para comparao, enquanto o pic tem 256 bytes ( o,25K), a memria 26C64 tem 8.192 bytes
( 1K ). Temos ainda memrias com 128 KBytes (modelo 24LC1025)
A EEPROM que usaremos tem 3 pinos de endereamento externo, podendo ir de 0 a 7, e endereo
fixo 0xA0.
Assim, podemos ter ate 8 EEPROM s em paralelo, nos endereos de 0xA0 ate 0xAE (de 2 em 2).
Funes para uso da eeprom i2c:
init_ext_DEVCE()
Deve ser usada antes de qualquer acesso a EEPROM
write_ext_device(a, d);
Escreve no endereo A o dado D
read_ext_device(a);
L no endereo A o dado armazenado
MPORTANTE: Para usar este dispositivo o include a seguir obrigatrio.
#include <\apostilaPCrev4\lib\2C_LB.c>
Neste arquivo esto as funes de acesso ao dispositivo.
Detalhes do programa exemplo:
Se pressionar T* decrementa a varivel valor8, salva e em seguida recupera da EEPROM,
mostrando no LCD os valores enviados e recebidos.
Se pressionar T7 incrementa a varivel valor8, salva e em seguida recupera da EEPROM,
mostrando no LCD os valores enviados e recebidos.
V.5.14 CCP em modo "PWM
Objetivo:
Estudar o funcionamento do modulo CCP em PWM
Localizao dos arquivos:
O fonte e o projeto para esta experincia (pwm.c), e o programa auxiliar esto na seguinte pasta:
cap?D1E-PQ. do arquivo cap?+/ip
Fundamentao Terica
Conforme visto na teoria, no PWM temos um sinal com freqncia constante, mas com tempo em
nvel alto varivel.
112
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Possui varias aplicaes, geralmente em controles de potncia.
O controle da freqncia determinado pelo timer 2, e o perodo em alto pelo registro de duty-cycle.
Detalhes do programa exemplo:
Em nosso exemplo vamos acionar um LED, controlando o brilho dos mesmos.
A cada 'n' interrupes do timer 2, a funo set_pwm1_duty( ) mudar o ajuste do pwm, variando a
potncia emitida pelos LEDs.
- Se a tecla T7 (pino RB2) estiver pressionada (nvel 0), aumenta o brilho no modo 2
- Se a tecla T4 (pino RB3) estiver pressionada (nvel 0), diminui o brilho no modo 2
- Se a tecla T1 (pino RB4) estiver pressionada (nvel 0), seleciona o modo 2 onde o brilho do LED e'
controlado pelas teclas T7 e T4
- Se a tecla T* (pino RB5) estiver pressionada (nvel 0), seleciona o modo 1, onde o brilho do LED vai do
0 ao 100% e retorna
V.5.15 Multiplexao de displays de 7 segmentos
Objetivo:
Estudar a multiplexao de displays, isto , ver como podemos ligar 4 displays em paralelo e
acend-los 1 de cada vez, dando a impresso de que todos esto acesos.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (ad7seg.c) esto na seguinte pasta:
cap?D1Y-adZseg do arquivo cap?+/ip
Fundamentao Terica
O que a multiplexao de displays ?
Consiste em ligarmos em paralelo os segmentos do mesmo e acionarmos um de cada vez, na
ordem, desta forma:
- acende o display 1 e apaga os displays 2, 3 e 4
- espera um tempo
- acende o display 2 e apaga os displays 1, 3 e 4
- espera um tempo
- acende o display 3 e apaga os displays 1, 2 e 4
- espera um tempo
- acende o display 4 e apaga os displays 1, 2 e 3
- espera um tempo
- repete tudo
A taxa de repetio geralmente controlada pela interrupo peridica de um timer.
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
No reset ou aps dar um toque na tecla T7, estamos no modo 0 (voltmetro) , onde indicamos nos
displays o valor do A/D equivalente de 0 5.115 V
113
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Se a tecla T4 for pressionada, funcionara no modo A/D puro, mostrando o valor de 0 a 1023 para
escala de 0 a 5V.
Se mantivermos pressionada a tecla T1, a taxa de varredura ser reduzida at o limite de percepo
visual, onde teremos a impresso de que os displays esto piscando.

Se mantivermos pressionada a tecla T*, a taxa de varredura ser bem lenta, e poderemos ver com
facilidade o processo de "troca do display aceso.
Ento entra num ciclo repetitivo, a saber:
- L o canal analgico e calcula a tenso equivalente se for o caso
- Repete a cada 100 ms
Rotina de interrupo peridica do timer 0:
- Decompe o valor lido / calculado
- Apaga todos os displays
- Determina qual ser aceso
- Ajusta os segmentos do display selecionado
- Acende o display selecionado
- Volta
V.5.16 Teclado matricial 3x4
Objetivo:
Ver como se realiza a multiplexao de teclas com um teclado de 12 teclas dispostas em uma
matriz de 3 colunas e 4 linhas.
Localizao dos arquivos:
O fonte e o projeto para esta experincia (tec3x4.c), bem como o programa auxiliar, esto na
seguinte pasta:
cap?D1^-tec&)E do arquivo cap?+/ip
Fundamentao Terica
Na varredura de teclado matricial, o que fazermos habilitar uma coluna de cada vez, e para cada
coluna habilitada, ver se ha alguma tecla pressionada (ver esquema desta experincia).
Detalhes do programa exemplo:
Este programa realiza a seguinte funo:
Caso a seqncia digitada seja 1 2 3 4 5 6 7 8, apenas os 3 ltimos dgitos sero mostrados no
display e armazenados na memora (apenas as 3 ultimas teclas numricas):
000, 001, 012, 123, 234, 345, 456, 567, 678.
A tecla ' * ' zera os dgitos no display e a tecla ' # ' enviar pelo serial o valor da memria.
O programa no PC receber estes nmeros e mostrar qual o valor final digitado.
V.5.17 Comunicao serial SP por software
Objetivo:
Estudar a comunicao serial padro SP com o auxilio de um potencimetro digital da Microchip,
modelo MCP 41010, usando funes de software para gerar o padro SP.
114
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Localizao dos arquivos:
O fonte e o projeto para esta experincia (spi_sw.c) esto na seguinte pasta:
cap?D1Z-SP:3SQ G do arquivo cap?+/ip
Fundamentao Terica
Vale a mesma para o item X.5.12
Caractersticas da experincia:
Nesta experincia vamos enviando valores seqncias de 0 a 255, e depois reiniciando do 0, para o
potencimetro, gerando assim uma forma de onda "serrote na sada do mesmo.
115
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Anexos
Anexos
nstalaao dos programas:
1) Baixe e instale o Mplab verso 8.XX (no instale o Mplab-X) em
http://www.microchip.com/stellent/idcplg?
dcService=SS_GET_PAGE&noded=1406&dDocName=en019469&part=SW007002
2) No site www.ccsinfo.com baixe o demo do compilador C em
http://www.ccsinfo.com/ccsfreedemo.php
3) No site www.ccsinfo.com baixe o plugin para o Mplab em
http://www.ccsinfo.com/downloads/setup_mplab_plugin.exe
nstale nesta ordem.
- Esquemas das Experincias: http://www.newtoncbraga.com.br/livros/esquemas.zip
- Exemplos do captulo 2 : http://www.newtoncbraga.com.br/livros/cap2.zip
- Exemplos do captulo 3 : http://www.newtoncbraga.com.br/livros/cap3.zip
- Exemplos do captulo 8 : http://www.newtoncbraga.com.br/livros/cap4.zip
116
MCROCONTROLADORES PC 16F E 18F Teoria e Prtica Vidal Pereira da Silva Jr
Curso Rpido e Completo - Terico e Prtico
5emos ainda:
Placa didtica e de desenvolvimento P:C@A( Y
Permite reali/ar 5,DAS as e)peri>ncias da apostila= al0m de in%meras outras= pois
pode ser ampliada via conector de e)panso
;ravador 8S(
;rava in-circuit e ainda e)ecuta os programas diretamente na placa Picla Y ou na
sua prpria placa !inal
333333333333333333333333333333333333333333333333333333333333333333333333333333
Para maiores in!orma"es sore nossos produtos= visite o site do autor:
'''+vidal+com+r
117

Vous aimerez peut-être aussi