Você está na página 1de 64

Programao em C

de
Microcontroladores PIC

Elaborao: Carlos Eduardo Santos de Oliveira







Reviso: Novembro 2009


Sumrio
Microcontroladores ........................................................................................................... 5
Introduo aos Microcontroladores .............................................................................. 5
Fabricantes de Microcontroladores .............................................................................. 5
Classificao de acordo com Set de instrues dos Microcontroladores PIC ............. 6
Ciclo de Mquina .......................................................................................................... 6
Arquitetura Bsica dos Microcontroladores PIC ........................................................... 7
Linguagem C para Microcontroladores PIC: Compilador CCS ........................................ 9
Caractersticas da linguagem C ................................................................................... 9
Estrutura bsica de um programa em C ...................................................................... 9
Variveis ....................................................................................................................... 9
Tipos de Variveis ...................................................................................................... 10
Declarando Variveis ................................................................................................. 10
Inicializando Variveis ................................................................................................ 10
Variveis locais e variveis globais ............................................................................ 10
Tipos de Operadores .................................................................................................. 11
Operador de Atribuio ........................................................................................... 11
Operadores Aritmticos ........................................................................................... 11
Precedncia de operadores .................................................................................... 12
Operadores relacionais ........................................................................................... 12
Operadores lgicos ................................................................................................. 12
Operadores de Atribuio Aritmtica ...................................................................... 13
Operadores Incrementais ........................................................................................ 13
Estruturas Relacionais ................................................................................................ 13
Deciso de um bloco (if...)....................................................................................... 13
Deciso de dois blocos (if...else) ............................................................................ 14
Deciso de mltiplos blocos (if...else if...else if...) .................................................. 15
Estrutura switch...case ............................................................................................ 17
Estruturas de Repetio ............................................................................................. 18
Estrutura do...while .................................................................................................. 18
Estrutura while ......................................................................................................... 19
Estrutura for ............................................................................................................. 20
A instruo break. ................................................................................................... 21
Manipulao de Funes ........................................................................................... 21
Funes de Biblioteca ............................................................................................. 21
Incluindo uma Biblioteca de Funes ..................................................................... 21
Estrutura das Funes de Usurio .......................................................................... 21
Definio de Funes .............................................................................................. 23
Localizao das Funes ........................................................................................ 23
Variveis Compostas .................................................................................................. 25
Vetores .................................................................................................................... 25
Declarao de Vetores ............................................................................................ 25
Referncia a Elementos de um Vetor ..................................................................... 25
Inicializao de Vetores .......................................................................................... 25
Preenchendo um Vetor ........................................................................................... 26
Passando Vetores para Funes ............................................................................ 26
Matrizes ................................................................................................................... 27
Declarao e Inicializao de Matrizes ................................................................... 27
Passagem de Matrizes para Funes ..................................................................... 28
Strings ......................................................................................................................... 28
Apresentao do CCS .................................................................................................... 30
O Compilador CCS ..................................................................................................... 30
Abrindo e Salvando Arquivos ..................................................................................... 30
Compilando os Programas ......................................................................................... 31
Ferramentas Auxiliares de Desenvolvimento ............................................................. 31
O PIC Wizard ........................................................................................................... 32
Tpicos de Ajuda do CCS .......................................................................................... 32
Criando Projetos no CCS ........................................................................................... 32
A Escolha do Microcontrolador (MCU) .................................................................... 32
Criando um Novo Projeto o Assistente de Configuraes PIC Wizard ............. 33
Funes do Compilador CCS ......................................................................................... 42
Funes para Configuraes das Entradas e Sadas Digitais ................................... 42
Acionamento de Sadas Digitais ................................................................................ 43
Leitura de Entradas Digitais ....................................................................................... 43
Funes de Tempo ..................................................................................................... 44
Funes para Conversor Analgico/Digital ................................................................ 44
Funes para EEPROM interna ................................................................................. 45
Funes para os Mdulos Timers ............................................................................. 45
Funes para Comunicao Serial RS232 ................................................................ 46
Funes para manipulao de variveis .................................................................... 46
Funes para manipulao de Interrupes .............................................................. 47
Programao Aplicada a Microcontroladores PIC com o Compilador CCS .................. 48
Introduo ................................................................................................................... 48
Controlando I/Os Digitais ........................................................................................... 48
Exemplo de um LED piscando a 0,5Hz: ................................................................. 48
Exemplo: acionando um LED a partir do comando de uma chave. ........................ 49
Controle de Display de LCD de Caracteres ............................................................... 50
Exemplo: Escrevendo Mensagem no Display......................................................... 51
Entradas Analgicas ................................................................................................... 52
Exemplo: Leitura de um Potencimetro ................................................................. 52
Interrupes ................................................................................................................ 53
Exemplo: Interrupo no pino RB0 em borda de subida. ....................................... 54
Exemplo: Teclado Matricial com interrupo On B Change ................................... 55
Exemplo: Piscando LED com Interrupo por Timer .............................................. 57
Comunicao Serial ................................................................................................... 58
Exemplo: Enviando e Recebendo Dados pela Porta Serial .................................... 59
EEPROM .................................................................................................................... 60
Exemplo: Gravando o valor do Potencimetro na EEPROM .................................. 60
Interface com Microcontroladores .................................................................................. 62
Interface com LEDs ................................................................................................... 62
Interface para Motores DC e Rels ............................................................................ 62
Interface com Interruptores ........................................................................................ 63
Interface com Sensores Resistivos ............................................................................ 63

TPA Engenharia www.tpaengenharia.com.br 5

Microcontroladores
Introduo aos Microcontroladores
Os equipamentos controlados por microprocessadores so normalmente constitudos
por vrios circuitos integrados ou chips, cada um com a sua funo: o microprocessador (CPU),
uma memria EPROM com o programa, uma memria RAM para armazenamento de dados e
interfaces de entrada/sada (I/O input/output) para ligao ao exterior.
Pelo contrrio, os sistemas baseados em Microcontroladores possuem um nico chip
de pequenas dimenses que integra uma CPU, Memria RAM, Memria ROM e circuitos de
interface. A grande variedade destes componentes possibilita que o mesmo fabricante oferea
modelos com mais ou menos RAM, com outros dispositivos como Portas de Comunicao,
Conversores Analgico/Digitais, etc.
As circunstncias que nos deparamos hoje no campo dos Microcontroladores tm os
seus primrdios no desenvolvimento da tecnologia dos circuitos integrados. Este
desenvolvimento tornou-se possvel armazenar centenas de milhares de transistores num
nico chip. Isso constituiu um pr-requisito para a produo de microprocessadores. Os
primeiros computadores foram construdos adicionando perifricos externos tais como
Memrias, Barramentos de Entrada e Sada, Temporizadores e outros.
Um crescente aumento do nvel de integrao permitiu o aparecimento de circuitos
integrados contendo simultaneamente o processador e seus perifricos. E assim, surgiu o
primeiro chip contendo um microcomputador que mais tarde seria designado por
Microcontrolador. Com este, economizamos espao na placa e tempo de desenvolvimento,
entre outros.
Os Microcontroladores podem ser utilizados para controlar uma variedade de
equipamentos, desde mquinas de lavar, automveis, mquinas industriais, etc. Por outro lado,
o controle de dispositivos como motores, rels e lmpadas exigem adaptao de sinal. Para
medirmos a tenso proveniente de nossas tomadas residenciais, seja ela de 127V ou 220V,
por exemplo, necessrio que o sinal de tenso passe por um circuito auxiliar que ir
condicionar este sinal de tenso nos nveis suportados pelo Microcontrolador. Uma boa parte
deles suporta um nvel de tenso que esteja entre 0V e 5V.
Fabricantes de Microcontroladores
Existem diversos fabricantes de Microcontroladores no mercado mundial. Cada um
possui suas especialidades como velocidade de operao, custo/benefcio, perifricos, etc.
Dentre os principais fabricantes, podemos citar:
Atmel;
Dallas Semiconductor;
Intel;
Philips;
Microchip;
Hitachi;
Motorola;
Zilog.
Os Microcontroladores PIC, objeto de nossos estudos, so fabricados pela empresa
Microchip.
TPA Engenharia www.tpaengenharia.com.br 6

Classificao de acordo com Set de instrues dos
Microcontroladores PIC
Duas arquiteturas no mundo dos Microcontroladores so bem comuns: a arquitetura
de Harvard e a de von-Neumanns. A arquitetura de Harvard adveio da necessidade de pr o
Microcontrolador a trabalhar mais rpido. A Memria de Dados est separada da Memria de
Programa. Assim, possvel uma maior fluncia de dados atravs da unidade central de
processamento e uma maior velocidade de funcionamento. Em geral, a arquitetura Harvard
possui um conjunto com menos instrues que a de von-Neumann's.

Figura 1: Arquitetura Harvard versus von-Neumann's.
Os Microcontroladores com a Arquitetura Harvard so tambm designados por
Microcontroladores RISC. RISC provm de Computador com um Conjunto Reduzido de
Instrues (Reduced Instruction Set Computer). Os Microcontroladores com uma Arquitetura
von-Neumanns so designados por Microcontroladores CISC. O nome CISC deriva de
Computador com um Conjunto Complexo de Instrues (Complex Instruction Set Computer).
Diante das definies, temos as seguintes caractersticas:
CISC - Arquitetura von-Neumanns:
Possui um grande conjunto de instrues e geralmente possuem funes especficas e
de alto nvel, como multiplicao e diviso;
As instrues so processadas mais lentamente. Porm o hardware do
Microcontrolador mais simplificado.
RISC Arquitetura Harvard:
Possui um conjunto pequeno de instrues bsicas e fundamentais;
Mais apropriado para ser programado atravs de compiladores. O cdigo pode ser
muito otimizado de acordo com o compilador;
As instrues so processadas rapidamente, mas necessitam que o hardware do
Microcontrolador seja mais complexo.

Os Microcontroladores PIC trabalham com a Arquitetura Harvard (RISC).
Ciclo de Mquina
tambm chamado de Ciclo de Instruo. Como indica o prprio nome, o Ciclo de
Mquina o tempo gasto para efetuar uma instruo. Nos Microcontroladores PIC o Ciclo de
Mquina de 4 Ciclos de Clock.
Para que o programa escrito no Microcontrolador seja executado necessrio que seja
conectado ao mesmo um Oscilador. O Oscilador o componente que gerar pulsos de Clock
em um contador especial, denominado Contador de Programa. O Contador de Programa
TPA Engenharia www.tpaengenharia.com.br 7

aponta para cada posio da Memria de Programa, onde o Programa do Usurio gravado, a
fim de executar a instruo gravada nesta posio.
Portanto, aproveitando-se dos conceitos de Contador de Programa e de Oscilador, se
utilizarmos um oscilador com freqncia de 20MHz (20 Milhes de Ciclos por Segundo)
teremos efetivamente 5 Milhes de Instrues por Segundo. Os fabricantes fornecem este
dado em termos de Velocidade Mxima de Operao, dada em MIPS (Milhes de Instrues
Por Segundo).
Apenas exemplificando, o Microcontrolador que ser utilizado ao longo do nosso curso
o PIC16F877A e, de acordo com o seu fabricante, MICROCHIP, ele possui Velocidade
Mxima de Operao de 5MIPS.
Arquitetura Bsica dos Microcontroladores PIC
Os principais componentes de um Microcontrolador so: Memrias, CPU, Unidades de
Entrada e Sada de Dados e Barramento de Dados.

Figura 2: Esquema Simplificado de um Microcontrolador.
Dentre o bloco Memrias, destaca-se: Memria de Programa, onde est gravado todo
o programa do usurio; Memria RAM, utilizada para a manipulao de valores,
armazenamento de resultados de operaes matemticas e booleanas, etc. (todas as variveis
que so criadas pelo usurio so armazenadas na Memria RAM); dentre o bloco Memrias
temos os Registradores de Funes Especiais. Estes auxiliam na manipulao dos mdulos
internos do Microcontrolador. Cada mdulo de Comunicao, Timer, Conversor A/D, entre
outros, possui um ou mais registros de configuraes.
A Unidade Central de Processamento (CPU) o crebro de um Microcontrolador.
Essa parte responsvel por extrair a instruo, descodific-la e, finalmente, execut-la. A
TPA Engenharia www.tpaengenharia.com.br 8

unidade central de processamento interliga todas as partes do Microcontrolador de modo que
este se comporte como um todo. Uma de sua funes mais importante descodificar as
instrues do programa.
O cdigo de uma instruo extrado da Memria de Programa, tem que ser
descodificado pela unidade central de processamento (CPU). Cada uma das instrues do
Microcontrolador corresponde a um conjunto de aes para realizar uma determinada tarefa.
Estas aes podem envolver transferncias de dados de um local de memria para outro, de
um local de memria para as portas, ou at mesmo clculos. Conclumos, portanto, que a CPU
tem que estar ligado a todas as partes do Microcontrolador.
As Unidades de Entrada e Sada conectam os Mdulos internos do Microcontrolador ao
mundo externo. Se for necessrio ler o estado de um sensor ou acionar um motor precisamos
atuar neste mdulo.
O Barramento de Dados o responsvel por conectar cada um dos mdulos que
compem o Microcontrolador. Todo o trfego de dados das Unidades de Entrada e Sada, das
Memrias e de outros perifricos ocorre atravs deste barramento.


TPA Engenharia www.tpaengenharia.com.br 9

Linguagem C para Microcontroladores PIC: Compilador
CCS
Caractersticas da linguagem C
Entre as principais caractersticas do C, podemos citar:
O C uma linguagem de alto nvel com uma sintaxe bastante estruturada e flexvel
tornando sua programao bastante simplificada;
O C compartilha recursos tanto de alto quanto de baixo nvel, pois permite acesso e
programao direta do microprocessador. Com isto, rotinas cuja dependncia do tempo
crtica, podem ser facilmente implementadas usando instrues em Assembly. Por
esta razo o C a linguagem preferida de boa parte dos programadores;
O C uma linguagem estruturalmente simples e de grande portabilidade. O compilador
C gera cdigos mais enxutos e velozes do que muitas outras linguagens;
Embora estruturalmente simples (poucas funes intrnsecas) o C no perde
funcionalidade, pois permite a incluso de uma farta quantidade de rotinas do usurio.
Os fabricantes de compiladores fornecem uma ampla variedade de rotinas pr-
compiladas em bibliotecas.
Estrutura bsica de um programa em C
Um programa C consiste em uma ou vrias funes. Dentre elas existe uma das quais
precisa ser denominada main. O programa sempre comear executando a funo main.
Definies de funes adicionais podem preceder ou suceder a funo main.
Podemos citar outras regras para a linguagem C:
Toda funo deve ser iniciada por uma chave de abertura { e encerrada por uma chave
de fechamento };
Toda funo procedida de parnteses ( );
As linhas de cdigo so sempre encerradas por um ponto e vrgula;
A formatao dos programas completamente livre, mas temos por convenincia
manter a legibilidade;
Os comandos so executados na ordem em que foram escritos;
Os comentrios devem ser delimitados por /* no incio e */ no final.
Podem ser usados tambm os caracteres // para comentrios de uma linha.
Variveis
Todas as variveis e constantes usadas no programa devem ser definidas com um
nome e um tipo. 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.
Para declararmos uma varivel devemos seguir algumas regras. So elas:
Todas as variveis utilizadas no programa devem ser declaradas previamente;
A declarao indica, no mnimo, o nome e o tipo de cada uma delas;
Na ocorrncia de mais de uma varivel do mesmo tipo podemos declar-las de uma
nica vez, separando seus nomes por vrgula;
Todo nome de varivel iniciado por uma letra (a z ou A Z) ou o caracter trao
baixo ( _ ). O restante pode conter letras, trao baixo ou nmeros;
A Linguagem C case sensitive. Isso significa que as letras maisculas so
diferenciadas das letras minsculas. Ou seja: uma varivel declarada como TESTE e outra
como TesTe possuem endereos de memria diferentes pois possuem o nome diferente.
TPA Engenharia www.tpaengenharia.com.br 10

Porm, o CCS no case sensitive. Ou seja. Se tentarmos declarar uma varivel com
o nome TESTE e outra como TesTe elas sero interpretadas pelo compilador como sendo de
mesmo nome.
Tipos de Variveis
Variveis de 1 bit: podem assumir apenas dois valores distrintos: 0 ou 1. No CCS
este tipo de varivel nomeado por int1 e short.
Variveis de 8 bits sem sinal: podem armazenar valores inteiros que vo de 0 a 256,
para o caso dos tipos unsigned int, unsigned int8 e byte.
Variveis de 8 bits com sinal: armazenam valores inteiros que vo de -127 at 128.
So os tipos: signed int e signed int8.
Varivel de 8 bits padro ASCII (manipulao de caracteres): char.
Variveis de 16 bits: long int, int16.
Varivel de 32 bits: int32.
Varivel de 32 bits para valores fracionrios: float.
Declarando Variveis
A forma de declarao de variveis a seguinte:
Tipo_da_varivel Nome_da_varivel;

Inicializando Variveis
Pode-se inicializar uma varivel no momento de sua declarao, ou em qualquer
instante do programa.

Variveis locais e variveis globais
Existem duas maneiras principais para a alocao de variveis em memria:
Variveis Locais: as variveis locais tem alcance apenas dentro das rotinas ou
funes onde foram criadas. Isto significa que apenas a rotina ou funo onde a
mesma foi criada poder utiliz-la.

Variveis Globais: as variveis globais possuem alcance para todas as rotinas e
funes existentes no programa. Isto significa que qualquer rotina ou funo poder
utiliz-la.
TPA Engenharia www.tpaengenharia.com.br 11


Expresses Numricas e Caracteres
Vamos ver neste item os tipos de expresses permitidas para a manipulao de
nmeros e caracteres. As expresses so:
Nmeros Decimais: No podem comear por 0 (zero)
Exemplos: 123; 2; 14534; 3.14; ...
Nmeros Octais: Devem comear por 0 (zero)
Exemplos: 045; 09;...
Nmeros Binrios: Devem iniciar por 0b
Exemplo: 0b10101010
Nmeros Hexadecimais: Devem iniciar por 0x
Exemplo: 0x32; 0xA9; ...
Caracter: Devem estar entre Apstrofos
Exemplo: z; A; a; ....
Tipos de Operadores
Operador de Atribuio
A operao de atribuio a operao mais simples do C. Consiste de atribuir valor de
uma expresso a uma varivel. A sintaxe da operao de atribuio a seguinte:
identificador = expresso;
onde identificador o nome de uma varivel e expresso uma expresso vlida ou
outro identificador. No exemplo a seguir so mostradas algumas atribuies vlidas:

Operadores Aritmticos
Existem cinco operadores aritmticos em C. Cada operador aritmticos est
relacionado ao uma operao aritmtica elementar: adio, subtrao, multiplicao e diviso.
Existe ainda um operador (%) chamado operador de mdulo cujo significado o resto da
diviso inteira. Os smbolos dos operadores aritmticos so:
Operador de soma: + (mais)
Operador de subtrao: - (menos)
TPA Engenharia www.tpaengenharia.com.br 12

Operador de multiplicao: * (asterisco)
Operador de diviso: / (barra)
Operador de resto de diviso: % (porcentagem)
A sintaxe de uma expresso aritmtica :
operando operador operando;
onde operador um dos caracteres mostrados acima e operando uma constante
ou uma varivel.
Precedncia de operadores
Quando mais de um operador se encontram em uma expresso aritmtica as
operaes so efetuadas uma de cada vez respeitando algumas regras de precedncia. Estas
regras de precedncia so as mesmas da matemtica elementar.
Os operadores de multiplicao (*), diviso (/) e mdulo (%) tem precedncia sobre os
operadores de adio (+) e subtrao (-). Entre operadores de mesma precedncia as
operaes so efetuadas da esquerda para a direita.
A ordem de precedncia dos operadores pode ser quebrada usando-se parnteses: ( ).
Os parnteses so, na verdade, operadores de mais alta precedncia e so executados
primeiro. Parnteses internos so executados primeiro que parnteses externos.
Operadores relacionais
Operadores relacionais verificam a relao de magnitude e igualdade entre dois
valores. So seis os operadores relacionais em C:
Operador maior que: > (maior)
Operador menor que: < (menor)
Operador maior ou igual: >= (maior/igual)
Operador menor ou igual: <= (menor/igual)
Operador igual: == (igual/igual)
Operador diferente: != (exclamao/igual)
A sintaxe das expresses lgicas a seguinte:
expresso_1 operador expresso_2
onde expresso_1 e expresso_2 so duas expresses numricas quaisquer, e
operador um dos operadores relacionais.
O resultado de uma expresso lgica sempre um valor numrico que pode variar
entre dois valores: uma expresso avaliada como verdadeira recebe o valor 1 e uma expresso
lgica avaliada como falsa recebe o valor 0.
Operadores lgicos
So trs os operadores lgicos de C: &&, || e !. Estes operadores possuem o mesmo
significado, respectivamente, dos operadores lgicos Booleanos AND, OR e NOT.
A sintaxe de uso dos operadores lgicos :
expresso_1 && expresso_2
expresso_1 || expresso _2
! expresso
TPA Engenharia www.tpaengenharia.com.br 13

onde expresso _1 , expresso _2 e expresso so expresses quaisquer.
Observe que os operadores lgicos atuam sobre expresses de quaisquer valores.
Para estes operadores todo valor numrico diferente de 0 considerado 1.
Operadores de Atribuio Aritmtica
Muitas vezes necessrio alterar o valor de uma varivel realizando alguma operao
aritmtica, como por exemplo:

Embora seja perfeitamente possvel escrever estas instrues, foi desenvolvido na
linguagem C instrues otimizadas com o uso de operadores ditos operadores de atribuio
aritmtica. Os smbolos usado so (+=, -=, *=, /= , %=). Deste modo as instrues acima
podem ser rescritas como:

Operadores Incrementais
Em programao existem instrues muito comuns chamadas de incremento e
decremento. Uma instruo de incremento adiciona uma unidade ao contedo de uma varivel.
Uma instruo de decremento subtrai uma unidade do contedo de uma varivel.
Existem, em C, operadores especficos para realizar as operaes de incremento (++)
e decremento (--). Eles so genericamente chamados de operadores incrementais.
A sintaxe dos operadores incrementais a seguinte:
Identificador ++; (equivalente identificador = identificador + 1;)
Identificador --; (equivalente identificador = identificador - 1;)
onde Identificador o nome da varivel da qual se quer incrementar ou decrementar
um unidade.
Estruturas Relacionais
Deciso de um bloco (if...)
A estrutura de deciso de um bloco permite que se execute (ou no) um bloco de
instrues conforme o valor de uma condio seja verdadeiro ou falso. O fluxograma desta
estrutura mostrado abaixo.
TPA Engenharia www.tpaengenharia.com.br 14


Figura 3: Fluxograma da estrutura de deciso if...
A Sintaxe de Deciso com um bloco apresentada a seguir:
if(condio)
{
bloco;
}
onde: condio uma expresso lgica ou numrica. bloco um conjunto de
instrues.
Se a condio for verdadeira o bloco ser executado. Caso contrrio, o bloco no
executado.
Deciso de dois blocos (if...else)
Tambm possvel escrever uma estrutura que execute um entre dois blocos de
instrues. O fluxograma seguinte correspondente a esta estrutura de deciso.

Figura 4: Fluxograma da estrutura de deciso if...else
A Sintaxe de Deciso de dois blocos :
if(condio)
{
bloco_1;
}
condio
bloco
V
F
condio?
bloco 1 bloco 2
TPA Engenharia www.tpaengenharia.com.br 15

else
{
bloco_2;
}
onde: condio uma expresso lgica ou numrica. bloco_1 e bloco_2 so
conjuntos de instrues.
Se a condio for verdadeira apenas o bloco_1 executado. Caso contrrio,
somente o bloco_2 ser executado.

O exemplo mostrado acima est incompleto. No basta somente o trecho de cdigo
mencionado acima para que o estudante possa verificar os resultados. O exemplo apenas
ilustrativo para que o estudante tenha uma base de como utilizar a expresso de Deciso.
No cdigo acima verificamos a utilizao de uma funo at aqui desconhecida. Ela
serve para imprimir textos. Esta funo est detalhada em um captulo relacionado Funes
do CCS.
Deciso de mltiplos blocos (if...else if...else if...)
Tambm possvel escrever uma estrutura que execute um entre mltiplos blocos de
instrues. A figura seguinte mostra o fluxograma correspondente a esta estrutura de deciso.

Condio
1?
bloco 1
Condio
2?
bloco 2
Condio
3?
bloco 3
. . .
. . .
V
F
V
F
V
F

TPA Engenharia www.tpaengenharia.com.br 16

Figura 5: Fluxograma da estrutura de deciso if...else if.
A Sintaxe da Deciso de mltiplos blocos:
if(condio_1)
{
Bloco_1;
}
else if(condio_2)
{
Bloco_2;
}
...
Else
{
Bloco_N;
}
onde: condio_1 e condio_2 so expresses lgicas ou numricas. Bloco_1,
Bloco_2 e Bloco_N so conjuntos de instrues.
Se a condio_1 for verdadeira o Bloco_1 executado. Caso contrario, a
condio_2 avaliada. Se a condio_2 for verdadeira o Bloco_2 executado. Caso
contrrio, as condies que podem vir logo abaixo sero avaliadas. E assim sucessivamente.
Se nenhuma condio verdadeira o Bloco_N executado. Neste tipo de estrutura,
importante observar que somente um dos blocos ser executado.

TPA Engenharia www.tpaengenharia.com.br 17

No exemplo mostrado acima, a funo captura_tecla() apenas ilustrativa. Podemos
entender que esta funo ir esperar uma tecla a ser digitada e a tecla que for digitada ser
armazenada na varivel tecla. De acordo com o valor da tecla digitada ser impresso um
determinado texto. Na prxima seo veremos que o mesmo exemplo poder ser feito a partir
de outra estrutura relacional: a switch...case.
Estrutura switch...case
A estrutura switch...case uma estrutura de deciso que permite a execuo de um
conjunto de instrues a partir de pontos diferentes conforme o resultado de uma expresso de
controle. O resultado desta expresso comparado ao valor de cada um dos rtulos, e as
instrues so executadas a partir desde rtulo. A figura abaixo mostra o fluxograma lgico
desta estrutura.


Figura 6: Fluxograma da estrutura switch...case.
Esta estrutura possui a seguinte sintaxe:
switch(expresso)
{
case rtulo_1: conjunto_1;
case rtulo_2: conjunto_2;
...
case rtulo_n: conjunto_n;
default: conjunto_d;
}
conjunto 1
conjunto N
conjunto 2
conjunto D
...
expresso
rotulo 1
rotulo N
rotulo D
rotulo 2
TPA Engenharia www.tpaengenharia.com.br 18

onde: expresso uma expresso inteira. rtulo_1, rtulo_2 e rtulo_n e rtulo_d
so constantes inteiras. conjunto_1, conjunto 2, conjunto n e conjunto d so conjuntos de
instrues.
O valor de expresso avaliado e o fluxo lgico ser desviado para o conjunto cujo
rtulo igual ao resultado da expresso e todas as instrues abaixo deste rtulo sero
executadas. Caso o resultado da expresso seja diferente de todos os valores dos rtulos
ento o conjunto_d executado. Os rtulos devem ser expresses constantes inteiras
diferentes entre si. O rtulo default opcional.

importante observar que a estrutura switch...case permite maior organizao do que
quando utilizado a estrutura if...else if...else if.... Quando a estrutura switch...case for
aplicvel, como o caso do nosso exemplo acima, recomenda-se a utilizao da mesma.
A instruo break ser explicada em um tpico adiante.
Estruturas de Repetio
Estrutura do...while
Esta uma estrutura bsica de repetio condicional. Permite a execuo de um bloco
de instrues repetidamente. Sua sintaxe a seguinte:
do
{
bloco
}while(condio);
onde: condio uma expresso lgica ou numrica. bloco um conjunto de
instrues.
Esta estrutura faz com que o bloco de instrues seja executado pelo menos uma vez.
Aps a execuo do bloco, a condio avaliada. Se a condio verdadeira o bloco ser
executado novamente. Caso contrrio a repetio terminada. O fluxograma desta estrutura
mostrado na figura:
TPA Engenharia www.tpaengenharia.com.br 19


Figura 7: Fluxograma da estrutura do...while.

No exemplo acima, a funo captura_numero() apenas ilustrativa para que o
estudante possa visualizar o funcionamento da estrutura do...while e possa se familiarizar
com um caso tpico de aplicao para a estrutura de repetio em questo.
Estrutura while
A estrutura de repetio condicional while semelhante a estrutura do...while. Sua
sintaxe a seguinte:
while(condio)
{
bloco
}
onde: condio uma expresso lgica ou numrica. bloco um conjunto de
instrues.
Esta estrutura faz com que a condio seja avaliada em primeiro lugar. Se a condio
verdadeira o bloco executado uma vez e a condio avaliada novamente. Caso a condio
seja falsa a repetio terminada sem a execuo do bloco. Observe que nesta estrutura, ao
contrrio da estrutura do...while, pode ocorrer do bloco de instrues no ser executado
nenhuma vez. Para isto basta que a condio seja inicialmente falsa.
O fluxograma desta estrutura mostrada na figura seguinte:
bloco
condio? V
F
TPA Engenharia www.tpaengenharia.com.br 20


Figura 8: Fluxograma da estrutura while.
Estrutura for
A estrutura for muito semelhante as estruturas de repetio vistas anteriormente,
entretanto costuma ser utilizada quando se quer um nmero determinado de ciclos. A
contagem dos ciclos feita por uma varivel chamada de contador. A estrutura for , as vezes,
chamada de estrutura de repetio com contador. Sua sintaxe a seguinte:
for(inicializao; condio; incremento)
{
bloco
}
onde: inicializao uma expresso de inicializao do contador. condio uma
expresso lgica de controle de repetio. incremento uma expresso de incremento do
contador. bloco um conjunto de instrues a ser executado.
Esta estrutura executa um nmero determinado de repeties usando um contador de
iteraes. O contador inicializado na expresso de inicializao antes da primeira iterao.
Ento o bloco executado e depois de cada iterao, o contador incrementado de acordo
com a expresso de incremento. Ento a expresso de condio avaliada: se a condio
for verdadeira, o bloco executado novamente e o ciclo recomea, se a condio falsa
termina-se o lao. Esta condio , em geral, uma expresso lgica que determina o ultimo
valor do contador.
bloco
condio?
V
F
TPA Engenharia www.tpaengenharia.com.br 21


A funo captura_numero() apenas ilustrativa afim de facilitar o exemplo
mencionado.
A instruo break.
Esta instruo serve para terminar a execuo das instrues de um lao de repetio
(for, do...while, while) ou para terminar um conjunto switch...case.
Quando em um lao de repetio, esta instruo fora a interrupo do lao
independentemente da condio de controle.
Manipulao de Funes
Funes de Biblioteca
Uma funo um sub-programa (tambm chamado de rotina). Esta funo recebe
informaes, processa e retorna outra informao. Por exemplo: podemos ter uma funo que
receba um valor numrico, calcule seu logaritmo decimal e retorne o valor obtido.
Existem dois tipos de funes: funes de biblioteca e funes de usurio. Funes de
biblioteca so funes escritas pelos fabricantes do compilador e j esto pr-compiladas, isto
, j esto escritas em cdigo de mquina. Funes de usurio so funes escritas pelo
programador. Nesta seo trataremos somente das funes de biblioteca.
Incluindo uma Biblioteca de Funes
As bibliotecas das funes que sero usadas no programa devem ser includas no
cdigo fonte antes da funo principal.
Para incluir uma biblioteca do compilador (que est na pasta include do compilador)
usa-se a diretiva:
#include <nome da biblioteca>
Para incluir uma biblioteca que est em outra pasta usa-se:
#include endereo\nome da biblioteca
Estrutura das Funes de Usurio
possvel ao programador escrever suas prprias rotinas. So as chamadas de
Funes de Usurio ou simplesmente Rotinas de Usurio. Deste modo pode-se segmentar um
programa grande em vrios programas menores. Esta segmentao chamada de
modularizao e permite que cada segmento seja escrito, testado e revisado individualmente
sem alterar o funcionamento do programa como um todo. Permite ainda que um programa seja
TPA Engenharia www.tpaengenharia.com.br 22

escrito por vrios programadores ao mesmo tempo, cada um escrevendo um segmento
separado. Neste captulo, veremos como escrever funes de usurio em C.
A estrutura de uma funo de usurio muito semelhante estrutura dos programas
que escrevemos at agora. Uma funo de usurio constitui-se de um bloco de instrues que
definem os procedimentos efetuados pela funo, um nome pelo qual a chamamos e uma lista
de argumentos passados a funo. Chamamos este conjunto de elementos de definio da
funo.
O cdigo mostrado abaixo uma funo definida pelo usurio para calcular a mdia
aritmtica de dois nmeros reais:

No exemplo acima definimos uma funo do tipo float chamada media que recebe
dois argumentos tipo float: a e b. A mdia destes dois valores calculada e armazenada
na varivel med declarada dentro da funo media. A funo retorna, para o programa que
a chamou, um valor tambm do tipo float: o valor da varivel med. Este retorno de valor
feito pela instruo return que termina a execuo da funo e retorna o valor de med para
o programa que a chamou.
Depois de definirmos uma funo, podemos us-la dentro de um programa qualquer.
Dizemos que estamos fazendo uma chamada funo.
No exemplo abaixo chamamos a funo media() dentro de um programa principal.

Vale lembrar que a funo captura_numero() apenas ilustrativa afim de tornar os
exemplos mais claros e fceis de entender. Porm, dado a definio de Funes de Usurio,
aps a introduo de funes especficas do CCS para manipulao dos Microcontroladores, o
TPA Engenharia www.tpaengenharia.com.br 23

estudante estar apto a escrever uma funo especfica para ler um teclado matricial ou uma
porta especfica.
Definio de Funes
De modo formal, a sintaxe de uma funo a seguinte:
tipo_de_retorno nome_da_funo(tipo_1 arg_1, tipo_2 arg_2, ...)
{
Bloco_de_instrues_da_funo
}
A primeira linha da funo contm a declarao da funo. Na declarao de uma
funo se define o nome da funo, seu tipo de retorno e a lista de argumentos que recebe.
Em seguida, dentro de chaves {}, definimos o bloco de instrues da funo.
O tipo de retorno da funo especifica qual o tipo de dado retornado pela funo,
podendo ser qualquer tipo de varivel: int, float, etc. Se a funo no retorna nenhum valor
para o programa que a chamou devemos definir o retorno como void, ou seja, um retorno
ausente.
Vale notar que existe apenas um valor de retorno para funes em C. No podemos
fazer o retorno de dois ou mais valores. Porm isto no uma limitao sria, pois o uso de
ponteiros contorna o problema.
A lista de argumentos da funo especifica quais so os valores que a funo recebe.
As variveis da lista de argumentos so manipuladas normalmente no corpo da funo.
A chamada de uma funo termina com a instruo return que transfere o controle para
o programa que realizou a chamada da funo. Esta instruo tem duas finalidades: determina
o fim lgico da rotina e o valor de retorno da funo. O argumento de return ser retornado
como valor da funo.
Localizao das Funes
Existem basicamente duas posies possveis para escrevermos o corpo de uma
funo: antes ou depois do programa principal. Podemos ainda escrever uma funo no
mesmo arquivo do programa principal ou em arquivos separados.
Funo escrita antes do programa principal e no mesmo arquivo
Sintaxe:
tipo nomef(...) // definio da funo
{
[corpo de funo]
}
void main() // programa principal
{ ...
var = nomef(...) // chamada da funo
...
TPA Engenharia www.tpaengenharia.com.br 24

}
Corpo da funo depois do programa principal (no mesmo arquivo)
Quando escrevemos a definio de uma funo depois do programa principal e no
mesmo arquivo deste, devemos incluir um prottipo da funo chamada. Um prottipo uma
instruo que define o nome da funo, seu tipo de retorno e a quantidade e tipo dos
argumentos da funo. O prottipo de uma funo indica ao compilador quais so as funes
usadas no programa principal e os tipos. A sintaxe geral para isto a seguinte:
Sintaxe:
tipo nomef(...); // prottipo da funo
void main(){ // programa principal
...
var = nomef(...) // chamada a funo
...
}
tipo nomef(...){ // definio da funo
[corpo de funo]
}
Corpo da funo escrito em arquivo separado
Em C, como em muitas outras linguagens, permitido que o usurio crie uma funo
em um arquivo e um programa que a chame em outro arquivo distinto. Esta facilidade permite a
criao de bibliotecas de usurio: um conjunto de arquivos contendo funes escritas pelo
usurio. Esta possibilidade uma grande vantagem utilizada em larga escala por
programadores profissionais.
Quando escrevemos a definio de uma funo em arquivo separado do programa
principal devemos incluir este arquivo no conjunto de arquivos de compilao do programa
principal. Esta incluso feita com a diretiva #include.
Sintaxe:
#include path // incluso da funo
void main() // programa principal
{
...
var = nomef(...) // chamada funo
...
}
Na diretiva #include indicamos, entre aspas duplas, o caminho de localizao do
arquivo onde est definida a funo chamada.
TPA Engenharia www.tpaengenharia.com.br 25



Variveis Compostas
Vetores
Em muitas aplicaes queremos trabalhar com conjuntos de dados que so
semelhantes em tipo. Por exemplo: o conjunto das alturas dos alunos de uma turma, ou um
conjunto de seus nomes. Nestes casos, seria conveniente poder colocar estas informaes sob
um mesmo conjunto, e poder referenciar cada dado individual deste conjunto por um ndice
numrico. Em programao, a este tipo de estrutura de dados dado o nome de Vetor.
Declarao de Vetores
Em C, um vetor um conjunto de variveis de um mesmo tipo que possuem um nome
identificador e um ndice de referncia.
A sintaxe para a declarao de um vetor a seguinte:
tipo nome[tam];
onde: tipo o tipo dos elementos do vetor: int, float, char, etc. nome o
identificador do vetor. tam o tamanho do vetor, isto , o nmero de elementos que o vetor
pode armazenar.
As regras de nomenclatura de vetores so as mesmas usadas em variveis.

Referncia a Elementos de um Vetor
Cada elemento do vetor referenciado pelo nome do vetor seguido de um ndice
inteiro. O primeiro elemento do vetor tem ndice 0 e o ltimo tem ndice tam - 1. Ou seja, se
declararmos um vetor de 20 posies, o acesso aos elementos so feitos da posio 0 at a
posio 19.
;
Inicializao de Vetores
Assim como podemos inicializar variveis (por exemplo: int j = 3;), podemos inicializar
os vetores. A sintaxe para a inicializao dos elementos de um vetor :
tipo nome[tam] = {lista de valores};
onde: lista de valores uma lista de nmeros, separada por vrgulas, dos valores de
cada elemento do vetor.
TPA Engenharia www.tpaengenharia.com.br 26


Preenchendo um Vetor
Para se preencher um vetor bastante simples. Basta utilizar da Estrutura de
Repetio for. O exemplo logo abaixo ilustra o procedimento:

Passando Vetores para Funes
Vetores, assim como variveis, podem ser usados como argumentos de funes.
Vejamos como se declara uma funo que recebe um vetor e como se passa um vetor para
uma funo.
Na passagem de vetores para funes usamos a seguinte sintaxe:
nome_da_funo(nome_do_vetor)
onde: nome_da_funo o nome da funo que est sendo chamada.
nome_do_vetor o nome do vetor que queremos passar. Indicamos apenas o nome do vetor,
sem ndices.
Na declarao de funes que recebem vetores, temos:
tipo_funo nome_funo(tipo_vetor nome_vetor[])
{
...
}
onde: tipo_funo o tipo de retorno da funo. nome_funo o nome da funo.
tipo_vetor o tipo de elementos do vetor. nome_vetor o nome do vetor. Observe que
depois do nome do vetor temos um ndice vazio [] para indicar que estamos recebendo um
vetor.
TPA Engenharia www.tpaengenharia.com.br 27


O exemplo acima ilustra como se passa vetores como parmetros de funes.
Comento mais uma vez que a funo captura_numero() apenas simblica afim de facilitar
os nossos exemplos.
Matrizes
Vetores podem ter mais de uma dimenso, isto , mais de um ndice de referncia.
Podemos ter vetores de duas, trs, ou mais dimenses, nestes casos, estes so chamados de
matrizes. Podemos entender um vetor de duas dimenses (por exemplo) associando-o aos
dados de uma tabela.
Declarao e Inicializao de Matrizes
A declarao e inicializao de vetores de mais de uma dimenso feita de modo
semelhante aos vetores unidimensionais.
A sintaxe para declarao de vetores multidimensionais :
tipo nome[tam_1][tam_2]...[tam_N]={{lista},{lista},...{lista}};
onde: tipo o tipo dos elementos do vetor. nome o nome do vetor.
[tam_1][tam_2]...[tam_N] o tamanho de cada dimenso do vetor. {{lista},{lista},...{lista}} so
as listas de elementos.
Veja algumas declaraes e inicializaes de vetores de mais de uma dimenso.
Observe que a inicializao de nota gera a tabela do exemplo do incio desta seo.
TPA Engenharia www.tpaengenharia.com.br 28


Passagem de Matrizes para Funes
A sintaxe para passagem de matrizes para funes semelhante a passagem de
vetores unidimensionais: chamamos a funo e passamos o nome do vetor, sem ndices.
Na declarao de funes que recebem matrizes:
tipo_f funo(tipo_m matriz[tam_1][tam_2]...[tam_n])
{
...
}
Observe que depois do nome da matriz temos os ndices contendo os tamanhos de
cada dimenso da matriz.
Observe o exemplo abaixo:

Strings
String uma das mais importantes formas de dados em C e usada para armazenar e
manipular textos como palavras, nomes e sentenas. String um vetor do tipo char terminado
pelo caracter NULL (\0), ou seja, string uma srie de caracteres armazenados em seqncia,
onde cada um ocupa um byte de memria, toda string terminada por um byte de valor zero
(\0). Cada caracter um elemento independente e pode ser acessado atravs de um ndice.
TPA Engenharia www.tpaengenharia.com.br 29


Como strings so vetores, tudo relacionado a vetores poder ser aplicado para as
strings.

TPA Engenharia www.tpaengenharia.com.br 30

Apresentao do CCS
O Compilador CCS
O CCS o principal programa a ser utilizado ao longo do nosso curso. Possui um
ambiente de programao e ferramentas de desenvolvimento bastante intuitivo. um
Compilador em Linguagem C com ferramentas necessrias para a programao dos
Microcontroladores PIC.

Figura 9: Tela Principal do CCS.
Diversos Mdulos internos dos Microcontroladores PIC como, por exemplo,
Comunicao Serial RS232, I2C, SPI, Conversores A/D, Timers e EEPROM, so de fcil
utilizao devido o CCS conter Bibliotecas Especficas para manipulao dos mesmos,
facilitando a programao e o desenvolvimento de projetos.
Funes para utilizao de diversos circuitos integrados como Relgio de Tempo Real,
Conversores D/A, Memrias Flash, Potencimetros Digitais, Mdulos de Comunicao
Ethernet, entre outros, tambm fazem parte do Pacote de Funes do CCS. Bibliotecas de
Funes Matemticas tambm esto inclusas.
Abrindo e Salvando Arquivos
Para abrir e salvar arquivos relacionados com o CCS faz-se da mesma forma que em
qualquer programa no formato padro do Windows. As opes para Abrir (Open) e Salvar
(Save) arquivos so acessados atravs do cone em formato de pasta, no canto superior
esquerdo da Tela Principal do CCS.
TPA Engenharia www.tpaengenharia.com.br 31


Figura 10: Abrindo e Salvando arquivos no CCS.
Compilando os Programas
Para compilar o programa, basta acessar a Aba Compile. Um conjunto de opes
ser fornecido e, dentre elas, basta clicar no cone denominado Compile.

Figura 11: Compilando os Programas.
Ferramentas Auxiliares de Desenvolvimento
Dentre as vrias Ferramentas de Desenvolvimento do CCS podemos citar duas que
vo ser de uso freqente pelo estudante e/ou programador. Para acess-las basta clicar sobre
a aba Tools. Dentre as opes disponveis as ferramentas que mais nos interessam so:
Numeric Converter (Conversor Numrico) e o Serial Port Monitor (Monitor de Porta
Serial). Essas duas ferramentas sero utilizadas posteriormente quando for necessrio
executar a converso de valores Decimais para Hexadecimal ou Binrio, para o caso do
Numeric Converter. Quando for necessria a utilizao de Comunicao Serial RS232 entre
Microcontrolador e Computador utilizaremos o Serial Port Monitor.

Figura 12: Ferramentas Auxiliares de Desenvolvimento.
TPA Engenharia www.tpaengenharia.com.br 32

O PIC Wizard
CCS possui um Assistente de Configuraes denominado PIC Wizard. Ele nos
permite configurar vrios dos recursos e mdulos disponveis no Microcontrolador, tais como:
Freqncia de Operao, Interrupes, Comunicao, Timers, Conversor A/D, entre outros.
Isso tudo de uma maneira bastante intuitiva e de simples operao.
O PIC Wizard ser tratado em um tpico posterior denominado Criando um Novo
Projeto o Assistente de Configuraes PIC Wizard.
Tpicos de Ajuda do CCS
Para acessar os Tpicos de Ajuda do CCS basta clicar sobre o cone , localizado no
canto superior esquerdo da Tela Principal e, logo em seguida, clicar em Contents.

Figura 13: Tpicos de Ajuda.
Criando Projetos no CCS
A Escolha do Microcontrolador (MCU)
Ao desenvolver aplicaes com MCU necessrio conhecer o Processo no qual o
mesmo ir atuar. Assim, tambm de extrema importncia que o programador saiba, antes da
escolha do MCU, como o MCU ir interferir no Processo a ser controlado.
Por exemplo: Controle de Temperatura de uma Estufa para Plantas. Faixa de
Operao: 28 a 32 graus Celsius. A temperatura ser mostrada em um Grfico no Computador.
A comunicao entre Computador e MCU ser realizada via Comunicao Serial RS232.
Nesse processo, sabemos que vamos medir a temperatura de uma Estufa. Sendo
assim, precisamos escolher um Sensor de Temperatura que se enquadre no processo,
respeitando caractersticas de temperatura do ambiente a ser monitorado. Assim, escolhemos
um sensor analgico e utilizamos um Mdulo Conversor A/D ou utilizamos um Sensor de
Temperatura Digital com comunicao SPI ou I2C, entre outros tipos. Como vamos medir
temperaturas relativamente baixas (prximas a 30 graus Celsius) podemos utilizar um sensor
de temperatura digital com comunicao SPI, o que muito comum no mercado. Como no
se consegue uma grande variao da grandeza fsica Temperatura em um pequeno intervalo
de tempo, no nosso exemplo medir a temperatura de 5 em 5 segundos j nos o suficiente.
Sendo assim, necessitamos de uma base de tempo que nos ajude a calcular este tempo de 5
segundos. Isso realizado a partir de um Mdulo Temporizador. A comunicao entre
Computador e MCU ser realizada a partir de um Mdulo RS232.
TPA Engenharia www.tpaengenharia.com.br 33

Com base no processo acima, devemos escolher um MCU que possua os Mdulos:
Temporizador (Timer), Comunicao Serial RS232 (USART Transmissor e Receptor
Universal Sncrono e Assncrono) e SPI/I2C (SPI, I2C ou SSP SPI + I2C).
Caractersticas como o tamanho da Memria de Programa, Memria RAM, Consumo
de Energia (no caso de equipamentos alimentados bateria) e velocidade do Processador
tambm devem ser consideradas na escolha de um MCU. Projetos que envolvam algum tipo
de comunicao com Protocolos densos ou programas que executem muitos Clculos
Matemticos exigem maior velocidade de processamento e maior capacidade de memria. Na
prtica, nesse caso, teramos: um Processador de 5MIPS (Milhes de Instrues Por Segundo)
ou mais; Memria RAM igual ou superior a 1KB; Memria de Programa igual ou superior a
16KB. Esta configurao, dependendo do processo, seria uma boa aproximao para a
escolha do MCU. No caso de aplicaes mais simples um Processador trabalhando a 1MIPS,
Memria de Programa de 8KB e Memria RAM de 368bytes o suficiente.
Em resumo, para a escolha de um MCU, podemos citar:
Caractersticas do Processo a ser empregado;
Custo das Ferramentas de Desenvolvimento;
Custo do Microcontrolador;
Quantidade de I/Os Digitais;
Quantidade de I/Os Analgicas;
Perifricos de Comunicao;
Capacidade de Memria de Programa;
Capacidade de Memria RAM;
Velocidade de Operao;
Fontes de Interrupo (internas e externas);
Facilidade de compra;
Facilidades no Desenvolvimento.
Aps alguns projetos realizados, o estudante e/ou programador ir adquirir experincia
o bastante para dimensionar o melhor MCU para a sua aplicao. Graas Flexibilidade da
Linguagem C, boa parte do programa poder ser escrito antes mesmo de se ter certeza
absoluta de qual MCU ser utilizado. Podemos escrever um programa voltado para o
PIC16F84A e, caso o mesmo no nos atenda em funo do tamanho da Memria requerida
pelo nosso aplicativo, alteramos poucas linhas de cdigo para mudarmos para o PIC16F877A,
por exemplo.
Criando um Novo Projeto o Assistente de Configuraes PIC Wizard
Como o nosso curso est voltado para aplicaes com o PIC16F877A e ele atende
todas as especificaes do nosso exemplo acima (Controle de Temperatura de uma Estufa
para Plantas), vamos mostrar como criar um Projeto para o PIC16F877A.
Vamos dar nfase somente aos itens principais do CCS e que sero utilizados com
maior freqncia durante o curso. Tudo o que est relacionado neste tpico poder ser
aplicado a qualquer Microcontrolador PIC. Assim, fica de encargo do estudante e/ou
programador desfrutar de todas as outras opes e ferramentas do programa em questo.
No canto superior direito da Tela Inicial, na aba Project, clique no cone PIC
Wizard.
TPA Engenharia www.tpaengenharia.com.br 34


Figura 14: O Assistente de Configuraes PIC Wizard.
Logo em seguida abrir uma tela com o nome Salvar Como. Nesta tela voc indicar
o nome do Projeto e onde sero salvos os arquivos gerados pelo CCS.

Figura 15: Escolha do Nome e Diretrio do Projeto.
Logo aps indicar o diretrio dos arquivos, abrir uma nova janela como o nome PIC
Wizard. nela em que fazemos as principais configuraes do MCU. O PIC Wizard possui
ferramentas necessrias para efetuarmos boa parte das configuraes do MCU.

TPA Engenharia www.tpaengenharia.com.br 35

Figura 16: Tela Inicial do PIC Wizard.
Na tela inicial do PIC Wizard, esquerda da tela, temos um conjunto de Opes. Na
Opo General faz-se a seleo do MCU a ser utilizado e configuramos parte do seu
Hardware.
Selecione o MCU a ser utilizado na aplicao atravs da Opo Device. No nosso
caso selecionaremos o PIC16F877A.
Na opo Oscilator Frequency insira o valor do Cristal a ser utilizado. No caso do Kit
de Desenvolvimento utilizado deixaremos o valor default de 20.000.000Hz (20 Mega Hertz).
O campo Fuses contm diversas propriedades do MCU como caractersticas do
Oscilador, Deteco de Baixa Tenso, reset dos timers ao se energizar o MCU, reset por
MCLR habilitado, etc. Essas propriedades mudam de acordo com o MCU selecionado em
Device.
Para o nosso exemplo, vamos escolher a opo High speed Osc (>4mhz) e marcar
a opo Power Up Timer.

Figura 17: Seleo do MCU e Configuraes.
Na aba Code, visualizamos o cdigo em C gerado pelo PIC Wizard. Isto bastante
til, pois muitas vezes j temos um projeto em andamento e necessitamos alterar algumas das
configuraes do MCU. Caso no saibamos qual o cdigo a ser inserido, basta recorrermos
ao PIC Wizard e copiarmos o cdigo em questo.
TPA Engenharia www.tpaengenharia.com.br 36


Figura 18: Cdigo em C das configuraes do MCU gerado.
esquerda da tela do PIC Wizard, temos a Opo Communications. Nesta
fazemos a configurao das Comunicaes RS232 e I2C.
Por default, a opo Use RS232 est marcada (habilita o hardware de comunicao
RS232). Caso no se queira utilizar a porta serial RS232 do PIC esta opo dever ser
desmarcada. O campo Baud indica a velocidade de transmisso e recepo de dados do
hardware. Existem diversas opes como: 9600, 19200, 38400 e 115200, entre outros. No
nosso caso utilizaremos o Baud de 115200. Atravs das opes Transmit e Receive,
selecionamos os pinos de transmisso (TX) e recepo (RX) de dados, respectivamente. Esses
so pinos especficos de comunicao do MCU. No caso do MCU em questo, os pinos de TX
e RX so os pinos RC6 e RC7, respectivamente. Logo, em Transmit deixaremos como C6 e
em Receive o C7. No campo Stream, damos nome porta de comunicao em questo.
Quando utilizamos em um projeto mais de uma porta de comunicao RS232 (existem MCUs
com 4 USART), esta opo de extrema importncia pois configura o canal de comunicao a
ser utilizado para se transmitir dados.
Por default, a opo Use I2C est desabilitada (hardware I2C desabilitado). A
princpio no utilizaremos o hardware I2C. Portanto, deixaremos esta opo desmarcada.
Ressalto novamente que para visualizar o cdigo gerado basta clicar na aba Code.
TPA Engenharia www.tpaengenharia.com.br 37


Figura 19: Configuraes do Hardware de Comunicao Serial RS232.
Para realizarmos a leitura do nosso sensor de temperatura atravs da SPI temos que
configur-la. Isso feito a partir da opo SPI and LCD. Os parmetros de configurao da
SPI so mostrados na tela logo aps clicarmos na opo SPI and LCD. Feito isso, habilite a
opo Hardware SPI#1 e selecione a opo Master. Isso habilitar o Hardware SPI do
MCU e o mesmo trabalhar como Mestre, ou seja, ser responsvel por comandar o processo
de comunicao SPI, que no nosso exemplo ocorre entre sensor de temperatura e MCU. As
opes Spi Mode e Clock so fundamentais para que a comunicao entre MCU funcione
corretamente. Como estamos apenas em um exemplo de como se criar um projeto no
trataremos esta informao neste instante. Isso ser abordado em um tpico adiante
relacionado Comunicao SPI.

TPA Engenharia www.tpaengenharia.com.br 38

Figura 20: Configuraes do Hardware SPI.
Os Timers so configurados a partir da opo Timers. No campo WDT (Watch Dog)
marque a opo Not used. No campo Timer 1 (timer de 16 bits) habilite a opo Internal e
selecione a resoluo de 1.6us 104ms. Nesta configurao, se contarmos at 50 obtemos
um intervalo de aproximadamente 5 segundos (50 * 104ms = 5200ms = 5,2s) para leitura do
sensor de temperatura citado no nosso exemplo. O Timer utilizado e a sua resoluo so
escolhidos tambm em conseqncia do processo. Existem Timers de 8 bits e de 16 bits. A
melhor escolha dever ser feita pelo programador, diante de cada aplicao.

Figura 21: Configuraes dos Timers.
Para habilitarmos as interrupes, clicamos na opo Interrupts. Assim, todas as
fontes de interrupo do MCU sero listadas. Para o nosso exemplo vamos habilitar as
interrupes RS232 receive data available (dado disponvel no buffer da RS232) e Timer 1
Overflow (estouro do Timer 1 se executarmos esta rotina 50 vezes obteremos o tempo de 5
segundos necessrio para a nossa aplicao).
TPA Engenharia www.tpaengenharia.com.br 39


Figura 22: Habilitando Interrupes.
Desta forma, configuramos o MCU para trabalhar no nosso exemplo: Controle de
Temperatura de uma Estufa para Plantas. Ao clicarmos no boto OK, finalizamos o processo
de Configurao do MCU. Logo em seguida a janela do PIC Wizard ser fechada e um Editor
de Texto, contendo o Cdigo Fonte gerado e o nome do Projeto em questo, ser aberto na
janela principal do CCS.

Figura 23: Editor de Texto do CCS.
TPA Engenharia www.tpaengenharia.com.br 40

Na primeira linha temos o seguinte cdigo:
#include diretrio_do_arquivo\nome_do_arquivo.h.
Desta forma, se mudarmos o diretrio do projeto uma srie de erros poder ocorrer,
pois pode ser que o arquivo no exista no diretrio mencionado pela diretiva #include. Por
isso recomendamos substituir todo o texto que faz referncia ao diretrio do arquivo por um .
(ponto). Desta forma, se mudarmos o diretrio de todo o projeto, no teremos nenhum tipo de
problema. Teremos, portanto:
#include .\nome_do_arquivo.h
Em resumo, se observarmos o cdigo em C gerado, na primeira linha temos:
#include "C:\Documents and Settings\TPA\Desktop\Novo Projeto.h"
O cdigo aps ser alterado ficar da seguinte forma:
#include ".\Novo Projeto.h"

Figura 24: Editor de Texto do CCS com o diretrio do #include alterado.
Parte do cdigo gerado das configuraes do MCU escrito no arquivo apontado na
primeira linha do cdigo fonte. Na Figura X, o arquivo Novo Projeto.h apontado pela diretiva
#include. Se abrirmos este arquivo visualizaremos o cdigo em questo.
TPA Engenharia www.tpaengenharia.com.br 41


Figura 25: Editor de Texto do CCS.
Todo o procedimento de como se criar um novo projeto no CCS est listado e ilustrado
neste captulo. E o mesmo procedimento poder ser seguido a fim de se configurar qualquer
outro MCU da famlia PIC.
Diversas caractersticas dos mdulos internos do PIC foram omitidas, pois este captulo
visa apenas apresentar o assistente de configuraes PIC Wizard e suas principais
ferramentas. Caractersticas exclusivas de cada mdulo e exemplos de outros mdulos
internos, que no foram mencionados neste captulo e que so possveis de serem
configurados pelo PIC Wizard, sero apresentados em tpicos posteriores.
importante que o estudante e/ou programador saiba que cada MCU possui as suas
especialidades como, por exemplo, quantidade de Timers de 8 bits e Timers de 16 bits
disponveis, nmero de entradas analgicas, tipos de comunicao, quantidade de
Entradas/Sadas, etc. Portanto, nem todos os mdulos disponveis num determinado MCU
sero possveis de serem configurados a partir do PIC Wizard. Quando houver a
necessidade de se utilizar um mdulo especfico do MCU que no seja configurvel pelo
assistente de configuraes PIC Wizard, o estudante e/ou programador dever recorrer aos
Tpicos de Ajuda do CCS.

TPA Engenharia www.tpaengenharia.com.br 42

Funes do Compilador CCS
O CCS possui um pacote imenso de funes. Iremos tratar neste captulo apenas as
principais funes que sero utilizadas ao longo do nosso curso. Outras funes sero apenas
comentadas para que o estudante e/ou programador saiba da existncia das mesmas.
O estudante e/ou programador ser encarregado de buscar novas funes ou sanar
dvidas recorrendo aos Tpicos de Ajuda do CCS.
Funes para Configuraes das Entradas e Sadas Digitais
O CCS nos fornece diversas funes que nos permitem configurar as portas do MCU.
Em destaque temos:
Port_a_pullups(CONDIO): habilita ou desabilita os resistores de Pull-Up da porta A.
Somente para dispositivos que tenham esta possibilidade.

Port_b_pullups(CONDIO): habilita ou desabilita os resistores de Pull-Up da Porta B.
Somente para dispositivos que tenham esta possibilidade.

Set_tris_x(VALOR): configura os pinos de I/O da Porta x como Entrada ou Sada
Digital. Para esta funo, temos que: 0 configura o pino como sada e 1 como
entrada. O bit menos significativo de VALOR representa o bit menos significativo da
Porta X.

Get_tris_x(VALOR): verifica a configurao dos pinos da Porta x. Para esta funo,
temos o seguinte: 0 o pino est configurado como sada e 1 como entrada. O bit
menos significativo de VALOR representa o bit menos significativo da Porta X.

Input_state(PINO): verifica o nvel lgico do pino. Esta funo no muda a configurao
do pino. Se o pino em questo estiver configurado como sada digital, por exemplo, ele
permanecer configurado como sada digital. Assim, a funo retornar: 0 se a sada
est em nvel baixo ou 1 se a sada estiver em nvel alto.


TPA Engenharia www.tpaengenharia.com.br 43

Acionamento de Sadas Digitais
Por default, ao utilizar qualquer uma destas funes, o CCS configura todos os pinos
em questo como Sada Digital.
Output_low(PINO): coloca o PINO especificado em nvel lgico baixo (0 Volts).

Output_high((PINO):coloca o PINO especificado em nvel lgico alto (5 Volts).

Output_toggle((PINO): inverte o nvel lgico do PINO especificado.

Output_bit((PINO,VALOR): coloca o PINO especificado em nvel lgico baixo, com
VALOR igual a 0, ou alto, com VALOR igual a 1.

Output_x(VALOR): coloca um byte determinado por VALOR na Porta x.

Leitura de Entradas Digitais
Por default, ao utilizar qualquer uma destas funes, o CCS configura todos os pinos
em questo como Entrada Digital.
Input(PINO): l o nvel lgico do PINO especificado.

Input_x(): l o nvel lgico da Porta x.

TPA Engenharia www.tpaengenharia.com.br 44

Funes de Tempo
Quando precisamos aguardar um determinado tempo para efetuarmos uma
determinada tarefa necessitamos de Funes de Tempo (Delay).
Delay_cycles(TEMPO): gera um delay com resoluo de ciclos de mquina. O valor do
delay, dado em ciclos, especificado por TEMPO.

Delay_us(TEMPO): gera um delay com resoluo de de micro segundos. O valor do
delay, dado em micro segudos, especificado por TEMPO.

Delay_ms(TEMPO): gera um delay com resoluo de de mili segundos. O valor do
delay, dado em mili segudos, especificado por TEMPO.

Funes para Conversor Analgico/Digital
Para manipularmos o Conversor Analgico/Digital do MCU necessitamos de um
conjunto de configuraes. As principais funes para este fim so:
Set_adc_channel(CANAL): seleciona o canal analgico a ser lido pela funo
read_adc().

Read_adc(): realiza a leitura do Canal Analgico selecionado pela funo
set_adc_channel(). O pino a ser lido dever estar configurado como entrada
analgica. Isto feito a partir da funo setup_adc_ports().

Setup_adc_ports(CONFIGURAES): configura os pinos como entradas analgicas
ou no. Estas CONFIGURAES dependem exclusivamente de cada MCU. Assim o
programador dever estar atento para no escolher um ajuste errado para um
determinado modelo. Recomenda-se recorrer ao Datasheet e/ou consultar o arquivo .h
do MCU em questo.
TPA Engenharia www.tpaengenharia.com.br 45


Funes para EEPROM interna
Para acessar a EEPROM interna do MCU utilizamos as seguintes funes:
Read_eeprom(ENDEREO): l uma posio da EEPROM interna determinada por
ENDEREO.

Write_eeprom(ENDEREO,VALOR): escreve na posio ENDEREO da EEPROM
interna o VALOR indicado.

Funes para os Mdulos Timers
Os Mdulos Timers so utilizados quando necessrio uma base de tempo para se
tratar dentro do processo a ser monitorado. Outra importante aplicao dos Mdulos Timers
a de trabalhar como contadores. Nesta configurao, um pino externo especfico responsvel
por incrementar o valor do Timer.
As principais funes utilizadas so:
Setup_timer_x(CONFIGURAES): CONFIGURAES do Mdulo Timer x.

Get_timerx(): l o valor do Mdulo Timer x.

Set_timerx(VALOR): inicializa o VALOR do Timer x.

TPA Engenharia www.tpaengenharia.com.br 46



Funes para Comunicao Serial RS232
Para usar as funes de Comunicao Serial RS232 necessrio utilizar a diretiva
#use rs232. Esta diretiva ser vista em um tpico adiante.
Dentre as funes que manipulam a Comunicao Serial RS232, destacam-se as
seguintes:
Getc(PORTA): l o buffer (apenas 1 byte) da PORTA serial do MCU.

Putc(DADO,PORTA): envia um DADO (apenas 1 byte) na PORTA serial do MCU.

Set_uart_speed(BAUD,PORTA): configura a velocidade de transmisso da PORTA
atravs do parmetro BAUD.

Printf(STRING): envia uma cadeia de dados no formato ASCII determinada em
STRING.

Funes para manipulao de variveis
O CCS nos fornece um conjunto de funes que nos permite manipular de diversas
formas as variveis que criamos ao longo de nossos programas. Dentre elas podemos citar:
Bit_clear(VARIVEL,BIT): coloca nvel lgico baixo (0) no BIT especificado da
VARIVEL.
Bit_set(VARIVEL,BIT): coloca nvel lgico alto (1) no BIT especificado da
VARIVEL.
Bit_test(VARIVEL,BIT): retorna o valor do BIT especificado da VARIVEL.
Isdigit(DADO): verifica se DADO um valor numrico.
Atoi(STRING): converte uma cadeia de caracteres, parmetro STRING, em um valor
do tipo INT.
TPA Engenharia www.tpaengenharia.com.br 47

Atof(STRING): converte uma cadeia de caracteres, parmetro STRING, em um valor
do tipo FLOAT.
Make16(BYTE_HIGH,BYTE_LOW): monta um valor do tipo LONG a partir dos 2 bytes
passados como parmetros.
Make8(VALOR,INDEX): extrai um byte de VALOR.
Funes para manipulao de Interrupes
Para o tratamento de interrupes, as principais so:
Enable_interrupts(INTERRUPO): habilita a INTERRUPO passada como
parmetro.
Disable_interrupts(INTERRUPO): desabilita a INTERRUPO passada como
parmetro.
Clear_interrupt(INTERRUPO): limpa o Flag indicador de ocorrncia de
INTERRUPO.
Ext_int_edge(BORDA,EXTx): configura a BORDA de ocorrncia da Interrupo
Externa x.

TPA Engenharia www.tpaengenharia.com.br 48

Programao Aplicada a Microcontroladores PIC com o
Compilador CCS
Introduo
Neste captulo trataremos de diversas funcionalidades do Compilador CCS e de
diversos Mdulos Internos do Microcontrolador PIC16F877A, objeto de nossos estudos. Todos
os exemplos que sero ilustrados neste captulo so baseados no Kit de Desenvolvimento
de extrema importncia que o estudante tenha uma boa base terica da Linguagem
C, abordada em outros tpicos, e que compreenda o que for abordado em cada seo, pois
tpicos futuros dependero exclusivamente desses nossos primeiros e simples programas.
Controlando I/Os Digitais
O primeiro programa que iremos demonstrar uma espcie de pisca-pisca. um
exemplo bastante simples, mas ser til para o programador ao longo de qualquer programa,
independente de sua complexidade.
Independente se vai acender um LED, acionar um Rel ou partir um Motor Trifsico, os
comandos para estes fins so os mesmos. Sendo assim, se o estudante e/ou programador
entender os procedimentos tratados neste exemplo estar apto atuar em qualquer um dos
dispositivos mencionados acima. Os principais comandos utilizados para controle de Sadas
Digitais so:
output_low(pino);
output_high(pino);
output_toggle(pino);
output_bit(pino,valor);
output_a(valor);
output_b(valor);
...
Para leitura das entradas digitais, temos:
Input(pino);
Input_a();
Input_b();
...
Para este programa, s usaremos as configuraes gerais (general) do PIC Wizard.
Crie um novo projeto no CCS utilizando o PIC Wizard. Qualquer dvida de como se criar um
novo projeto consulte os Tpicos relacionados ao PIC Wizard do CCS.
Ao criar o novo projeto, altere as seguintes configuraes:
Device: PIC16F877A
Fuses: High speed osc (>4MHz)
Oscilator Frequency: 20.000.000
Ao finalizar, insira no projeto a biblioteca de auto-programao (bootloader.h). Logo
em seguida, escreva o cdigo relativo ao pisca-pisca, logo abaixo da linha de configuraes
do MCU.
Exemplo de um LED piscando a 0,5Hz:
#include ".\nome_do_projeto.h" //Biblioteca dos Fuses do Projeto
#include <bootloader.h> //Biblioteca para Auto-Programao
TPA Engenharia www.tpaengenharia.com.br 49


void main()
{
//configuraes do MCU
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

//cdigo para o pisca-pisca
while(true){
output_low(PIN_D4);
delay_ms(1000);
output_high(PIN_D4);
delay_ms(1000);
}
}

Existe uma funo que j inverte o valor do pino. Abaixo segue o cdigo do loop infinito
com esta funo:
//cdigo para o pisca-pisca
while(true){
output_toggle(PIN_D4);
delay_ms(1000);
}

Exemplo: acionando um LED a partir do comando de uma chave.
#include ".\nome_do_projeto.h"
#include <bootloader.h>

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

while(true){
if(input(PIN_D0))
output_high(PIN_D4);
else
TPA Engenharia www.tpaengenharia.com.br 50

output_low(PIN_D4);
}
}

O cdigo acima tambm pode ser feito utilizando-se da funo output_bit.

while(true){
output_bit(PIN_D4,input(PIN_D0));
}

Controle de Display de LCD de Caracteres
O Display de LCD um componente eletrnico digital que pode ser controlado
utilizando as mesmas funes de controle de I/Os Digitais mencionadas anteriormente.

Figura 26: Display de LCD 16x2 Caracteres.

Figura 27: Descrio da Pinagem do Display.
TPA Engenharia www.tpaengenharia.com.br 51


Figura 28: Diagrama de Tempos.
As rotinas de controle do display so desenvolvidas a partir dos ciclos de escrita
mostrados logo acima. Existem bibliotecas com estas rotinas implementadas e facilmente
encontradas na internet. No entanto, usaremos uma biblioteca desenvolvida na TPA
Engenharia que a Visor.h.
Antes de incluir a biblioteca devemos definir os pinos do MCU para cada pino do
display LCD (RS, E, D4 ao D7) , incluir a biblioteca visor.h. Esta biblioteca deve ser inserida
na pasta do projeto a ser executado. Para se utilizar o display, deve-se executar as rotinas
lcd_ini() e liga_display() no programa principal.
Principais funes disponveis na biblioteca visor.h:
lcd_escreve(a) - deve ser passada como parmetro da funo printf. O parmetro a
podem ser caracteres ou variveis
pos_linha(a) - Posiciona o cursos na linha a
limpa_linha(a) - Limpa a linha a
LCD_pos_xy(a,b) - Posiciona o cursor na coluna a e na linha b
Exemplo: Escrevendo Mensagem no Display
#include ".\nome_do_projeto.h"
#include <bootloader.h>

#define lcd_d4 PIN_A2
#define lcd_d5 PIN_A4
#define lcd_d6 PIN_A5
#define lcd_d7 PIN_E0
#define lcd_enable PIN_E2
#define lcd_rs PIN_E1
#define lcd_type 2
#define lcd_seg_lin 0x40
#include ".\visor.H"

void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
TPA Engenharia www.tpaengenharia.com.br 52

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

lcd_ini();
delay_ms(10);
liga_display();

lcd_pos_xy(3,1);
printf(lcd_escreve,"Hello World");
pos_linha(2);
printf(lcd_escreve,"From PIC16F877A");

delay_ms(3000);

limpa_linha(1);
limpa_linha(2);
pos_linha(1);
printf(lcd_escreve,"Bootloader no");
pos_linha(2);
printf(lcd_escreve,"pino RD0");
while(true){}
}

Entradas Analgicas
O PIC16F877A possui 8 Canais Analgicos multiplexados em um nico Conversor
Analgico/Digital de 10 bits. As tenses de referncia do conversor podem ser externas,
atravs de pinos especficos, ou internas (prpria alimentao do MCU). Para o caso de
referncia externa, esta deve respeitar os limites da alimentao que, no nosso caso, estar
entre 0 e 5volts.
Os principais comandos para manipulao dos conversores A/D so:
Set_adc_channel(canal);
Read_adc();
Exemplo: Leitura de um Potencimetro
Usaremos a seguinte configurao para os canais analgicos (analog):
A0
Units 0-1023
Internal 2-6us
Cdigo fonte:
#include ".\nome_do_projeto.h"
#include <bootloader.h>

#define lcd_d4 PIN_A2
#define lcd_d5 PIN_A4
#define lcd_d6 PIN_A5
#define lcd_d7 PIN_E0
#define lcd_enable PIN_E2
TPA Engenharia www.tpaengenharia.com.br 53

#define lcd_rs PIN_E1
#define lcd_type 2
#define lcd_seg_lin 0x40
#include ".\visor.H"

void main()
{
int16 conversao;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

lcd_ini();
delay_ms(10);
liga_display();

set_adc_channel(0); // seleciona o canal A/D
delay_us(10);
while(true){
conversao = read_adc();
limpa_linha(1);
pos_linha(1);
printf(lcd_escreve,"AD: %04lu",conversao);
delay_ms(100);
}
}

Interrupes
So rotinas especiais que interrompem a execuo do programa para o tratamento de
determinados eventos. O programador no sabe o momento em que a interrupo ir ocorrer,
mas ele sabe o que a rotina realizar quando ela acontecer.
Existem dois tipos de interrupo:
Interrupes Externas: a fonte da interrupo um evento externo ao microcontrolador
(por exemplo um teclado).
Interrupo Interna: a fonte da interrupo um evento interno do microcontrolador
(por exemplo um timer).
As interrupes mais usadas no PIC16F877A so:
External (pino RB0)
On B Change (Pinos RB4 a RB7)
RDA (recebimento de dado na serial)
Timer0, Timer1, Timer2

TPA Engenharia www.tpaengenharia.com.br 54

Para se usar uma determinada interrupo a mesma deve ser habilitada com o
comando: enable_interrupts(nome da interrupo);
Alm de habilitar a interrupo individualmente, o flag global tambm deve ser
habilitado:
enable_interrupts(GLOBAL);
As interrupes tambm podem ser desabilitadas com o comando:
disable_interrupts(nome da interrupo);
Tambm podem ser desabilitadas todas de uma s vez atravs do comando:
disable_interrupts(GLOBAL);
As interrupes podem ser habilitadas e desabilitadas a qualquer momento. Toda
interrupo possui um flag que sinaliza a sua ocorrncia. Aps a execuo da rotina da
interrupo deve-se limpar o seu flag de ocorrncia com o comando:
clear_interrupt(nome da interrupo);
Normalmente a troca de informaes entre as rotinas de interrupes e o programa
principal feita atravs de variveis globais. (declaradas fora do void main)
Exemplo: Interrupo no pino RB0 em borda de subida.
Para este exemplo, ao criar o projeto pelo PIC Wizard devemos marcar, dentro da
guia interrupts, a opo External Interrupt.
#include ".\exemplo_curso.h"
#include <bootloader.h>

#define lcd_d4 PIN_A2
#define lcd_d5 PIN_A4
#define lcd_d6 PIN_A5
#define lcd_d7 PIN_E0
#define lcd_enable PIN_E2
#define lcd_rs PIN_E1
#define lcd_type 2
#define lcd_seg_lin 0x40
#include ".\visor.H"

int16 contador=0;

#int_EXT
EXT_isr()
{
contador++;
clear_interrupt(INT_EXT);
}

void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
TPA Engenharia www.tpaengenharia.com.br 55

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

delay_ms(50);
lcd_ini();
delay_ms(10);
liga_display();
ext_int_edge( L_TO_H );
while(true){
pos_linha(1);
printf(lcd_escreve,"Contador:%04ld",contador);
}
}

Exemplo: Teclado Matricial com interrupo On B Change
Para este exemplo, ao criar o projeto pelo PIC Wizard devemos marcar, dentro da
guia interrupts, a opo Port B any change on B4-B7.
#include ".\nome_do_projeto.h"
#include <bootloader.h>

#define X1 PIN_B1
#define X2 PIN_B2
#define X3 PIN_B3
#define Y1 PIN_B4
#define Y2 PIN_B5
#define Y3 PIN_B6
#define Y4 PIN_B7
#include ".\visor.h"

char tecla='N';

#int_RB
RB_isr()
{
output_high(X1);
output_low(X2);
output_low(X3);
if(input(Y1)){
tecla='1';
goto FIM;
}
if(input(Y2)){
tecla='4';
goto FIM;
}
if(input(Y3)){
tecla='7';
TPA Engenharia www.tpaengenharia.com.br 56

goto FIM;
}
if(input(Y4)){
tecla='*';
goto FIM;
}
output_low(X1);
output_high(X2);
output_low(X3);
if(input(Y1)){
tecla='2';
goto FIM;
}
if(input(Y2)){
tecla='5';
goto FIM;
}
if(input(Y3)){
tecla='8';
goto FIM;
}
if(input(Y4)){
tecla='0';
goto FIM;
}
output_low(X1);
output_low(X2);
output_high(X3);
if(input(Y1)){
tecla='3';
goto FIM;
}
if(input(Y2)){
tecla='6';
goto FIM;
}
if(input(Y3)){
tecla='9';
goto FIM;
}
if(input(Y4)){
tecla='#';
goto FIM;
}

FIM:
output_high(X1);
output_high(X2);
output_high(X3);
delay_ms(50);
clear_interrupt(INT_RB);

}

TPA Engenharia www.tpaengenharia.com.br 57

void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);

delay_ms(50);
lcd_ini();
delay_ms(10);
liga_display();
output_high(X1);
output_high(X2);
output_high(X3);
pos_linha(1);
while(true){
if(tecla!='N'){
if(tecla=='#'){
limpa_display();
pos_linha(1);
}
else{
printf(lcd_escreve," %c",tecla);
}
tecla='N';
}
}
}

Exemplo: Piscando LED com Interrupo por Timer
Iremos utilizar o Timer 1 para o nosso exemplo. Ao criar um novo projeto, deveremos
configurar o Timer 1 da seguinte forma:
Timer 1:
Internal
Resolution 1.6us (overflow 104ms)
Configuraes de interrupes (interrupts)
Timer 1 overflow
Cdigo fonte:
#include ".\nome_do_projeto.h"
#include <bootloader.h>

#define lcd_d4 PIN_A2
TPA Engenharia www.tpaengenharia.com.br 58

#define lcd_d5 PIN_A4
#define lcd_d6 PIN_A5
#define lcd_d7 PIN_E0
#define lcd_enable PIN_E2
#define lcd_rs PIN_E1
#define lcd_type 2
#define lcd_seg_lin 0x40
#include ".\visor.H"

void main()
{
int16 conversao;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

lcd_ini();
delay_ms(10);
liga_display();

set_adc_channel(0); // seleciona o canal A/D
delay_us(10);
while(true){
conversao = read_adc();
limpa_linha(1);
pos_linha(1);
printf(lcd_escreve,"AD: %04lu",conversao);
delay_ms(100);
}
}

Comunicao Serial
Para se estabelecer comunicao entre Computador e Microcontrolador atravs da
interface RS232, devemos inserir um circuito de interface entre eles.

TPA Engenharia www.tpaengenharia.com.br 59

Figura 29: Circuito comunicao RS232.

Os principais comandos relativos porta serial RS232 para o PIC16F877A so:
Putc(dado)
Getc()
Printf(mensagem);
Exemplo: Enviando e Recebendo Dados pela Porta Serial
Usaremos a configurao de comunicao (communications) padro:
Use RS-232
Baud 9600
Parity None
Transmit - C6
Receive - C7
Bits 8
Usaremos a configurao de interrupes (interrupts)
RS232 receive data available
Cdigo Fonte:
#include ".\nome_do_projeto.h"
#include <bootloader.h>

#define led PIN_D4

#int_RDA
RDA_isr()
{
int dado_recebido;
dado_recebido = getc();
if(dado_recebido == 'L') // acende o led D4 ao receber
output_high(led); // o dado 'L'
else if(dado_recebido == 'D')
output_low(led); // apaga o led ao receber o 'D'
}

void main()
{
int i=0;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
TPA Engenharia www.tpaengenharia.com.br 60


printf("Hello World from serial rs232 ");
putc('A');
putc(66);
printf("C");
while(true){
putc(i);
i++;
delay_ms(1000);
}
}

EEPROM
O PIC16F877A possui uma memria no voltil de 256 bytes do tipo EEPROM , ou
seja, que aps ser desligado os dados no so perdidos.
Os comandos para leitura e escrita dessa memria so:
Write_eeprom(endereo,dado);
Read_eeprom(endereo);
Exemplo: Gravando o valor do Potencimetro na EEPROM
Usaremos a seguinte configurao para os canais analgicos (analog):
A0
Units 0-1023
Internal 2-6us


#include ".\exemplo_curso.h"
#include <bootloader.h>

#define lcd_d4 PIN_A2
#define lcd_d5 PIN_A4
#define lcd_d6 PIN_A5
#define lcd_d7 PIN_E0
#define lcd_enable PIN_E2
#define lcd_rs PIN_E1
#define lcd_type 2
#define lcd_seg_lin 0x40
#include ".\visor.H"

#define GRAVAR PIN_B0
#define POTENCIOMETRO 0

void main()
{
int16 valor;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
TPA Engenharia www.tpaengenharia.com.br 61

setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

delay_ms(50);
lcd_ini();
delay_ms(10);
liga_display();
set_adc_channel(POTENCIOMETRO);
while(true){
valor=read_adc();
if(input(GRAVAR)){
write_eeprom(8,valor/256);
write_eeprom(9,valor%256);
delay_ms(100);
}
pos_linha(1);
printf(lcd_escreve,"Atual:%04ld",valor);
pos_linha(2);
printf(lcd_escreve,"Gravado:%04ld",read_eeprom(8)*256+read_eeprom(9));
delay_ms(100);
}
}

TPA Engenharia www.tpaengenharia.com.br 62

Interface com Microcontroladores
Para que um Microcontrolador (MCU) possa atuar em um determinado processo
necessrio que haja uma comunicao entre ele e o mundo externo, cujo qual o mesmo ir
monitorar ou controlar. A esta comunicao damos o nome de Interface.
Por exemplo: se desejamos atuar em um Contator com tenso nominal de 220V ou
acionar um Motor DC de 24V haver a necessidade de um Circuito de Potncia interfaceando o
MCU com a carga a ser acionada, j que o mesmo trabalha com tenso baixa (o mais comum
trabalhar com 5Volts).
Neste captulo trataremos sobre alguns circuitos de interface comuns e utilizados na
prtica.
Interface com LEDs
Os pinos do MCU podem fornecer correntes de at 25 mA. Isso significa que possvel
ligar diretamente um LED a um pino de sada. Para limitar a corrente utiliza-se em srie uma
resistncia de 330 ohms.

Figura 30: Circuito de Interface para LEDs
Para acionar o LED basta colocar o pino conectado ao mesmo em nvel lgico alto
(1). Para deslig-lo colocamos o pino em nvel lgico baixo (0).
Interface para Motores DC e Rels
Muitos projetos requerem a utilizao de motores de corrente contnua (CC) para criar
movimento circular. Existem vrias possibilidades de interfacear motores ao MCU. A interface
com esse tipo de motor a mesma utilizada para acionar pequenos rels.
O circuito abaixo funciona bem com cargas de baixa potncia. No entanto, cargas
indutivas, como motores e rels, introduzem uma grande quantidade de rudos na linha de
alimentao. Por esta razo, utilizamos um Diodo em Anti-paralelo com a carga indutiva, afim
de minimizar os rudos provenientes das tenses reversas geradas no desligamento da carga.

Figura 31: Interface de Acionamento para Motor DC.
TPA Engenharia www.tpaengenharia.com.br 63

Para minimizar ainda mais os rudos, pode-se tambm conectar um Capacitor de
220nF aos terminais da carga indutiva.
Interface com Interruptores

Figura 31: Chaves Fim-de-Curso e Interruptores em Geral.
Existe disponvel no mercado mundial uma enorme variedade de interruptores. Mas a
maior parte possui dois contatos que: esto Normalmente Abertos (NA) ou Normalmente
Fechados (NF). Abaixo temos um exemplo de ligao para esses tipos de interruptores.

Figura 32: Interface para Interruptores em Geral.
Interface com Sensores Resistivos
Para todo sensor do tipo resistivo, ou seja, que varia a resistncia entre seus terminais
para indicar a variao de uma grandeza fsica qualquer, podemos utilizar o circuito ilustrado
logo abaixo.

Figura 33: Interface com Sensores Resistivos.
Entre os tipos de sensores resistivos podemos citar dois tipos comuns: Termistores
(sensores de temperatura) e os LDRs (Resistor Dependente de Luz). Afim de simular um
Sensor do tipo Resistivo, comum utilizarmos de um Potencimetro Analgico.
TPA Engenharia www.tpaengenharia.com.br 64


Figura 34: Potencimetro Analgico.