Professional Documents
Culture Documents
2014
Microcontroladores PIC
1a Edio
Maracana
2014
ii
Copyright 2014
Este livro didtico e aplicado ao estudo das reas de Sistemas Embarcados, especificamente na
rea de Microcontroladores e Dispositivos Perifricos, disponibilizando exemplos de prticas. Todo
esse material protegido pela legislao brasileira de direitos autorais. possvel utilizar o contedo
deste livro em outros meios de comunicao, seja na web ou em publicaes impressas, desde que
tenha a citao explcita de que o material reproduzido de copyright deste livro ou tenha autorizao
expressa do autor, o que inclui as imagens originais deste livro. Reprodues integrais ou parciais do
contedo original deste livro em desrespeito a esses termos e sem autorizao constituem infrao da
legislao de direitos autorais, ao passvel de punio legal. Estes termos se expandem para o material de aula disponibilizado pelo autor, como slides, vdeos e exemplos.
Data de publicao: 01/01/2014
ISBN: 978-85-63953-38-4
Publicado pelo Instituto Federal de Educao, Cincia e Tecnologia do Cear (IFCE)
Brasil, Cear, Maracana, Av. Contorno Norte, 10 - Distrito Industrial
https://itunes.apple.com/br/book/microcontroladores-pic-linguagem/id768997487?mt=11
Cdigo de barras:
iii
Crditos
Autor
Pedro Pedrosa Rebouas Filho
Editor
Pedro Pedrosa Rebouas Filho
Designer Grfico
Jeerson Silva Almeida
Apoio Tcnico
Alisson Monteiro
Diego Moreira
Edson Vieira
Jeerson Silva Almeida
Rafael Alves Barbosa
Editora
Instituto Federal de Educao, Cincia e Tecnologia do Cear - IFCE
iv
Contatos
Os contatos do grupo de desenvolvimento deste livro so:
Agradecimentos
Agradeo Deus pela ddiva da vida, me proporcionando o prazer de viver cada dia
Agradeo aos meus pais, Pedro Pedrosa e Maria Palmira, pelo apoio ao longo de
toda a minha vida me proporcionando a oportunidade de ter bons professores e educadores, em que busco me espelhar;
Grupo de Pesquisa em Sistemas Inteligentes do IFCE pelo apoio tcnico na execuo das
prticas e dos projetos que constituem este livro;
apoio e incentivo publicao deste livro, alm de todo incentivo ao longo da minha formao como aluno, professor e pesquisador desta instituio.
vi
Apresentao
Este livro foi desenvolvido por Pedro Pedrosa Rebouas Filho, o mesmo possui os ttulos
de Doutorado (2013) e Mestrado (2010) em Engenharia de Teleinformtica pela Universidade Federal do Cear (UFC), possui graduao em Tecnologia em Mecatrnica Industrial
(2008) pelo Instituto Federal de Educao Cincia e Tecnologia do Cear (IFCE).
Atualmente Professor do Ensino Bsico, Tcnico e Tecnolgico no IFCE, cargo que ocupa desde 2008 na mesma instituio. No IFCE, o autor atua ministrando aulas nas reas
de Automao e Robtica, o que contempla diversas disciplinas, como Eletrnica Digital,
Eletrnica Analgica, Eletrnica Industrial, Instrumentao, Controladores Lgicos Programveis, Microcontroladores, Dispositivos Perifricos, Robtica com Manipuladores, Robtica Mvel, entre outras.
Este livro surgiu do material das disciplinas de Microcontroladores e Dispositivos Perifricos, material este que abordava assuntos tericos e sugere prticas em diversas reas. A
linguagem adotada ao longo do livro visa aproximar a teoria do leitor, visando que o mesmo possa executar as prticas com sucesso, enriquecendo seu nvel nesta rea do conhecimento.
As prticas deste livro so apresentadas e abordadas em forma crescente de complexidade, portanto sugere-se a execuo das mesmas de forma gradativa, sem saltos. Deste
modo, os degraus do conhecimento sero solidificados um a um, conforme planejado
pelo autor.
Bons estudos.
vii
1
Introduo aos
Microcontroladores
Caractersticas Bsicas
Os Microcontroladores (MCU ou uC) esto praticamente em todo lugar: automveis, avies, brinquedos, TVs, etc. So dispositivos programveis na sua maioria auto-contidos
(sistemas embarcados ou embutidos), possuindo um sistema dentro de um chip, gerando
a sigla SOC do termo em ingls System on a chip.
Estes dispositivos incluem dentro de um nico chip CPU, memria (de dados e de programa), entrada/sada, temporizadores, relgio interno, entre outros herdares especficos.
Deste modo, estes dispositivos de controle possuem baixo preo e alta eficincia. Possuem outras funes diferenciadas e normalmente no encontradas em microprocessadores
top de linha (temporizadores, conversores A/D e D/A, etc). O grande ganho deste dispositivos possuir o Hardware e software integrados em um nico chip.
Estes dispositivos compem sistemas computacionais que controlam os mais diferentes
equipamentos, como por exemplo: controle de estacionamentos, sistemas de automao,
sistemas de segurana.
Possuem como principais caractersticas:
controlador pode ser regravado vrias vezes, inclusive podendo at mesmo se auto-gravar para alguns PICs;
Possui Interrupes, sendo assim, algumas funes podem ser executadas quando
acontece algo importante, suspendendo a operao em execuo para que outras mais
importantes possam ser executadas;
Possui E/S serial, permitindo transmisso e recepo com outros dispositivos atra-
Microcontrolador x Microprocessador
O Microprocessador (MPU) um Circuito Integrado (CI) com milhes de
transistores usados em conjunto para armazenamento e manipulao de
dados, ele compem os computadores, sendo uma das suas peas internas.
Enquanto isto, o Microcontrolador (MCU) um processador especial,
geralmente contm no mesmo chip diversos perifricos, sendo usado na
maior parte das vezes como controle digital.
Deste modo, as principais diferenas so:
MPU necessita de perifricos externos para funcionar, ex. memria RAM, temporizadores.
MCU integra todos os recursos em um nico chip.
10
Caractersticas Bsicas
Os Microcontroladores (MCU ou uC) esto praticamente em todo lugar: automveis, avies, brinquedos, TVs, etc. So dispositivos programveis na sua maioria auto-contidos
(sistemas embarcados ou embutidos), possuindo um sistema dentro de um chip, gerando
a sigla SOC do termo em ingls System on a chip.
Estes dispositivos incluem dentro de um nico chip CPU, memria (de dados e de programa), entrada/sada, temporizadores, relgio interno, entre outros herdares especficos.
Deste modo, estes dispositivos de controle possuem baixo preo e alta eficincia. Possuem outras funes diferenciadas e normalmente no encontradas em microprocessadores
top de linha (temporizadores, conversores A/D e D/A, etc). O grande ganho deste dispositivos possuir o Hardware e software integrados em um nico chip.
Estes dispositivos compem sistemas computacionais que controlam os mais diferentes
equipamentos, como por exemplo: controle de estacionamentos, sistemas de automao,
sistemas de segurana. Pode-se citar que um carro mdio possui 15 MCU, um carro de
luxo em torno de 64 MCU, alm dos diversos dispositivos como celulares, microondas,
ventilador, porto automtico, entre tantos outros.
Possuem como principais caractersticas:
controlador pode ser regravado vrias vezes, inclusive podendo at mesmo se auto-gravar para alguns PICs;
Possui Interrupes, sendo assim, algumas funes podem ser executadas quando
acontece algo importante, suspendendo a operao em execuo para que outras mais
importantes possam ser executadas;
11
Possui E/S serial, permitindo transmisso e recepo com outros dispositivos atra-
Microcontrolador x Microprocessador
13
Processador
Unidade de Controle
Conjunto de Instrues
Registradores
Memria
Barramentos de comunicao
Processador
Aes a serem executadas pelo processador so:
14
Registradores
So de dois tipos bsicos:
Reg. de propsito geral: usado pelo programador para fins diversos. Ex.: operando, informao de operao, operaes sobre a pilha, endereamento.
Registradores de Configurao
o
Entre outros.
Tipos bsicos
"
"
"
"
Quando ocorre uma interrupo, salto ou alguma parada na execuo do programa, o PC que indica qual instruo ser executada, e qual ponto do programa
a execuo est.
Muito utilizada na arquitetura Pipeline, pois este registro armazena a prxima instruo.
16
Unidade de Controle
Duas tarefas bsicas:
#
Sequenciamento: dirige o processador para que execute uma srie de microoperaes na sequncia apropriada.
Ela opera atravs da ativao de sinais de controle, sendo os sinais de entrada e de barramento do controle de sada.
!
Entrada:
o
Sinais Internos
Conjunto de Instrues
o
Para facilitar programao, criou-se representao simblica (mnemnicos), denominada de Linguagem Assembly.
17
Montador x Compilador
Os dois tipos de programa so usados para gerar o arquivo (*.hex) que serve para gravar
os comandos de execuo dentro do Microcontrolador. Entretanto, as caractersticas bsicas de cada um dos programas so:
!
Montador
Apenas MONTA o cdigo com as funes reconhecidas pelo hardware, fazendo TUDO
com elas.
!
Compilador
Compilador utilizando
Linguagem C
Assembly x Linguagem C
As duas linguagens mais comuns para programao de Microcontroladores so Assembly
e C, e as principais diferenas entre ambas so:
es mais complexas;
19
Tipos de memria
Existem diversos tipos de memria quando se trata de Microcontroladores, em que as
principais so apresentadas e descritas a seguir:
!
O processador s l os dados
Memria apagvel por luz ultra-violeta e por tenso eltrica (15 a 30V)
Pode ser gravada n vezes por gravador EEPROM, em que n definido pelo fabricante
21
Arquitetura Princeton
o
Arquitetura Harward
o
22
Linguagem C x Assembly
es mais complexas;
Montador x Compilador
Os dois tipos de programa so usados para gerar o arquivo (*.hex) que serve para gravar
os comandos de execuo dentro do Microcontrolador. Entretanto, as caractersticas bsicas de cada um dos programas so:
!
Montador
23
Apenas MONTA o cdigo com as funes reconhecidas pelo hardware, fazendo TUDO
com elas.
!
Compilador
24
Tipos de Memria
O processador s l os dados
25
Memria apagvel por luz ultra-violeta e por tenso eltrica (15 a 30V)
Pode ser gravada n vezes por gravador EEPROM, em que n definido pelo fabricante
Obs 1: Alguns MCU conseguem escrever nesta memria ao longo da execuo do programa, so chamados de memria EEPROM flash
Obs 2: As memrias PROM, EPROM e EEPROM no apagam seu contedo quando retira-se a alimentao.
26
Arquitetura
27
Arquitetura Princeton
o
Arquitetura Harward
o
28
Funcionamento do Microcontrolador
Para apresentar o funcionamento do Microcontrolador ser apresentado o modo de funcionamento pipeline, os ciclos de mquina e por fim, um resumo de funcionamento do
hardware.
Pipeline
Este modo de funcionamento de alguns Microcontroladores permitem utilizar alguns modos de arquiteturas especficos de software e hardware, aumentando a velocidade de processamento do Microcontrolador. Deste modo, algumas caractersticas so apresentadas
a seguir:
Abordagem simples: instrues com dois estgios. Enquanto o sistema executa uma
instruo, outra pode ser buscada na memria. Muito usada nos processadores atuais,
agilizando a execuo de operaes.
Problema: tempo de execuo , em geral, maior que tempo de busca (estgio de busca tem que esperar algum tempo.
29
Ciclos de mquina
Toda instruo executada em um ciclo de mquina (CM), em que um ciclo constitudo
pelas etapas Q1, Q2, Q3 e Q4, conforme descrito abaixo:
30
Funcionamento do Microcontrolador
O funcionamento de um Microcontrolador o resultado de cada componente que o ntegra, sendo assim, o funcionamento de cada um descrito a seguir.
!
dos os clculos que envolvam registros e ou lgica para tomada de decises. Ligada e controlada pela CPU.
!
Memria de dados, Registradores de configurao, Registradores Internos, Contador de programa, registro de endereo e de dados, etc.
!
CPU : Responsvel por todo o processamento de dados do Microcontrolador. Interpreta os comandos. Faz a leitura de dados. Ativa as portas de I/Os ou perifricos.
Possui conjunto de instrues prprio
31
2
Linguagem C para
Microcontroladores PIC
Nesta primeira etapa, uma reviso sobre linguagem C realizada, abordando conceitos
bsicos de sintaxe, tipos de dados, funes, vetores, entre outros pontos importantes. O
compilador utilizado ao longo deste material o CCS C, sendo este utilizado pela facilidade do uso e da fcil aplicabilidade da linguagem C na configurao e operao dos Microcontroladores.
32
Compilador CCS C
Plataforma: Windows;
- Mdulos:
Menu File
Item
New
Open
Close
Funo
Cria um novo arquivo
Abre um arquivo para o editor. Opes: Source, Project, Output, RTF, Flow Chart, Hex ou
Text. Atalho: Ctrl+O
Fecha o arquivo atualmente aberto na janela do editor. Note-se que enquanto um arquivo
est aberto para edio do PCWH nenhum outro programa pode acess-lo. Atalho: Shift+F11
Close All
Save
Save As
Save All
Compele o usurio a editar o nome e o local de armazenamento do arquivo que est em uso
antes que ele seja efetivamente salvo
Salva todos os arquivos abertos no PCWH
Gera um arquivo criptografado. A diretiva #include do compilador padro aceita os arquivos
Encrypt
com esta extenso e descriptografa durante a leitura. Isto permite distribuir arquivos sem
repassar o cdigo fonte
Print
Recent Files
Exit
34
Aba Project
Item
Project
Funo
Abre um arquivo de um projeto existente (.PJT)
Este comando uma via rpida para iniciar um novo projeto. Uma janela ser aberta com
PIC Wizard
24 bit
Tambm serve para iniciar um novo projeto, tal como o comando anterior, com a diferena
Wizard
Create
globais etc
Aba Compile
Item
Compile
Funo
Compila o programa atravs de erros, e gera o arquivo *.hex para carregar no Microcontrolador
35
Aba View
Item
Funo
Valid Interrupts
Valid Fuses
Special Register
36
37
Comentrios
Os comentrios so partes do arquivo que o compilador no ir executar, ignorando-os na execuo. Para identificar existe duas maneiras, comentrio em
linha e em bloco.
Uma linha:
Exemplo:
Em bloco:
Exemplo:
/*
IFCE Maracana
Microcontroladores
Tudo que est em vermelho um comentrio em bloco
*/
38
Identificadores
Identificadores so palavras usadas para declarar uma constante ou uma varivel, possuindo as seguintes regras no compilador CCS utilizando a linguagem C:
Um identificador no pode ter smbolos grficos, com exceo do underline (_);
No poder haver acentuao grfica (acento grave, acento agudo, til, trema, circunflexo
ou cedilha);
Um identificador no pode ser iniciado por nmero;
No pode ser uma palavra reservada;
Identificadores da Linguagem C:
auto
default
float
register
struct
volatile
break
do
return
switch
while
case
double
goto
short
typedef
else
if
signed
union
const
enum
int
sizeof
continue
extern
long
static
void
unsigned
char
for
39
TIPO
TAMANHO EM BITS
MNIMO
MXIMO
char
255
int
255
float, float32
32
-1,510-45
3,41038
void
sem valor
sem valor
40
Modificadores de tipo
So usados para conferir caractersticas especiais aos tipos de dados bsicos. So eles:
MODIFICADO
R
DESCRIO
signed
unsigned
short
long
modificado
TIPO
int1
boolean
DESCRIO
Especifica valores de 1 bit (equivale ao short int)
Especifica valores booleanos de 1 bit (equivale ao short int e ao int1)
int8
byte
int16
int32
41
TAMANHO EM BITS
FAIXA DE VALORES
0 ou 1
char
0 a 255
signed char
-128 a 127
unsigned char
0 a 255
0 a 255
-128 a 127
0 a 255
16
0 a 65.535
16
-32.768 a 32.767
16
0 a 65.535
int32
32
0 a 4294967295
signed int32
32
unsigned int32
32
0 a 4294967295
float
32
-1,51045a 3,41038
-2147483648 a
2147483647
42
Declarao de variveis
Declarar varveis significa criar variveis para serem utilizadas como dados. Para o compilador significa alocar o espao de memria que ser utilizado. O local de memria atribudo a cada dado separadamente para cada varivel criada, ou melhor, declarada. Para
isto, existe duas maneiras:
Ao mesmo tempo que se declara uma varivel tambm possvel inicializar as mesmas
com algum valor. Deste modo, a inicializao de variveis na declarao pode ser feito da
seguinte maneira:
As variveis podem ser declaradas em 3 pontos distintos do programa: local, global e parmetro formal de funo.
Varivel global: declarada no corpo principal do programa (fora de qualquer funo, inclusive da main), podem ser acessadas de qualquer ponto do programa;
43
Varivel local: declarada dentro de uma funo (ou rotina), podendo ser acessadas somente enquanto a rotina estiver em operao ou execuo;
Varivel parmetro de funo: tipo especial de variveis locais, que assumem os valores passados como entrada na chamada das funes.
44
Declarao de constantes
Existe alguns tipos de dados que so declarados e criados, porm no variveis. Estes dados so chamados de constantes e so declarados antes da funo main e seu valor ser
o mesmo em toda a execuo do programa, no aceitando modificaes. Existe duas maneiras de declarar estes tipos de dados:
REPRESENTAO
NUMRICA
EXEMPLO
Decimal
250
Hexadecimal
0x55
Binrio
Octal
Caractere
String
0b10100011
73
&
teste
45
Operadores na Linguagem C
Atribuio
Operador de atribuio =: atribuio de valores a variveis. A atribuio de um valor a
uma varivel simplesmente armazenar na posio de memria desta varivel um valor
conhecido. A varivel que ir receber o valor sempre fica esquerda do operador.
Exemplo:
x = 10; // Ao executar este comando a varivel x recebe o valor 10
y = x; // Ao executar este comando a varivel y recebe o valor da varivel x, ou seja, 10.
46
Aritmticos
Realizam operaes matemticas em relao a um ou mais dados.
OPERADOR
AO
Adio
Subtrao
Multiplicao
Diviso
Resto de diviso
inteira
++
Incremento
--
Decremento
Exemplo:
int y, x, a, b; //declarando as variveis y, x, a e b como do tipo inteiro.
x = 3; /* Atribuindo valor 3 para varivel x */
y = 2; /*Atribuindo valor 2 paa varivel y */
a = 5/y; /*Atribuindo para a o resultado da diviso de 5 por y, somente a parte inteira, pois
as variveis so inteiras. Assim 5 dividido por 2 d 2 e sobra 1, ento a recebe o valor 2*/
a = 5%y; /*Atribuindo para a o resto da diviso de 5 por y. Assim 5 dividido por 2 d 2 e
sobra 1, ento a recebe o valor 1*/
a = x - y; /*Atribuindo para a varivel a a diferena entre x e y. (3-2 = 1), ento a recebe 1*/
a++; /* Incrementa a varivel a em uma unidade, ento era 1, somando 1, passa para 2*/
47
x--; /* Decrementa em uma unidade a varivel x, ento era 3, diminuindo 1, passa para 2*/
b = 3*4 + 2*1 - 3*1; /*Quando so chamadas diversas expresses aritmticas, prevalece a
ordem da matemtica, sendo primeiro calculada a multiplicao e diviso, depois soma e
subtraco. Deste modo, o resultado 12+2-3 = 9, ento b recebe o valo 9.*/
Relacionais
Utilizados em testes condicionais para determinar a relao existente entre dados. Isto
ocorre principalmente para verificar se alguma condio est sendo obedecida, sendo comum nas estruturas if, for, while, entre outras que sero tratadas posteriormente.
OPERADOR
AO
>
Maior que
>=
Maior ou igual a
<
Menor que
<=
Menor ou igual a
"
==
"
!=
Igual a
Diferente de
Lgicos Booleanos
Realizam conjunes, disjunes ou negaes entre elementos em um teste condicional.
OPERADOR
AO
&&
AND (E)
||
OR (OU)
NOT (NO)
Resultam em V ou F, exemplo:
int x, y;x = 10;
if(x > 5 && x < 15)
{y=1}; //se x maior que 5 e menor que 15, y=1
else
{y=0;} //se x menor que 5 ou maior que 15, y=0
48
AO
&
AND (E)
OR (OU)
>>
Deslocamento a direita
<<
Deslocamento a esquerda
Decorrncia:
49
Operador | (OU)
Definio: Este operador faz o equivalente a uma operao OR booleana, em que as operaes so realizadas bit a bit.
Exemplo:
Decorrncia:
Decorrncia:
50
Decorrncia:
Decorrncia:
10 decimal
Resultado
=
<<
00001010
00010100
<<
=
00101000
(1 vez)
(2 vezes)
51
Decorrncia:
10 decimal
=
<<
00001010
00000101
<<
Resultado =
10000010
(1 vez)
(2 vezes)
52
Funes de controle
As declaraes de controles so as responsveis por executar comandos quando condies so ou no obedecidas. Os principais so descritos a seguir.
Comando if-else
O comando if verifica se uma condio foi obedecida. Quando esta obedecida todos os
comando que estiverem dentro das chaves que delimitam esta declarao de controle sero executadas. J o comando else optativo, e os comandos dentro desta declarao
de controle sero executados quando a condio do if no for obedecida. Quando existe
apenas um comando no bloco do if, ento as chaves podem ser descartadas.
Sintaxe bsica:
Exemplo: Neste exemplo quando a varivel tecla possui valor 1, ento a varivel led recebe valor 1, caso contrrio a varivel led recebe valor 0.
53
Comando switch
O comando switch funciona como mltipla escolha, em que a varivel que est dentro
dos parnteses do switch, seleciona quais comandos sero executados. As opes so
apresentadas por cada case, e quando a varivel do switch assume o valor de um dos cases, ento os comandos respectivos a este case sero executados. A sintaxe desta funo est apresentada a seguir.
Sintaxe:
54
Exemplo: Neste exemplo abaixo, a varivel sensor do tipo char, e por isto as mltiplas
escolhas definidas em cada case esto entre aspas simples ( ), por se tratar de um caracter. Neste switch existem dois casos e um default, em que o primeiro caso ocorre
quando a varivel sensor o caracter L, e quando isto ocorre apenas a funo liga_lampada( ) executada, e posteriormente a execuo do programa sai do switch. O segundo caso quando a varivel sensor possui valor D, e quando isto ocorre apenas a funo desliga_lampada( ) executada, e posteriormente a execuo do programa sai do
switch. Quando nenhuma alternativa corresponde a um case, ento a opo default
executada, que neste caso executar a funo pisca_lampada( ).
Comando while
O comando while (palavra em ingls para enquanto), verifica se uma condio obedecida, executando um bloco de comandos quando verdade, do mesmo modo que o comando if. Entretanto, depois de executar o bloco, retorna para a condio, executando tudo
novamente enquanto a condio for obedecida.
Sintaxe:
55
Exemplo 1: No exemplo abaixo a varivel tecla recebe valor 0, e no primeiro while ser
avaliado se esta varivel possui valor 1, como no possui, ento ir saltar todos os comandos deste while, portanto a funo pisca_led_1( ) nunca ser executada. J quando for ser
avaliado pelo segundo while, a varivel tecla estar com valor 0, obedecendo a condio
deste while e executando suas funes, que no caso a pisca_led_2( ). Assim que os comandos do while forem executados, a condio volta a ser avaliada, e caso continue sendo verdadeira ir executar novamente seus comandos. Deste modo, a funo pisca_led_2( ) ser executada infinitamente, j que tecla sempre ser 0, seguindo estes comandos listados dentro do while.
Comando do-while
Este comando semelhante ao while, sendo a diferena do do-while em relao ao while que agora o teste da condio feito somente aps a execuo dos comandos. Deste modo, os comandos so executados pelo menos uma vez, independente se a condio obedecida ou no.
Exemplo 1: No exemplo abaixo a varivel tecla recebe valor 1, em seguida executa a funo pisca_led_1( ) e na condio do comando do-while ser avaliado se esta varivel possui valor 0, como no possui, ento ir sair deste bloco de comandos, mas executou as
instrues pelo menos uma vez, mesmo que a condio seja falsa desde o comeo.
56
Comando for
O comando for funciona como um loop, em que a quantidade de vezes que o bloco de comando executado definido por uma determinada varivel. O fluxo de execuo apresentado na sintaxe abaixo, seguindo a ordem de 1 a 4.
Sintaxe:
Esta varivel primeiramente inicializada (Etapa 1), em seguida verifica-se uma condio
utilizando esta varivel (Etapa 2). Caso a condio seja obedecida, o bloco de comandos
executado (Etapa 3), e, por fim, esta varivel incrementada (Etapa 4). As etapas 3 e 4
continuam a ser executadas enquanto a condio da etapa 2 for obedecida.
Exemplo: No exemplo abaixo, a varivel x incivilizado com valor 0, em seguida verificado se x menor ou igual a 10, como a condio obedecida, ento a varivel y recebe 3
vezes o valor de x que zero. Posteriormente x incrementado em uma unidade, era 0 e
passa para 1. A condio ser checada, obedecida, as instrues do for executada e x incrementado sequencialmente, at que x deixe de ser menor ou igual que 10.
57
Funes
Como j foi dito, uma funo um conjunto de comandos ordenados previamente. Estas
so criadas para facilitar uma operao que repete-se rotineiramente, inclusive com reaproveitamento em projetos distintos, facilitando a programao desta operao por necessitar fazer apenas uma vez, diminuindo o tempo de desenvolvimento de um projeto maior.
A sintaxe de um funo sempre a mesma, possuindo uma entrada que ser proces-
sada de acordo com os comando descritos na funo, gerando uma sada. Isto ocorre
sempre que esta funo chamada.
Sintaxe:
58
Exemplo: Um exemplo de uso de uma funo descrito abaixo, em que a funo chamada soma possui duas entradas do tipo inteiro (int) var1 e var2. Dentro da funo estas variveis so somadas e retornadas em forma de (int) na varivel res.
Esta funo soma pode ser implementada no compilador CCS de duas maneiras, sendo
estas descritas a seguir.
Modo 1:
Modo 2:
59
Bibliotecas
Uma biblioteca um conjunto de funes agrupadas em um mesmo arquivo, servindo
como um conjunto de funes que pode ser usada pelo usurio sempre que for necessrio. Funciona como uma biblioteca de livros, que possui vrios a disposio, mas so usados somente quando necessrio.
As bibliotecas em Linguagem C so criadas com dois arquivos, um arquivo cabealho e
um arquivo de implementao. O arquivo cabealho possui a extenso .h devido o termo
header em ingls que significa cabealho. O arquivo de implementao possui a extenso .c j que um arquivo compilvel. Os dois arquivos esto associados por possurem
o mesmo nome.
O arquivo cabealho utilizado para declarar todas as funes presentes na biblioteca,
servindo para que usurio da biblioteca saiba as funes que esto disponveis. Fazendo
a analogia a biblioteca de livros, funciona como um catlogo dos livros presentes na biblioteca. Neste arquivo no realizado a implementao.
A implementao de cada uma das funes declaradas no arquivo cabealho realizada
no arquivo compilvel (.c) , pois somente um arquivo compilvel pode processar as entradas e gerar sadas no compilador, que no nosso caso o CCS C.
60
A seguir demonstrado uma biblioteca de uma calculadora chamada calc, nela existem
quatro funes: soma, subtrao, multiplicao e diviso. No arquivo compilvel ou de implementao (calc.c) as funes so implementadas de acordo com suas entradas, operaes e sadas. J o arquivo de cabealho (calc.h), possui todas as funes disponveis
para o usurio da biblioteca da calculadora.
1. Arquivo calc.h
2. Arquivo calc.c
61
3. Arquivo main.c
De forma resumida, tm-se que o arquivo que possui a funo main( ) chama as funes
da biblioteca criada anteriormente. Para isto, basta adicionar a linha #include calc.h que
inclui a biblioteca calc que est no mesmo diretrio do arquivo da funo main.
62
Vetores (Arrays)
Conjunto de elementos do mesmo tipo agrupados em uma mesma varivel. Estes elementos so ordenados por um ndice, devendo ser declarados e trabalhados de maneira adequada, devido os mesmos serem tipos de dados distintos dos demais vistos anteriormente. A seguir so detalhados as maneiras adequadas de criar e manipular estes tipos de dados.
Declarao ou instanciao
Existe dois tipos de alocao do tamanho dos vetores, a dinmica e a esttica. A programao para microcontraldores aceita apenas a esttica, em que o tamanho do vetor definido previamente e no ser alterado ao longo da execuo do cdigo inteiro. Isto ocorre
visto que as variveis devem ser alocadas no comeo de cada programa para que o compilador CCS C no apresente nenhum erro. A alocao dinmica aloca a memria medida que ela ser necessria, porm esta metodologia no aceita pelo compilador utilizado devido o tamanho ser exigido no comeo da execuo. Sendo assim, seguem abaixo
exemplo da alocao de memria no modo esttico.
Exemplo:
int vet1[30]; // declarao do vetor vet1 do tipo inteiro (int) e com 30 posies.
float vet2[20]; // declarao do vetor vet2 do tipo inteiro (float) e com 20 posies.
char vet3[10]; // declarao do vetor vet3 do tipo inteiro (char) e com 10 posies.
63
Atribuio
A atribuio a etapa de atribuir valores s posies do vetor criados previamente. Cada
vetor com N posies de memria alocadas possui seu ndices de ordenao comeando
com valor 0 e terminando em N-1.
Por exemplo, um vetor com 30 posies possui seus ndices comeando em 0 e terminando em 29, o que totaliza 30 posies alocadas. Cada posio funciona como uma varivel
comum, podendo receber algum valor ou ser usada para calcular outra varivel, conforme
exemplos a seguir.
Exemplo:
int vet[30]; // declarao do vetor vet do tipo inteiro (int) e com 30 posies.
vet[0]=10; // Atribuio da posio 0 do vetor vet com valor 10 .
vet[1]=20; // Atribuio da posio 1 do vetor vet com valor 20 .
vet[2]=vet[0]+vet[1]; // Atribuio da posio 2 do vetor vet com valor vet[0]+vet[1]
64
tor vet possui 30 posies, ento o valor tam_vet 30, mesmo valor da quantidade de posies, sendo todas as posies zero aps o comando for.
Exemplo 1 - Zerando as 30 posies do vetor vet.
65
Diretivas do compilador
#ASM e #ENDASM
Utilizada para inserir cdigo assembly diretamente em um programa em C. Deste modo,
algumas subrotinas j implementadas em Assembly podem ser incorporadas a um programa em Linguagem C sem precisar ser implementado nesta nova linguagem de programao.
Sintaxe:
Exemplo:
66
#define
Utilizada para substituir o identificador pelo texto especificado imediatamente depois
dele. Facilitando o uso de funes e variveis pelo usurio.
Sintaxe:
Exemplo:
#fuses
Utilizada para programar as opes da palavra de configurao dos PICs.
Sintaxe:
Exemplo:
67
#use rs232
Ativa o suporte a comunicao serial (RS-232). Alm disto apresenta as configuraes utilizadas na comunicao via RS-232, entretanto este assunto ser abordado posteriormente
com mais detalhes.
Sintaxe:
Exemplo:
#use delay
Informa ao compilador a velocidade de clock do sistema de destino. Deve ser o mesmo
valor do cristal utilizado no hardware conectados aos pinos OSC1 e OSC2.
Sintaxe:
Exemplo:
68
3
Projeto bsico de
hardware e software
69
1 - Pinos 20 e 19 - Alimentao
Estes pinos devem ser alimentados com 0V o
pino 19 e 5V o pino 20 para que o MCU possa
funcionar adequadamente. Nunca troque os
nveis de tenso ou passe de 5,5 V a alimentao do pino 20, pois nestes casos o
MCU ir ser danificado.
70
Todos os projectos e exemplos deste livro foram testados com cristal de 20 MHz e capacitores de 22pF, obedecendo o que o fabricante pede, j que sua exigncia que seja maior do que 15 pF.
71
Componentes:
Capacitor 100uF/50V, Capacitor 10uF/25V, Conector KRE02, Regulador LM7805, Diodo
1N4007, 02 Capacitores 100nF, Fios e conectores.
72
73
A simulao da execuo dos projetos deste livro foi realizada no software Proteus,
que permite montar o circuito do hardware de cada aplicao, carregar o programa, alm
de
*.hex e o *.cof, sendo o primeiro arquivo para o modo EXECUO e o segundo para o
modo DEBUG, onde possvel acompanhar a execuo das operaes e o valor das variveis passo-a-passo. Vale ressaltar que o simulador no prev algumas protees necessrias para o sistema, como a necessidade de resistores e reguladores, por exemplo.
PICKIT 2 da Microchip e seus programas. Aps gravar os Microcontroladores, todos os circuitos e aplicaes foram testados em Protoboard, utilizando a fonte de tenso controlada demonstrada na Seo 3.1.
Vale ressaltar que todas as aplicaes devem ter o hardware bsico, uma fonte de ali-
mentao controlada em 5V e obedecer ao software bsico para que a gravao e a execuo sejam realizadas com sucesso.
Detalhes e dvidas, por favor, contactar o autor, visto que este livro no tem este en-
foque e todos estes softwares so bem difundidos e possuem material de fcil acesso.
74
4
Entrada e sada de
dados digitais
Nesta unidade sero abordados as funes bsicas do CCS, como funes de espe-
ra, funes de entrada e sada digital para pinos e funes de entrada e sada digital para
portas. A configurao do sentido das portas tambm ser abordada e exemplos sero
apresentados.
75
Funes de espera
Como sugere o nome destas funes, elas implementam um atraso na execuo do programa quando so chamadas. Estas funes param o programa quando so chamadas,
esperando o tempo programado na linha de comando em que o comando foi executado.
Este tempo de espera pode ser especificado em ciclos, microssegundos ou milissegundos, sendo a funo para cada um apresentado a seguir.
Atraso em ciclos
Descrio: Aguarda n ciclos de mquina.
Funo:
DELAY_CYCLES
Sintaxe:
DELAY_CYCLES ( n ) ;
Exemplo:
DELAY_CYCLES ( 5 ) ;
Atraso em microssegundos
Descrio: Aguarda n microssegundos.
Funo:
DELAY_US
Sintaxe:
DELAY_US ( n ) ;
Exemplo:
DELAY_US ( 10 ) ;
76
Atraso em milisegundos
Descrio: Aguarda n milisegundos.
Funo:
DELAY_MS
Sintaxe:
DELAY_MS ( n ) ;
Exemplo:
DELAY_MS ( 10 ) ;
77
De forma resumida, tem-se que o microcontrolador 18F2550 possui 3 portas, sendo que a
porta A possui 7 pinos, a porta B 8pinos e a porta C so 7 pinos. Entretanto, todos os registrados de dados destas portas possuem 8 bits, sendo que a porta que no possui 8 pi-
78
nos deve-se ausncia apenas no hardware, pois no registrador esta sada teoricamente
existe.
Resumo:
!
79
80
81
Um pino pode possuir dois estados ( 0 ou 1, alto ou baixo, 0 ou 5V). Para aumentar sua
funcionalidade, os mesmos pinos podem ser usados tanto como sada quanto como entrada. Para definir um pino de uma porta como entrada ou sada, preciso definir os bits do
registrador TRIS como 1, para entrada, ou 0, para sada. Cada pino tem o seu registrador
TRIS correspondente e isto ser abordado adiante.
Seguem abaixo as funes do compilador CCS para leitura e sada dos pinos do Microcontrolador.
OUTPUT_LOW
Sintaxe:
OUTPUT_LOW ( PINO ) ;
Exemplo:
OUTPUT_LOW ( PIN_B1 ) ;
82
OUTPUT_HIGH
Sintaxe:
OUTPUT_HIGH ( PINO ) ;
Exemplo:
OUTPUT_HIGH ( PIN_B1 ) ;
OUTPUT_BIT
Sintaxe:
Exemplo:
OUTPUT_HIGH ( PIN_B1 , 1 ) ;
83
Funo:
INPUT
Sintaxe:
INPUT ( PINO ) ;
Exemplo:
84
Uma porta um conjunto de pinos em um MCU que podem ser acessados simultaneamente. Para aumentar sua funcionalidade, os mesmos pinos de cada porta podem ser
usados tanto como sada quanto como entrada, podendo ser parte destes usado como
sada e o restante como entrada se for o caso. Para definir um pino de uma porta como
entrada ou sada, preciso definir os bits do registrador TRIS como 1, para entrada, ou 0,
para sada. Cada porta tem o seu registrador TRIS correspondente, que so a juno dos
registradores individuais de cada pino. O PIC18F2550 tem trs portas: A, B e C.
OUTPUT_X
OUTPUT_A ( 255 ) ;
Exemplos
Exemplo 1:
OUTPUT_B ( 0X29
Exemplo 2:
OUTPUT_B ( 129 ) ;
129$$$$$$$$$$Decimal$
$
$1$$$0$$$0$$$0$$$0$$$0$$$0$$$1$.$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
RB7$$RB6$$RB5$$$RB4$$RB3$$RB2$$RB1$$RB0$
128$$_64$$$32$$$$$$$$$$16$$$$$8$$$$$$$4$$$$$$$2$$$$$$$1$$$.$
Exemplo 3:
OUTPUT_B ( 0B10101010 ) ;
86
INTPUT_X
Exemplo:
!
129$$$$$$$$$$Decimal$
$
$1$$$0$$$0$$$0$$$0$$$0$$$0$$$1$.$$$$$$$$$$
RB7$$RB6$$RB5$$$RB4$$RB3$$RB2$$RB1$$RB0$
128$$_64$$$32$$$$$$$$$$16$$$$$8$$$$$$$4$$$$$$$2$$$$$$$1$$$.$
87
Um pino pode possuir dois estados (0 ou 5V) e pode funcionar como entrada ou sada de
dados. Cada porta possui um registrador TRIS, que controla a direo do fluxo de dados
nos pinos. As configuraes do TRIS podem ser:
Padro
Fixo
Rpido
Modo Padro
Descrio: Compilador adiciona cdigo para configurar o registrador TRIS e tornar um
pino entrada ou sada conforme instruo executada.
Diretiva de configurao:
!
!
!
Exemplo:
OUTPUT_HIGH ( PIN_B0 ) ;
!
!
!
!
!
!
!
!
BSF!
BCF!
BCF!
BSF!
!
!
!
!
STATUS.5!
TRISB.0!
STATUS.5!
TRISB.0
88
89
Modo Fixo
Descrio: Determina ao compilador quais os pinos especificados sero utilizados sempre como sadas. Nenhuma funo de programao altera codificao prvia do registrador TRIS.
Diretiva de configurao:
!
!
!
Exemplo:
!
!
!
int x;
output_low(pin_c0);
x = input (pin_c0);
output_low (pic_c2);
90
#include <18f2550.h>
#fuses HS
#use fixed_io(c_outputs=pin_c0, pin_c1)
#use delay(clock = 20000000)
!
!
!
Devido sua configurao apenas os pinos C0 e
!
C1 vo obedecer os comandos, pois s os mes- !
mos funcionam como sada. O pino C2 no obe- !
decer os comandos j que foi configurado !
!
como entrada.
!
}
while (1)
{
!
output_high(pin_c0);
!
output_high(pin_c1);
!
output_high(pin_c2);
!
delay_ms(200);
!
output_low(pin_c0);
!
output_low(pin_c1);
!
output_low(pin_c2);
!
delay_ms(200);
}
Modo Rpido
Descrio: Compilador no gera cdigo de configurao da direo para os registradores
TRIS, acessando as portas substancialmente mais rpido. O programador deve providenciar toda a configurao necessria.
Diretiva de configurao:
!
!
!
#use fast_io ( A )
91
set_tris_x (valor)
Sintaxe:
!
set_tris_a (valor)! !
set_tris_b (valor)
Exemplo:
set_tris_b(131);
92
Exemplo:
#include <18f2550.h>
#fuses HS
#use fast_io(C)
#use delay(clock = 20000000)
main()
{
while (1)
{
set_tris_c(0b00000010); // apenas o pino c1 como entrada
//(c7=0 c6=0 c5=0 c4=0 c3=0 c2=0 c1=1 c0=0)
output_high(pin_c0);
output_high(pin_c1);
output_high(pin_c2);
delay_ms(200);
output_low(pin_c0);
output_low(pin_c1);
output_low(pin_c2);
delay_ms(200);
}
}
93
O CCS facilita a programao com uma interface e linguagem amigvel, alm de auxi-
Para acessar os pinos deste modo, faz-se necessrio identificar o endereo das por-
tas e de seus respectivos registradores TRIS. Para fazer isto deve-se acessar a aba View
do programa CCS e seleccionar a opo Special Register.
Aps seleccionar esta opo, a janela apresentada abaixo ir abrir. Voc deve selecio-
nar o microcontrolador que est usando e procurar as portas e os registradores do mesmo, conforme apresentado em destaque. O endereo estar na primeira coluna esquerda.
94
De forma resumida, tem-se os valores dos endereos das portas e dos registradores TRIS
para o PIC18F2550 so:
Porta A
TRIS A
F80
F92
Porta B
F81
TRIS B
F93
Porta C
F82
TRIS C
F94
Para poder acessar diretamente estes endereos basta criar variveis constantes como
variveis globais. Para endereos de portas e registradores TRIS necessrio criar uma
constante do tipo byte e para pinos e registradores TRIS de um pino deve-se criar uma
constante bit.
Sintaxe:
!
!
!
!
!
!
!
!
Estas variveis devem ser declaradas de forma global, conforme o exemplo abaixo:
Exemplo parte 1:
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#byte PORTAA = 0xF80
#byte TRISA = 0xF92
main()
{
!
...
}
95
Deste modo para atribuir valores para o TRISA e para PORTA, pode-se atribuir direto para
a varivel criada. Isto substitui as funes set_tris_a( ) e a funo output_a( ), isto pode
ser observado no exemplo abaixo:
Exemplo:
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#byte PORTAA = 0xF80
#byte TRISA = 0xF92
main()
{
!
TRISA = 0; // equivale a 0b00000000, ou seja, todos os registradores com 0
!
while (1)
!
{
!
!
PORTAA = 255; // equivale a 0b11111111, ou seja, todos os pinos com 1
!
!
delay_ms(500);
!
!
PORTAA = 0; // equivale a 0b00000000, ou seja, todos os pinos com 0
!
!
delay_ms(500);
!
}
}
!
!
!
96
O exemplo abaixo contm a configurao de todas as portas do PIC18f2550, alm de criar as variveis de acesso dos pinos A0 e B5. Os pinos da porta B esto sendo usados
como sada, e os da porta A como entrada. Neste exemplo, o pino A0 avaliado, se estiver com nvel lgico alto, os pinos da porta B so todos colocados para 5V, depois todos
para 0V, depois somente B5 posto para 5V e para terminar este pino vai para 0V.
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#byte PORTAA = 0xF80
#byte TRISA = 0xF92
#byte PORTAB = 0xF81
#byte TRISB = 0xF93
#byte PORTAC = 0xF82
#byte TRISC = 0xF94
#bit B5 = PORTAB.5
#bit A0 = PORTAA.0
main()
{
!
TRISB = 0; // equivale a 0b00000000, ou seja, todos os registradores com 0
!
TRISA = 255; // equivale a 0b11111111, ou seja, todos os registradores com 1
!
while (1)
!
{
!
if(A0 == 1)//Para ler o pino basta checar a varivel de acesso do mesmo
!
{
!
!
PORTAB = 255; // equivale a 0b11111111, ou seja, todos os pinos com 1
!
!
delay_ms(500);
!
!
PORTAB = 0; // equivale a 0b00000000, ou seja, todos os pinos com 0
!
!
delay_ms(500);
!
!
B5 = 1; // Colocou apenas o pino B5 para 1
!
!
delay_ms(500);
!
!
B5 = 0; // Colocou apenas o pino B5 para 0
!
!
delay_ms(500);
!
}
!
}
}
97
Acionamento de LED
O termo LED a sigla em ingls de Diodo Emissor de Luz, deste modo, este dispositi-
vo segue os mesmos princpios de um diodo, com a particularidade que ele emite luz.
devendo ter em srie com o mesmo, antes ou depois, uma resistncia para limitar a corrente, evitando que o mesmo queime por sobrecorrente. Por outro lado, o LED precisa de
uma corrente em torno de 15 mA para emitir luz, ento faz-se necessrio colocar um dos
resistores comerciais 300, 330 ou 390 ohms. O circuito ligado ao MCU ficar assim:
330 ohms
PIC18F2550
Sendo assim, quando o pino do MCU ligado ao circuito do LED estiver com 5V, ele acende. Caso esteja com 0V, o LED apaga.
98
Leitura de um boto
do circuito, fazendo que este ponto esteja com uma tenso x quando estiver pressionado
e uma tenso y quando estiver despressionado.
+5V
PIC18F2550
ra desta tenso pelo microcontrolador entre o boto e o resistor, conforme apresentado ao lado pelo ponto A em azul. O
1K
0V
1K
PIC18F2550
+5V
A
1K
PIC18F2550
99
Prticas
Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que faa um led
piscar de 1 em 1 segundo.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que simule um semforo com leds verde, vermelho e amarelo, em que o tempo de verde e vermelho aceso
so 10 segundos e o amarelo so 2 segundos.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que implemente
um ou exclusivo de 3 entradas e acione um led para demonstrar as sadas com nvel lgico alto.
Observao: Todos os projetos devem ter o hardware bsico e obedecer o software bsico, apresentados no Captulo 3, para funcionar adequadamente. Quanto a leitura dos pinos com botes e o acionamento com LEDs, deve-se obedecer s Sees 6 e 7 deste
mesmo Captulo.
100
5
Display de 7
segmentos
Neste Capitulo ser apresentado o display de 7 segmentos, detalhando seu funcionamento, hardware bsico, software bsico, alm do uso de vetores para o software e da tcnica
de multiplexao, que permite o uso de vrios displays com uma menor quantidade possvel de pinos.
101
Funcionamento
102
Para estudo e anlise das sadas de um display de 7 segmentos ser adotado, neste exemplo, o display de ctodo
comum. Deste modo, o fio comum deve ser aterrado. Alm
disto, deve-se conectar um resistor em cada entrada (de a
at g) para limitar a corrente em cada diodo para que este
no queime por sobre-corrente, porm que permita passar
um corrente em torno de 200mA, visto que esta capaz de
acender cada LED do display. Este resistor pode ser 300,
330 ou 390 ohms.
Todo display de 7 segmentos, independente se ctodo ou nodo comum, possui a descrio apresentada acima. Deste modo, quando faz-se necessrio aparecer o valor zero
neste display, ento deve-se acender todos os LEDs, exceto o da letra g. Utilizando o
mesmo princpio para aparecer o nmero 1, deve-se acender b e c, apagando todos
os outros. Ressalta-se que no exemplo citado, utiliza-se o tipo ctodo comum, em que o
fio comum aterrado(0V). Deste modo, para acender uma determinada sada, deve-se colocar esta para 5V, que o nvel lgico alto (1). Do mesmo mesmo modo, para apagar
uma sada, deve-se colocar esta para 0V, que o nvel lgico baixo (0). Neste sentido, fazendo o mesmo com todos os nmeros de 0 at 9, ento obtm-se a Tabela apresentada
abaixo.
103
Abaixo apresentado o hardware especfico para acionamento de um display de 7 segmentos pela porta B. Vale ressaltar que o hardware bsico no est ilustrado para facilitar
o entendimento, mas o mesmo obrigatrio para funcionamento do microcontrolador.
A0#
A1#
A2#
A3#
A4#
A5#
A6#
C0#
C1#
C2#
B7#
B6#
B5#
B4#
B3#
B2#
B1#
B0#
330 ohms
C7#
C6#
C5#
C4#
Quanto ao circuito apresentado, cada resistor ligado entre a porta B e o display de 7 segmentos possui 330 Ohms. O pino B7 est livre e sem conexo, mas poderia estar conectado no pino do ponto do display.
Vale ressaltar que os pinos do display foram conectados juntos na porta B para facilitar a
lgica e o programa de acionamento, mas poderia estar em portas separadas.
Para exemplificar o acionamento do hardware descrito, pode-se citar a Tabela de acionamento de 0 a 9 apresentada na Seo 2 deste mesmo captulo. Nesta tabela, para apre-
104
!!!48!!!!!!!!!!!!!!!Decimal!
!
!0!!!0!!!1!!!1!!!0!!!0!!!0!!!0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
TB7!!TB6!!TB5!!!TB4!!!TB3!!TB2!!!TB1!!TB0!
!!!!!!!!!a!!!!!b!!!!!!!c!!!!!!d!!!!e!!!!!!f!!!!!!g!.!
Para enviar este valor para a porta B, existe diversas maneiras j apresentadas anteriormente, e uma destas utilizando a funo abaixo:
OUTPUT_B ( 48 ) ;
OUTPUT_B ( 0b00110000 ) ;
105
O uso de vetores em determinadas aplicaes facilita a manipulao de dados. Entretanto, muitos usurios de Microcontroladores em Linguagem C preferem no usar tal artifcio
de programao devido no conhecer o uso adequado do mesmo.
Neste sentido, o uso de vetores basicamente como descrito na Seo 7 do Capitulo 2,
em que inicialmente necessrio sua declarao e instanciao, onde o vetor criado, declarado e dimensionado. Por exemplo, para criar um vetor chamado vetExemplo de tamanho 3, em que o tipo de dados desse vetor inteiro (int), tm-se a seguinte linha de comando :
!
int vetExemplo [ 3 ];
Para alocar valores a cada posio desse vetor, pode-se utilizar o acesso individual a
cada posio do mesmo modo que o apresentado anteriormente. Por exemplo, para atribuir os valores 3, 5 e 7, respectivamente, para as 3 posies do vetor vetExemplo devese seguir as linhas de comando abaixo:
vetExemplo [ 0 ] = 3;
vetExemplo [ 1 ] = 5;
vetExemplo [ 2 ] = 7;
106
int vetExemplo [ ] = { 3 , 5 , 7 };
Na linha de comando apresentada ir gerar o mesmo vetor dos exemplos anteriores, obtendo o mesmo efeito. Entretanto, est mais organizado e prtico, sendo esta a metodologia de uso dos vetores adotado neste livro.
Vale ressaltar que no precisa especificar quantas posies existem neste vetor dentro
dos colchetes, pois isto j feito de forma automtica pela quantidade de posies que j
existem dentro das chaves. Quanto ao preenchimento das posies, tm-se que a posio 0 do vetor ser o primeiro valor apresentado, a primeira posio ser o segundo valor
apresentado, e assim por diante. No exemplo apresentado seguir o mesmo do exemplo
anterior, em que a posio 0 possui o valor 3, a posio 1 o valor 5 e a posio 2 o valor
7.
DEC$
7$$Segmentos$
X$ A" B" C" D" E"
F"
G"
1"
1"
1"
1"
1"
0"
0"
1"
1"
1"
1"
1"
0"
1"
1"
1"
1"
1"
1"
1"
1"
0"
1"
1"
0"
1"
1"
0"
1"
1"
1"
0"
1"
0"
0"
0"
1"
0"
1"
0"
1"
0"
0"
0"
1"
1"
1"
0"
1"
1"
0"
0"
1"
1"
1"
1"
1"
0"
1"
1"
107
Deste modo, precisamos de um dado superior a 7 bits para armazenar os dados do display de 7 segmentos, sendo 1 bit para cada display. Caso no tenha visualizado isto ainda, basta visualizar que 1 bit pode ter o valor 0 ou 1, ento 1 bit pode armazenar o estado
de um dos LEDs do display. Como so 7 LEDs, ento so 7 bits.
Por questo de optimizar o espao no Microcontrolador, usa-se habitualmente um dado
de 8 bits, que o tamanho imediatamente superior ao necessrio, que 7. Dentre as variveis de 8 bits, existe o inteiro (int), o carcter (char) e o byte. Para se usar o inteiro necessrio colocar o variante unsigned para forar a aceitar valores de 0 a 255, conforme visto
na Seo 3 do Capitulo 2.
Nos exemplos deste livro sero usados o tipo de dado byte para evitar erros causador
pelo tipo de dados. Deste modo, considerando um vetor de 10 posies, j que a o conjunto de nmeros apresentado de 0 a 9, a declarao utilizada neste livro :
!
byte digitos [ 10 ];
Quanto ao preenchimento do vetor, o segredo que facilita o uso do display com o vetor
colocar o valor respectivo ao nmero visualizado no display na posio correspondente
do vetor. Sendo assim, o valor para visualizar o nmero 0 ser posto na posio 0 do vetor, o nmero para visualizar o valor 1 ser posto na posio 1 do vetor, e fazendo o mesmo at a posio 9. Neste sentido, quando o programador quiser visualizar o valor 0 no
display, basta enviar a posio 0 do vetor. Isto vlido para todos os nmeros. Um exemplo de preenchimento do vetor especificamente na posio 0, seguindo a tabela de acionamento apresentada, :
!
digitos [ 0 ] = 0b01111110;
Caso queira adotar esta metodologia, ser necessrio preencher cada posio do vetor
individualmente da posio at a posio 9. Como j falado anteriormente, visando a comodidade e facilidade no desenvolvimento de aplicaes com display de 7 segmentos, ento ser adotado a segunda metodologia, em que a declarao, instanciao e atribuio
so realizados ao mesmo tempo. Alm disto, ser utilizado a variante const na declarao
do vetor para evitar que os valores do vetor sejam alterados por falha de manipulao do
108
programador. Ento, de forma resumida, os exemplos deste livro seguiro a seguinte linha
de comando para estas etapas que envolvem a criao e preenchimento do vetor:
byte const digitos [ ] = { 0b01111110, 0b00110000, 0b01101101, 0b01111001,
0b00110011, 0b01011011, 0b01011111,0b01110000, 0b01111111, 0b01111011};
Vale ressaltar que o no incio de todas as posies possuem 0b0 na frente, em que 0b
indica que este nmero binrio, pois todos representam os bits de cada pino, e o primeiro zero do valor referente ao pino B7 que est sem conexo. Como falado anteriormente, funciona normalmente sem este primeiro zero, mas bom deixar para se acostumar a
trabalhar sempre com os 8 pinos, evitando lixo indesejado.
Aps declarar o vetor, fica fcil enviar um valor para o display. Por exemplo, para enviar o
valor 0 para o display, basta fazer a seguinte linha de comando:
output_b ( digitos [ 0 ] ) ;
Resumindo a linha de comando executada: A posio 0 do vetor chamado digitos est
sendo enviada para a porta B. O valor desta posio em cada pino da porta B, corresponde ao acionamento do valor 0 no display de 7 segmentos.
Abaixo apresentado o cabealho dos dois exemplos mostrados posteriormente, em que
o vetor chamado digitos declarado como varivel global e constante do tipo byte:
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
byte const digitos [ ] = { 0b01111110, 0b00110000, 0b01101101, 0b01111001,
0b00110011, 0b01011011, 0b01011111,0b01110000, 0b01111111, 0b01111011};
109
Exemplo 1:
main()
{
while (1)
Considerando o cabealho apresenta- !
{
do anteriormente, o exemplo ao lado !
!
!
output_b(digitos[1]);
apresenta uma contagem no display !
!
delay_ms(1000);
!
output_b(digitos[2]);
de 7 segmentos que vai de 1 at o n- !
!
delay_ms(1000);
mero 3, demorando 1 segundo em !
!
!
output_b(digitos[3]);
cada contagem. Esta contagem ir !
!
delay_ms(1000);
ocorrer de forma contnua j que est !
}
}
dentro loop infinito do while.
Exemplo 2:
main()
{
int contagem = 0;
Este exemplo tem o mesmo efeito !
while (1)
prtico do exemplo 1. A diferena !
!
{
est no modo de programao utili- !
!
for(contagem=1;contagem<=3;contagem++)
!
{
zado, em que a varivel contagem !
!
!
!
output_b(digitos[contagem]);
possui o nmero que deve ser apre!
!
!
delay_ms(1000);
sentado no display de 7 segmentos !
!
}
!
}
e o for controla este nmero.
}
110
Abaixo apresentado o hardware especfico para acionamento de dois displays de 7 segmentos pela porta B. Vale ressaltar que o hardware bsico no est ilustrado para facilitar
o entendimento, mas o mesmo obrigatrio para funcionamento do microcontrolador.
A0#
A1#
A2#
A3#
A4#
A5#
A6#
C0#
C1#
C2#
B7#
B6#
B5#
B4#
B3#
B2#
B1#
B0#
C7#
C6#
C5#
C4#
330 ohms
Rt
T1
Rt
T2
111
112
evite este erro e acione apenas um display por vez. As linhas de comando a seguir exemplificam o acionamento dos dois displays, colocando o valor 1 no primeiro display e 2 no
segundo:
!
!
!
!
!
!
!
!
Prticas
Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que leia o pino
A0, quando este pino estiver com nvel lgico 0, apresente o valor 0 no display de 7 segmentos. Quando A0 estiver com nvel lgico 1, apresentar o valor 1 no display.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem crescente de 0 a 9, incrementando a contagem a cada 0,5 segundo.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem decrescente de 9 a 0, decrementando a contagem a cada 0,5
segundo.
Prtica 04: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem crescente de 0 a 9, incrementando a contagem a cada 0,5 segundo. Em seguida apresente uma contagem em ordem decrescente de 9 a 0, decrementando a contagem a cada 0,5 segundo.
Prtica 05: Projete um hardware e um software utilizando MCU 18f2550 que apresente
uma contagem em ordem crescente de 0 a 99 em dois displays de 7 segmentos, incrementando a contagem a cada 0,5 segundo.
114
6
Conversor Analgico
Digital
115
Abaixo so apresentados em vermelho os pinos que podem ser utilizados como ADC no
PIC 18F2550, desde que sejam configurados e usados como tal.
Os pinos com a funo especial AN podem assumir duas funes, entrada/sada digital
ou conversor A/D. Quando configuradas como E/S digital funcionam como visto no Capitulo 4. J quando configuradas como conversor A/D estes pinos convertem uma tenso
analgica (0-5V) em um valor digital.
O valor digital armazenado normalmente em uma varivel para ser processada, armazenada, etc. Este valor armazenado depende da resoluo do conversor, que, por exemplo,
no 18f2550 pode ser de 8 ou 10 bits.
116
2.
3.
4.
5.
6.
7.
8.
117
Exemplo 1:
#device adc = 8
Quando a resoluo do ADC possui n = 8, ento 2n = 28 = 256 . Deste modo, os valores possveis na leitura do ADC esto entre 0 e 255, o que totaliza os 256 valores.
Exemplo 2:
#device adc = 10
Quando a resoluo do ADC possui n = 10, ento 2n = 210 = 1024 . Deste modo, os
valores possveis na leitura do ADC esto entre 0 e 1023, o que totaliza os 1024 valores.
Esta funo apresentada possui diversos parmetros de configurao, por exemplo, abaixo este comando est configurando o uso dos pinos AN0, AN1, AN2 e AN3. Os demais sero usados como pinos digitais ou outras funes.
Exemplo:
setup_adc_ports( AN0_to_AN3 ) ;
118
Parmetro ! !
NO_ANALOGS ! !
ALL_ANALOG ! !
AN0_TO_AN11 ! !
AN0_TO_AN10 ! !
AN0_TO_AN9 ! !
AN0_TO_AN8 ! !
AN0_TO_AN4 ! !
AN0_TO_AN3 ! !
AN0_TO_AN2 ! !
AN0_TO_AN1 ! !
AN0
! !
!
Vale ressaltar que quando apenas um pino necessrio para ser usado como ADC, otimiza-se o hardware quando utiliza-se o pino AN0. Caso contrrio, pinos sero inutilizados.
Por exemplo, supondo que v usar apenas o pino AN3, ento os pinos AN0 e AN1 sero
inutilizados, pois no possvel configurar apenas o AN3.
119
Esta funo apresentada possui diversos parmetros de configurao, por exemplo, abaixo este comando est configurando o uso das tenses 0 e 5V que so as tenses padro
do microcontrolador.
Exemplo:
setup_adc_ports( VSS_VDD )
Parmetro !
!
VSS_VDD !
!
VREF_VREF ! !
VREF_VDD ! !
VSS_VREF ! !
Usa como referncia as alimentaes do micro controlador, pinos 19 e 20 (18f2550). Deste modo a leitura do ADC ser mxima para tenso no pino 19 e 0 para tenso no pino 20.
SETUP_ADC_PORTS (VREF_VREF)
Usa como referncia os pinos 4 (AN2) e 5 (AN3) para 18f2550. Deste modo a leitura do
ADC ser mxima para tenso do pino 5 e 0 para tenso no pino 4.
SETUP_ADC_PORTS (VREF_VDD)
Usa como referncia os pinos 4 (AN2) e 20 (Alimentao). Deste modo a leitura do ADC
ser mxima para tenso do pino 20 e 0 para tenso no pino 4.
SETUP_ADC_PORTS (VSS_VREF)
Usa como referncia os pinos 19 (GND alimentao) e 5 (AN3). Deste modo a leitura do
ADC ser mxima para tenso do pino 5 e 0 para tenso do pino 19 (GND).
120
121
Exemplo 1:
setup_adc ( adc_off )
No exemplo acima, a configurao adc_o desliga o ADC e nenhuma porta ser usada
com esta funo. Outras configuraes so apresentadas abaixo:
Parmetro !
ADC_OFF !
!
!
!
Desliga-clock-do-ADC
Clock-do-ADC-=-Fosc/2
Clock-do-ADC-=-Fosc/4
Clock-do-ADC-=-Fosc/8
Clock-do-ADC-=-Fosc/16----------------------Clock-do-ADC-=-Fosc/32
Clock-do-ADC-=-Fosc/64
Clock-do-ADC-=-clock-Interno
setup_adc ( adc_clock_div_4 )
No exemplo 2, o MCU ir usar o clock do ADC com uma frequncia 4 vezes menor que a
frequncia de entrada. Considera-se o tempo de converso TAD de cada bit 1/f.
Exemplo 3:
setup_adc ( adc_clock_div_16 )
No exemplo 3, o MCU ir usar o clock do ADC com uma frequncia 16 vezes menor que a
frequncia de entrada. Considera-se o tempo de converso TAD de cada bit 1/f.
122
Para selecionar o pino AN0 para que este seja lido, tm-se a seguinte funo:
Exemplo 1:
setup_adc_channel ( 0 )
setup_adc_channel ( 5 )
Exemplo 3:
setup_adc_channel ( 10 )
A numerao selecionada nesta funo no diz respeito a numerao do pino, mas sim
aos pinos com funes AN. Deste modo, ao selecionar o canal 0, est selecionando o
AN0 que fica no pino 2 e no o pino 0. Os pinos selecionados para leitura devem ter sido
habilitados anteriormente para que a leitura seja realizada adequadamente.
7 - Leitura do conversor AD
Descrio: esta funo l o pino selecionado previamente, retornando um valor com a
quantidade de bits configurada previamente. Esta funo tem um retorno do tamanho da
varivel configurada no tpico 1. A funo segue abaixo.
Funo de leitura: read_adc ( )
Exemplo:
Aps executar a linha de comando 3, a varivel valor
ter o valor referente a tenso lida no canal 1 previamente selecionado. Vale ressaltar que esta varivel
deve ser capaz de receber o valor lido, ou seja, se for
receber 8 bits, ento deve ter 8 ou mais bits, conforme selecionado.
Nesta seo so apresentados alguns exemplos de leitura utilizando o conversor analgico digital do PIC18F2550 seguindo as etapas citadas anteriormente. Estes exemplos so
descritos a cada linha de comando e uma anlise geral apresentada para cada exemplo.
Vale ressaltar que apenas um pino est sendo utilizado como ADC no exemplo acima, deste modo, s necessrio indicar qual pino ser lido pela funo read_adc uma vez, e por
isto, a funo set_adc_channel(0) executada antes do loop infinito do while, em que o
argumento de entrada 0 define o canal AN0 como o pino de leitura. Outro ponto importante, a necessidade de esperar o sistema estabilizar entra cada leitura. Um tempo adotado
neste livro de 10 milisegundos (10 ms).
124
125
O tempo de converso de cada bit (TAD) calculado dividindo 1 pela frequncia de converso de 1 bit. Para exemplificar este clculo vamos considerar a configurao do clock
ADC_CLOCK_DIV_16 e o clock do MCU de 20 MHz, ento temos:
O tempo TAD equivalente a 1 bit, ento para saber o tempo real de leitura e converso
do valor analgico para digital basta multiplicar pela quantidade de bits que a leitura do
ADC foi configurada.
Por exemplo, caso este exemplo citado tenha sido configurado com 8 bits, ento o tempo
de leitura do ADC pela funo read_adc( ) ser de 0,8 x 8 = 6,4 us. J quando configurado para 10 bits, ento o tempo de leitura do ADC ser 0,8 x 10 = 8 us.
126
Os valores de referencia mnimo (Vref_min) e mximo (Vref_max) so configurados na seo 4.2.4, enquanto a resoluo n configurada conforme visto na seo 6.2.
A seguir so apresentados exemplos de aplicao da frmula acima para obter a tenso
(Vin) a partir do valor digital (res_adc) e da obteno de res_adc utilizando Vin.
127
Obs: O valor de tenso de entrada (Vin) deve estar entre os valores mnimo e mximo das
referncias configuradas, alm de no poder ultrapassar 5V corrente contnua, o que pode
danificar o pino utilizado.
S u p o n d o que os valores de tenso de referncia mnima e mxima so respectivamente 0V e 5V, e utilizando o conversor com resoluo de 10 bits, e possuindo um valor
lido no ADC de 511:
Obs: Verificar se a varivel de armazenamento da leitura do ADC maior que o valor mximo do ADC, caso contrrio, erros de leitura iro acontecer.
128
#include <18f2550.h>
#device ADC=10 //Configura os ADC com 10 bits
#use delay(clock=20000000) //Configura as portas usadas como ADC
long int ad0; //Varivel que suporte armazenar um dado de 10 bits
float Vin; //Varivel que suporte o valor de tenso de entrada
void main( )
{
SETUP_ADC_PORTS(AN0); //Configura as portas usadas como ADC
SETUP_ADC(ADC_CLOCK_INTERNAL); //Seta a origem do clock
SET_ADC_CHANNEL(0); //Escolhe a entrada lida pela funcao READ_ADC
while(1) //Loop infinito
{
-ad0 = READ_ADC(); //Le o pino ADC selecionado
Vin = ((float)(ad0))*5/((float)(1023));
delay_ms(10); //Espera 10ms, intervalo minimo entre leituras ADC
}
}
129
Terminal 1 ( T1 )
RA
RA
Resistncia Verde ( RV )
Terminal
Varivel ( TV )
Resistncia Azul ( RA )
Terminal 2 ( T2 )
RV
RA
RV
RV
T1 TV T2
T1 TV T2
T1 TV T2
130
Prticas
Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 10 bits e que, acenda um led vermelho quando o valor lido for menor
que 2,5V e acenda o led amarelo quando for maior. Faa isto, utilizando o valor digital referente a tenso citada, sem converso dentro do cdigo.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 10 bits e que, acenda um led vermelho quando o valor lido for menor
que 2,5V e acenda o led amarelo quando for maior. Faa isto, utilizando a tenso obtida a
partir do valor digital atravs da converso apresentada neste captulo.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 8 bits e demonstre a tenso em um display de 7 segmentos. Considere as tenses de 0 a 5 Volts, apenas a parte inteira.
Prtica 04: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 8 bits e demonstre a tenso em dois displays de 7 segmentos. Considere as tenses de 0 a 5 Volts, apresentando em um display a parte inteira e em outro
uma casa decimal.
Prtica 05: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 8 bits e demonstre o resultado em 3 displays de 7 segmentos. Considerando que os valores so de 0 a 255, ento apresente o valor da centena em um display, o valor da dezena em um segundo display e o valor da unidade no terceiro display.
Prtica 06: Projete um hardware e um software utilizando MCU 18f2550 que realize a leitura do ADC AN0 com 10 bits e demonstre o resultado em 4 displays de 7 segmentos. Considerando que os valores so de 0 a 1023, ento apresente o valor da milhar em um display, o valor da centena em um segundo display, o valor da dezena num terceiro display e
o valor da unidade no quaro display.
131
7
Interrupo externa
Neste capitulo ser apresentado o conceito de interrupes, como configurar e usar adequadamente, inclusive apresentando exemplos de cdigos. A interrupo que ser apresentada neste capitulo a interrupo externa.
132
Introduo s interrupes
Externa
2.
3.
4.
Converso AD completa
5.
6.
7.
Entre outras...
Neste livro sero abordados os principais: a interrupo externa, a recepo serial e a interrupo por Timers. Nesta unidade, ser abordado o uso e configurao das interrupo
externa, e as demais nas unidades seguintes.
133
Interrupo gerada na mudana de tenso de pinos especficos do microcontrolador. A Figura abaixo apresenta as interrupes Externas disponveis no PIC 18f2550.
Cada interrupo em um microcontrolador possui um identificador. Este usado nas funes de habilitao, configurao e uso da interrupo especfica que ele representa. Neste sentido, a Tabela abaixo apresenta as interrupes externas do PIC 18f2550 com seus
respectivos identificadores e pinos de acionamento.
Nmero
Identificadores
Pino de acionamento
Int. Externa 0
int_ext
B0
Int. Externa 1
int_ext1
B1
Int. Externa 2
int_ext2
B2
134
Funes de habilitao
O uso de interrupes s possvel caso esta tenha sido habilitada previamente. Sendo
assim, duas etapas so necessria para se habilitar o uso de interrupes. Primeiro, devese habilitar o uso global de interrupes, depois as interrupes especficas que pretende
usar.
A funo usada nas duas etapas de habilitao do uso de interrupes a mesma, e esta
descrita abaixo:
Funes de habilitao: enable_interrupts ( identificador )
Exemplos:
!
!
!
!
!
!
enable_interrupts ( global );
enable_interrupts ( int_ext );
enable_interrupts ( global )
Obs: deve-se chamar este comando antes de habilitar qualquer instruo especfica.
135
Ressalta-se que
!
!
enable_interrupts(global);
enable_interrupts(int_ext);
enable_interrupts(global | int_ext);
136
137
138
Hardware: abaixo segue hardware do exemplo, em que a quantidade de pinos e sua organizao meramente ilustrativa, no contendo os 18 pinos do PIC18F2550. Alm disto, o
hardware bsico deve ser acrescentado para funcionamento do projeto.
+5V
330 ohms
B7
B0
A
1K
PIC18F2550
139
ext_int_edge (L_TO_H);
140
ext_int_edge (H_TO_L);
5V para 0V, ou seja, quando sai do nvel lgico alto (High) para baixo (Low), o que resume
a opo H_TO_L.
141
gura o acionamento da interrupo para quando o pino B0 sai do nvel baixo para o alto
(L_TO_H), ou seja, no momento em que o boto que est pressionado despressionado.
O restante do cdigo igual, piscando o LED quando a interrupo acionada.
Exemplo de software:
#include <18f2550.h>
#use delay(clock=20000000)
#int_ext-//idenKcador-da-interrupo-externa-0
void-trata_int0(void)-//"Trata"interrupo"externa"0
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_EXT);-//"Habilita"interrupo"Global"e"Int_Ext
ext_int_edge(L_TO_H);0//"Int_Ext"sensvel"a"borda"de"subida
//ext_int_edge(H_TO_L);"//"Int_Ext"sensvel"a"borda"de"descida
while-(1);-//"Aguarda"por"uma"interrupo
}
142
Prioridade de interrupes
Conforme visto anteriormente, existe muitas interrupes, em que cada uma acionada
quando um evento especfico acontece. No caso da interrupo externa, este evento a
transio de tenso de um pino especfico. Entretanto, se todas as interrupes externas
forem acionadas ao mesmo tempo, ento qual ser processada? A primeira acionada? A
ltima acionada? Nenhuma das duas, ser acionada a que possuir a maior prioridade.
Sendo assim, para definir a prioridade dentre as interrupes habilitadas, utiliza-se a diretiva #priority. A sintaxe e um exemplo so apresentados abaixo.
Descrio: Esta diretiva define a ordem de execuo de interrupes quando as mesmas
so acionadas ao mesmo tempo, em que o primeiro identificador citado o mais importante e o ltimo o menos importante, isto considerando a ordem de prioridade.
Sintaxe:
Exemplo:
Neste exemplo, int. externa 0 tem a maior prioridade, a int. externa 1 tem a menor prioridade e a interrupo externa 2 possui prioridade intermediria entre as anteriores.
Um exemplo de cdigo apresentando a seguir com a configurao de prioridade entre duas interrupes. As interrupes externa 0 e 1 so habilitadas e configuradas, em que as
duas piscam um LED conectado ao pino B7, sendo que a int. ext. 0 acende o LED por
250 ms e a int. ext. 1 acende o LED por 2000 ms. Neste exemplo, a interrupo externa 0,
tem prioridade sobre a interrupo externa 1, conforme a diretiva #priority int_ext,
int_ext1 .
143
144
Prticas
Prtica 01: Projete um hardware e um software utilizando MCU 18f2550 que pisque um
LED sempre que a interrupo externa 0 for acionada. Considere o acionamento por borda de subida.
Prtica 02: Projete um hardware e um software utilizando MCU 18f2550 que acenda um
LED sempre que a interrupo externa 0 for acionada e apague este LED quando a interrupo externa 1 for acionada.
Prtica 03: Projete um hardware e um software utilizando MCU 18f2550 que acenda o
LED por 5 segundos sempre que a interrupo externa 0 for acionada e apague este LED
quando a interrupo externa 1 for acionada. Considere que a interrupo externa 1 tem a
maior prioridade.
Prtica 04: Projete um hardware e um software utilizando MCU 18f2550, que apresente
um contador que incremente sua contagem utilizando um boto conectado na int. externa
0 e decremente sua contagem utilizando um boto conectado na interrupo externa 1.
Apresente esta contagem em um display de 7 segmentos. Inicialize a contagem com 0 e
pare em 9.
Prtica 05: Projete um hardware e um software utilizando MCU 18f2550, que apresente
um contador que incremente sua contagem utilizando um boto conectado na int. externa
0 e decremente sua contagem utilizando um boto conectado na interrupo externa 1.
Apresente esta contagem em piscadas do LED, por exemplo, se o contador for 4, pisque
um LED 4 vezes.
145
8
Interrupo Serial /
Comunicao serial
Neste capitulo sero abordados tpicos sobre a Transmisso e Recepo serial, ressaltando suas particularidades de software e hardware, enfatizando especificamente o protocolo RS232, sua configurao e implementao em projetos utilizando microcontroladores
PIC.
146
Existem dois tipos de comunicao, a serial e a paralela. Abaixo so apresentados algumas particularidades das mesmas.
147
Modos de funcionamento
Quanto ao modo de funcionamento da transmisso serial, existem dois critrios destacados neste livro, quanto ao sincronismo e direo.
Transmisso Sncrona
2.
148
1.
2.
149
XMIT=pinX
RCV=pinR
PARITY= p
Descrio
Baud a velocidade de transmisso, medida em bits por segundo (BPS), onde x pode
assumir os valores 19.200, 9.600, 4.800, 2.400, 1.200, entre outras.
XMIT o pino de transmisso do MCU, em que pinX indicado pelo fabricante do
18f2550 sendo o pin_c7
RCV o pino de recepo do MCU, em que pinR indicado pelo fabricante do
18f2550 sendo o pin_c6
Vlida os dados da comunicao, devendo ser configurado igualmente na transmisso
e na recepo. Onde p E, N, ou O
1200
2400
4800
9600
19200
Tempo (us)
833
417
208
104
52
150
Paridade
A paridade o modo de verificar erros na comunicao no protocolo serial RS232. Para
explicar o funcionamento desta verificao de erros so utilizadas as duas etapas, transmisso e recepo.
Paridade Transmisso - Verificao erros de comunicao
O bit de paridade na etapa de transmisso calculado e colocado no pacote de dados
que ser enviado. Este dado verificado na recepo para validar o pacote de dados.
Para se calcular a paridade na etapa de transmisso, deve-se seguir os passos abaixo:
1.
2.
151
3.
Aps calcular a paridade e de ajustar este valor dentro do pacote de dados, este pacote
transmitido para o outro dispositivo.
152
Exemplos de configurao
A transmisso deve obrigatoriamente ser configurada igual a recepo para a comunicao funcionar corretamente. Abaixo so apresentados dois exemplos de cdigos para
configurao, detalhando cada parmetro utilizado.
Exemplo 1:
Exemplo 2:
153
printf
Sintaxe:
printf ( char* ) ;
Exemplo 1:
printf ( TX ) ;
Outros exemplos podem ser apresentados enviando dados numricos pela porta serial.
Nos exemplos abaixo, o %f representa os dados reais alocados em variveis do tipo float
e o %d representa os dados inteiros, alocados em variveis do tipo int. Quando um dos
identificadores citados ( %d ou %f ) so colocados dentro de aspas dupla ( ), o compilador entende que para pegar o dado que est aps as aspas, na mesma sequncia e
ordem da esquerda para direita.
Exemplo 2:
Neste exemplo 2, o valor 10 ser colocado no local que est o %f na transmisso serial.
154
Exemplo 3:
printf( x = %d , y = %d , 5 , 4);
Neste exemplo 3, os valores 5 e 4 sero colocados nos %d na mesma sequncia que esto dispostos da esquerda para direita, resultando em x=5, y=4.
Exemplo 4:
int a = 10;
printf( %d , a);
folar b = 20;
printf( %f , b);
Neste exemplo 4, a varivel a recebe o valor 10 e este valor transmitido pela serial, enquanto a varivel b recebe 20 e tambm transmitida pela serial. Vale ressaltar que a diferena o tipo de cada varivel e o identificador da mesma dentro do printf.
155
A recepo serial pode ser realizada de diversas maneiras, entretanto a adotada neste material a mais condizente do ponto de vista do autor, visto que evita processamento desnecessrio, uma vez que s analisa e processa um dado no momento que o mesmo chega na porta serial. Deste modo, a recepo utilizada funciona como uma interrupo serial. Neste sentido, faz necessrio seguir os passos para o uso de uma interrupo, conforme descrito no capitulo sobre interrupes externas, necessitando sua configurao e a
indicao da funo que ser executada no momento que a interrupo for acionada.
enable_interrupts ( global )
Obs: deve-se chamar este comando antes de habilitar qualquer instruo especfica.
Obs: esta interrupo ser executada sempre que um dado chegar pela porta serial (C7).
156
A captura do dado que chega na porta serial pode ser realizada por diversas funes. Nos
exemplos bsicos deste livro ser utilizado a captura atravs da funo getc, que retorna
um caracter que chegou na porta serial.
Funo de captura:
getc
A funo getc retorna o caracter que chegou pela serial, que acionou a interrupo serial,
e armazena no dado rx, conforme sintaxe abaixo.
Sintaxe:
char rx = getc ( ) ;
Exemplo de uso:
no exemplo ao lado, um caracter capturado e armazenado
int a = 0;
char rx = getc( )
if ( rx == 0 )
!
a = 1;
else
!
a = 2
usado como valor inteiro entre 0 e 255, ou como caracter que deve ser representado entre
aspas simples ( ). Neste exemplo est sendo verificado se rx o smbolo referente ao
nmero 0. Caso sim, a varivel recebe valor 1, caso contrrio, recebe o valor 0.
157
Sintaxe
A funo de uma interrupo fica logo abaixo do seu identificador.
Funo da interrupo. Pode ter qualquer nome. Deve estar logo abaixo do identificador int_rda. Usurio no a chama, ela executada automaticamente quando interrupo serial acionada quando chega um dado na porta serial.
Exemplo de projeto TX - RX
Transmisso - TX
#include <18f2550.h>
#use delay(clock=20000000)
void main()
{
!
while (1)
!
{
!
!
for(int dado = 0; dado<10;dado++)
!
!
{
!
!
!
printf("%d",dado);
!
!
!
delay_ms(1000);
!
!
}
!
}
}
158
Recepo - RX
#include <18f2550.h>
#use delay(clock=20000000)
#int_rda //identificador da interrupo externa 0
void trata_RX(void) // Trata interrupo externa 0
{
char rx = getc();
if( rx == 0 )
!
output_high(pin_b0);
if( rx == 5 )
!
output_low(pin_b0);
}
void main()
{
enable_interrupts(GLOBAL|INT_RDA); // Habilita interrupo Global e Int_Ext
while (1); // Aguarda por uma interrupo
}
A recepo RX deste projeto exemplo, habilita a interrupo serial (int_rda) e fica em loop
infinito ( while(1) ) espera da chegada de um dado pela porta serial. Quando isto acontece, a funo trata_RX acionada. Dentro desta, a funo getc captura o dado da serial
e armazena na varivel rx. Aps isto, esta varivel verificada em duas condies if, e
quando esta varivel est com o carcter 0, o pino B0 colocado para nvel lgico alto
(5V). Alm disto, quando esta varivel est com o carcter 5, o pino B0 colocado para
nvel lgico baixo (0V).
159
Quanto prioridade das interrupes, as funes so as mesmas da Seo 7.6, entretanto para solidificar o conhecimento, abaixo segue um exemplo utilizando interrupo externa e serial ao mesmo tempo, alm de configurar a prioridade das mesmas.
#include <18f2550.h>
#use delay(clock=20000000)
#priority int_ext, int_rda //Prioriza int_ext em relao a int_rda
#int_ext
void interrupt0(void)
{
cont++;
}
#int_rda
void interrupRX(void)
{
char rx = getc();
}
void main( )
{
enable_interrupts(global); //Habilita o uso de interrupes
enable_interrupts(int_ext); //Habilita o uso da interrupo externa 0 (Pino B0 pic18f2550)
enable_interrupts(int_rda); //Habilita o uso da interrupo serial (Pino C6 pic18f2550)
while(1);
}
160
O Circuito Integrado Max 232 bastante utilizado na construo do hardware para comunicao entre computadores pessoais e o microcontrolador utilizando o protocolo RS232.
O uso deste dispositivo detalhado a seguir.
O padro utilizado pelo CI MAX 232 o RS232, que possui as seguintes caractersticas:
que a norma determina com relao as caractersticas mecnicas (formato dos conectores e distribuio dos pinos), eltricas (nveis de tenso presentes) e lgicas (como os
dados so transmitidos e recebidos) da mesma.
O hardware bsico do CI MAX232 para comunicao entre computador e microcontrolador apresentado abaixo:
161
Para detalhar as conexes dentre o MCU e o MAX232 eas conexes entre o computador
e o MAX232, apresenta-se a figura abaixo.
162
A comunicao serial atravs de mdulos bluetooth possui uma menor complexidade que
a cabo por vrios pontos de vista, como maior facilidade de projeto de hardware, incluindo circuitos de proteo, diminuio de custos com cabos, incluindo custos com manuteno, alm de possibilitar a comunicao com outros dispositivos, como celulares, tablets, entre outros.
A comunicao serial por bluetooth adotada neste livro utiliza dispositivos shield bluetooth, que so fabricados por diversas empresas e podem ter entre 4 e 6 pinos, onde os
que apresentam s 4 pinos funcionam iguais aos de 6, s que com menos funcionalidade
e/ou configuraes. Portanto, ser apresentado abaixo o modo completo com 6 fios.
163
Normalmente conecta-se um LED no pino State e outro no pino ENABLE para monitorar
sua situao, pois quando estes pinos estiverem com 5V o seu respectivo LED deve acender e apagar quando estiver com 0V. Os mdulos de BS que possuem apenas 4 pinos
no possuem os pinos State e ENABLE.
Para realizar comunicao via Bluetooth deve-se primeiramente conectar o dispositivo e
digitar a senha de pareamento dita pelo fabricante (Normalmente 1234). Aps isto, basta
comear a transmisso.
Alguns programas emuladores de comunicao serial so bastante difundidos, onde podem ser configurados a porta de comunicao, velocidade, bits de dados, paridade, entre
outras propriedades para estabelecer uma comunicao serial para enviar e receber dados. Pode-se citar alguns, como o Docklight para Windows 7 e Vista, o Hyperterminal
que j instalado dentro do Windows XP, e apenas nele (est dentro da aba dos Acessrios da lista de Programas instalados), o BlueTherm para dispositivos com sistema operacional Android (Google) para comunicao Serial RS 232 via bluetooth, entre outros.
164
Prticas
Projeto 1:
Prtica TX: Projete um contador que incremente sua contagem de 0 at 9 dentro do programa principal, conforme exemplo abaixo.
Prtica RX: Projete um software e um hardware que receba um dado pela interrupo serial e apresente este dado em um display de 7 segmentos. Os dados que iro chegar ser
sempre entre 0 e 9.
165
Projeto 2:
Prtica TX: Projete um contador que incremente sua contagem utilizando um boto conectado na int. externa 0 e decremente sua contagem utilizando um boto conectado na interrupo externa 1. Sempre que o valor da interrupo for alterado, envie pela porta serial
o valor da contagem. A contagem dever ser de 0 a 9, quando passar de 9 deve voltara
para zero, e quando for menor que zero deve ir para 9.
Prtica RX: Projete um software e um hardware que receba um dado pela interrupo serial e apresente este dado em um display de 7 segmentos. Os dados que iro chegar ser
sempre entre 0 e 9.
Projeto 3:
Prtica TX: Utilize algum programa de emulao serial e estabelea comunicao com um
Microncontrolador.
Prtica RX: Projete um software e um hardware que receba um dado pela interrupo serial e apresente este dado em um display de 7 segmentos. Os dados que iro chegar ser
sempre entre 0 e 9.
166
9
Interrupo
temporizada
Esta interrupo gerada pelo estouro de uma contagem interna do MCU. O PIC18F2550
possui 4 timers que funcionam como interrupo, Timer 0, 1, 2 e 3. Cada um destes timers possui um identificador especfico que utilizado para habilitar a interrupo e tambm para identificar qual funo deve ser executada quando o estou do mesmo acontecer. Os identificadores so apresentados na tabela abaixo.
Interrupes do PIC18F2550
Identificadores
Int. Timer 0
int_timer0
Int. Timer 1
int_timer1
Int. Timer 2
int_timer2
Int. Timer 3
int_timer3
enable_interrupts ( global );
Obs: deve-se chamar este comando antes de habilitar qualquer instruo especfica.
168
169
170
A contagem de um timer acontece at o mesmo chegar a contagem mxima pr-configurada. Ao chegar neste valor mximo, a interrupo acionada e a funo correspondente
executada caso set interrupo esteja habilitada.
Para que seja entendido com mais detalhes, vamos supor que a contagem mxima prconfigurada no timer 10, ento sua contagem comear em 0 e ir at 10, que o valor
mximo. Quando esta contagem chegar ao valor 10, ento a interrupo acionada. Este
exemplo pode ser visualizado no vdeo abaixo. Lembrando que estes valores so exemplos simples para facilitar o aprendizado.
Filme 9.1 Exemplo de demonstrao do estouro do timer.
A animao acima apresenta o estouro do timer com mais detalhes, em que a contagem inicializa
em 0 e incrementada at o valor mximo, que 10 neste exemplo, onde acontece o estouro do
timer e a interrupo acionada.
171
O modo de configurao utilizando prescaler bastante utilizado para ampliar a contagem do valor das interrupes temporizadas. Esta configurao permite aumentar uma
contagem pequena para uma maior n vezes.
Exemplificando a configurao do prescaler para um melhor entendimento, ser utilizado
a contagem mxima 10, conforme exemplos anteriores e um prescaler com valor 3. Isto
quer dizer que o timer deve estourar 3 vezes para que a interrupo seja acionada, conforme o Filme 9.2, apresentado abaixo.
Filme 9.2 : Exemplo de demonstrao terica do prescaler.
Neste exemplo, o timer estoura na contagem 10, o precaver 3, mas a interrupo s acionada
na contagem 30, que corresponde contagem mxima multiplicada pelo prescaler.
172
No microcontrolador PIC18F2550 existem 4 timers que so utilizados para acionar a interrupo temporizada. Cada um destes timers possui uma resoluo distinta, neste sentido
a contagem mxima de cada timer tambm distinta. Abaixo so apresentados os valores das resolues para cada timer e os tempos de contagem mxima de cada estouro do
timer em microsegundos e em segundos.
Timer
Resoluo
Microsegundos
Segundos
A partir dos valores mximos de contagem dos timers possvel explanarmos os modos
de configurao do precaver, do incio da contagem e do clock utilizado na contagem.
Funo:
setup_timer_N
setup_timer_1 ( T1_internal ) ;
173
Existe outros parmetros possveis para a configurao do clock do timer, entretanto nas
prticas deste livro o clock ser sempre configurado como clock interno. Vale ressaltar
que os timers 1, 2 e 3 obedecem ao exemplo apresentado, sendo o parmetro de configurao T1_internal, T2_internal e T3_internal para realizar a configurao citada nos timer 1, 2 e 3, respectivamente. J o timer 1 deve ser configurado com o paramento
RTCC_internal para que o mesmo use o clock interno.
Resumo:
Prescaler mximo
Valores possveis
256
1, 2, 4, 8
16
1, 2, 4, 8, 16
1, 2, 4, 8
Vale ressaltar que o prescaler a quantidade de vezes que o microcontrolador precisa realizar o estouro do timer para acionar a interrupo temporizada. A funo que realiza a
configurao do prescaler apresentada a seguir.
174
SETUP_TIMER_0
Exemplo:
SETUP_TIMER_0 (RTCC_DIV_2)
Neste exemplo, o timer 0 configurado com prescaler 64 e clock interno. Na funo principal, a execuo fica em loop infinito sem fazer nada, preso na instruo while(1). Sempre
que a interrupo do timer 0 acionada, a funo trata_t0 acionada, visto que ela est
em baixo do identificador #int_timer0. Nesta funo o pino B7 colocado para alto (5V) e
250 milisegundos depois colocado para baixo (0V). Esta configurao de prescaler 64
do timer 0 de 16 bits que cada ciclo do timer estoura em 0,065536 segundos, ento se sero necessrios 64 estouros para acionar a interrupo externa 0, tm-se que esta interrupo ser acionada em 4,194304 segundos (0,065536x64= 4,194304).
175
#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer0-//idenKcador-da-interrupo-temporizada-0
void-trata_t0(void)-//"Trata"interrupo"por"Kmer"0
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER0);-//"Habilita"interrupo"Global"e"Int_TIMER0
setup_Kmer_0(RTCC_INTERNAL|RTCC_DIV_64);-//configura timer 0 com clock interno e
//prescaler 64
while-(1);-//"Aguarda"por"uma"interrupo
}
Exemplo 2: uso da interrupo temporizada 0 com contagem completa 256 vezes.
Neste exemplo 2, o timer 0 configurado com prescaler 256 e clock interno. Do mesmo
modo que o exemplo 1, a execuo fica em loop infinito sem fazer nada, preso na instru-
#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer0-//idenKcador-da-interrupo-temporizada-0
void-trata_t0(void)-//"Trata"interrupo"por"Kmer"0
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER0);-//"Habilita"interrupo"Global"e"Int_TIMER0
setup_Kmer_0(RTCC_INTERNAL|RTCC_DIV_256);-//configura timer 0 com clock interno
// e prescaler 256
while-(1);-//"Aguarda"por"uma"interrupo
}
176
o while(1). Sempre que a interrupo do timer 0 acionada, a funo trata_t0 acionada, visto que ela est em baixo do identificador #int_timer0, em que esta funo funciona
igual o exemplo 1. Nesta configurao de prescaler 256 do timer 0 de 16 bits que cada ciclo do timer estoura em 0,065536 segundos, ento se sero necessrios 256 estouros
para acionar a interrupo externa 0, tm-se que esta interrupo ser acionada em
4,194304 segundos ( 0,065536 x 256 = 16,777216 ).
Funo:
SETUP_TIMER_1
SETUP_TIMER_1 (T1_DIV_4)
177
Neste exemplo 3, o timer 1 configurado com prescaler 8 e clock interno. Na funo principal, a execuo fica em loop infinito sem fazer nada, preso na instruo while(1). Sempre que a interrupo do timer 1 acionada, a funo interrupt1 acionada, visto que ela
est em baixo do identificador #int_timer1. Nesta funo o pino B7 colocado para alto
(5V) e 250 milisegundos depois colocado para baixo (0V). Esta configurao de prescaler 8 do timer 1 de 16 bits que cada ciclo do timer estoura em 0,065536 segundos, ento
se sero necessrios 8 estouros para acionar a interrupo externa 1, tm-se que esta interrupo ser acionada em 0,524288 segundos (0,065536x8= 0,524288).
#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer1-//idenKcador-da-interrupo-temporizada-1
void-interrupt1(void)-//"Trata"interrupo"por"Kmer"1
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER1);-//"Habilita"interrupo"Global"e"Int_TIMER1
setup_Kmer_1(T1_INTERNAL|T1_DIV_8);-//configura timer 1 com clock interno
// e prescaler 8
while-(1);-//"Aguarda"por"uma"interrupo
}
SETUP_TIMER_2
Exemplo:
SETUP_TIMER_2 (T2_DIV_4)
SETUP_TIMER_3
SETUP_TIMER_3 (T3_DIV_4)
179
Muitas vezes quando se usa a interrupo temporizada, deseja-se fazer algo considerando um tempo de forma constante, como por exemplo, ler uma porta a cada segundo. Entretanto, s vezes, a funo da interrupo que est execuo demanda um certo tempo,
ento, o tempo desejado no ser executado. A figura abaixo apresenta um exemplo em
que o tempo desejado e configurado para acionamento da interrupo 1 segundo, conforme apresentado em verde, sendo que a funo executada dentro da interrupo possui
custo computacional de 0,2 segundos. Como a contagem para uma nova interrupo s
comea ao sair da funo da interrupo, ento o tempo entre a execuo das funes
o somatrio do tempo configurado com o tempo gasto pela funo da interrupo que
1,2 segundos.
1,2 segundos
1 segundo
Interrupo
1,2 segundos
0,2 s
1 segundo
Interrupo
1,2 segundos
0,2 s
1 segundo
Interrupo
0,2 s
Interrupo
Deste modo, faz-se necessrio compensar este tempo gasto pela funo da interrupo
utilizando as funes get_timer_x e set_timer_x, em que x o timer utilizado.
180
set_timer_N
set_timer_1 ( 1000 ) ;
Exemplo 2:
set_timer_2 ( 100 ) ;
Exemplo 3:
set_timer_3 ( 10 ) ;
get_timer_N
Exemplo 2:
Exemplo 3:
181
0,2 s
Interrupo
0,8 s
1 segundo
0,2 s
Interrupo
0,8 s
1 segundo
0,2 s
0,8 s
Interrupo
1 segundo
0,2 s
Interrupo
0,8 s
Interrupo
Para realizar esta compensao, basta ler a contagem e utilizar este valor para inicializar a
contagem da interrupo que vir a seguir, ou seja chamando a funo get_timer_x dentro
da funo set_timer_x, conforme exemplo abaixo.
set_timer_x ( get_timer_x( ) );
182
Exemplo:
#include <18f2550.h>
#use delay(clock=20000000)
#int_Kmer1-//idenKcador-da-interrupo-temporizada-1
void-interrupt1(void)-//"Trata"interrupo"por"Kmer"1
{
output_high-(pin_b7);-//"Acende"LED"para"demonstrar"que"houve"interrupo"
delay_ms-(250);-
output_low-(pin_b7);-//"aps"250"ms"apaga"LED
set_3mer_10(0get_3mer_1(0)0);//compensa0os02500ms0gastos0no0delay0e0no0acesso0ao0pino0B7
}
void-main()
{
enable_interrupts(GLOBAL|INT_TIMER1);-//"Habilita"interrupo"Global"e"Int_TIMER1
setup_Kmer_1(T1_INTERNAL|T1_DIV_8);-//configura timer 1 com clock interno
// e prescaler 8
while-(1);-//"Aguarda"por"uma"interrupo
}
Neste exemplo, a compensao do tempo gasto na funo interrupt1 apresentado em
vermelho, em que a contagem do timer 1 para uma nova interrupo deste timer inicializado com a contagem que foi gasta na execuo da funo da interrupo. Vale ressaltar
que o usurio no precisa saber o tempo exato que ir demorar dentro do timer, pois este
modo de uso inicializa a contagem sempre com o valor gasto pela funo da interrupo.
Deve-se apenas ter cuidado de no configurao o acionamento da interrupo com um
tempo inferior ao tempo demandado pela funo da interrupo temporizada, pois neste
caso no haver como compensar o tempo gasto.
183
Muitas vezes o estouro do timer total no satisfaz uma aplicao especfica, onde desejase a contagem de um valor menor do que o mximo daquela interrupo. Ento, como
acionar a interrupo com um valor menor que o mximo?
Para responder esta pergunta, no se pode esquecer que o acionamento da interrupo
acontece quando o contador chega na contagem mxima. Deste modo, quando se deseja
acionar um valor menor do que o mximo, basta alterar o incio da contagem. Por exemplo, considerando que a contagem mxima 10, igual o Filme 9.1, e que se deseja uma
contagem de apenas 8 para acionar o timer, ento deve-se inicializar a contagem com a
diferena destes dois valores, que o valor 2. Estes dados so apresentados a seguir
para melhor visualizao.
Para melhorar o entendimento, o Filme 9.2 apresenta o estouro do timer com a contagem
8, entretanto o valor mximo continua 10, alterando apenas a inicializao para o valor 2.
184
Filme 9.3 Exemplo de acionamento do timer com valor menor que o mximo do timer.
Este filme acima apresentada a contagem de um valor menor que o mximo, utilizando a diferena
do valor mximo do timer e o valor desejado para inicializar a contagem. Deste modo, o estouro do
timer ser realizado na contagem desejada.
Para se configurar o tempo do temporizador desejado deve-se seguir alguns passos descritos a seguir. Entretanto, deve-se ressaltar que o tempo desejado no deve ultrapassar o
valor mximo do timer utilizado. De posse do tempo desejado, deve-se seguir os passos
a seguir:
185
1.
2.
3.
Verificar se o tempo desejado menor que o produto do prescaler pelo valor mximo
em que
Vinit
= Valor desejado
Nbits
TD
= Tempo Desejado
186
Para se exemplificar o clculo apresentado, vamos considerar o uso do Timer 0, desejando o acionamento da interrupo de 0,5 segundos. Para isto iremos usar o passo detalhados, selecionando o prescaler 64 bits.
Passos sugeridos:
#include <18f2550.h>
#use delay(clock=20000000)
#int_timer0
void timer0(void)
{
delay_ms(50);
set_timer_0( 57723 + get_timer_0() ); //compensa os 50 Sm gastos e inicializa com 57723
}
void main( )
{
enable_interrupts(global);
//Habilita o uso de interrupes
enable_interrupts(int_timer0);
//Habilita o uso da interrupo pelo timer 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //configura timer 0 com clock interno
//e prescaler 64
set_timer_0(57723); //inicializa timer com 3036 para obter interrupcao com 0,5 segundos
while(1);
}
187
Diferente da seo anterior, s vezes desejamos executar uma funo com um intervalo
maior do que o timer disponibilizado. Para usar esta metodologia iremos utilizar um artifcio de programao e no uma configurao do timer. Para demonstrar esta artficio, iremos incrementar o exemplo apresentado na seo anterior, onde o timer 0 est habilitado
para ser acionado a cada 0,5 segundos, em que o artifcio apresentado em vermelho no
cdigo abaixo.
Exemplo:
#include <18f2550.h>
#use delay(clock=20000000)
int contTimer = 0;
#int_timer0
void timer0(void)
{
contTimer ++;
if(contTimer = = 2)
{
delay_ms(50);//Poderia ser outras funes, uma ou um bloco de comandos
}
set_timer_0( 57737 + get_timer_0() );
//Inicializao da contagem para o proximo ciclo de interrupcao com 57736
//get_timer_0() compensa o tempo de execucao das operacoes do timer ( delay_ms(50) )
}
void main( )
{
enable_interrupts(global);
//Habilita o uso de interrupes
enable_interrupts(int_timer0);
//Habilita o uso da interrupo pelo timer 0
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //configura timer 0 com clock interno
e prescaler 64
set_timer_0(57736); //inicializa timer com 3036 para obter interrupcao com 0,5 segundos
while(1);
}
188
189
Prticas
Prtica 1: Projete um contador com display de 7 segmentos que incremente sua contagem atravs de uma interrupo externa a cada 0,5 segundo.
Prtica 2: Projete um hardware e um software com MCU que a cada 1 segundo acione o
timer, leia um ADC, transforme este valor em tensao e apresente a parte inteira desta tenso em um display de 7 segmentos.
Prtica 3: Projete um hardware e um software com MCU que a cada 5 segundos acione
um timer de seua escolha e acenda o LED1 durante 0,5 segundos. Alm disto, acenda o
LED2 por 0,5 segundos sempre que apertar um boto conectado e acionado atravs de
uma interrupo externa. Vale ressaltar que a prioridade de interrupes externas, timer,
serial, entre outras funcionam igualmente ao demonstrado para interrupo externa.
Prtica 4: Projete um hardware e um software com MCU que a cada 5 segundos acione o
timer 0, acendendo o LED1 e a cada 1 segundo acione o timer 1 e acenda o LED2.
Prtica 5: Projete um hardware e um software com MCU que a cada 20 segundos acione
o timer 0, acendendo o LED1. Ressalto que deve ser utilizado o artifcio apresentado na
Seo 7 deste capitulo.
190
10
Sistema de reset e
configuraes
191
#fuses POR
#fuses NOPOR
#fuses BROWNOUT
#fuses NOBROWNOUT
#fuses
#fuses
#fuses
#fuses
BOR46
BOR43
BOR28
BOR20
Configura
Configura
Configura
Configura
VBOR
VBOR
VBOR
VBOR
para
para
para
para
4,6
4,3
2,8
2,0
V
V
V
V
Vale ressaltar que a configurao da tenso VBOR deve vir depois da habilitao do
Brown-Out Reset, nunca anteriormente.
192
#fuses PUT
#fuses NOPUT
#fuses OST
#fuses NOOST
#fuses MCLR
#fuses NOMCLR
193
reset_cpu ( );
#fuses WDT
#fuses NOWDT
Modo de reset: O programa deve ser responsvel por reiniciar a contagem do timer do
WDT em alguns pontos do cdigo. Aconselha-se a colocar em pontos executados rotineiramente do programa, visto que se estas funes deixem de ser executada, isto indica
que o MCU parou de funcionar e deve ser resetado, ou seja, reiniciado.
A funo de habilitao da contagem do WDT :
A funo de reset da contagem do WDT :
setup_wdt( WDT_ON );
restart_wdt( )
194
Configurao do tempo de reset do WDT: a diretiva desta configurao indica a quantidade de ciclos que o WDT ir contabilizar, em que ao chegar nesta contagem o WDT reiniciar o programa em execuo. Vale ressaltar que cada ciclo equivale a 4,1 milisegundos
(ms). Esta configurao obedece a diretiva de configurao apresentada abaixo.
Diretiva para desabilitar esta configurao:
#fuses WDTVALOR
Vale ressaltar que o termo VALOR da diretiva apresentada pode receber os valores
1,2,4,8,16,32,64,...,32768. Por exemplo, caso nmero de ciclos do WDT seja configurado
com 1024, em que cada ciclo equivale a 4,1 ms, ento o tempo de reset deste WDT
1024x4,1ms, que igual a 4,2 segundos. Isto quer dizer que se o WDT no reiniciar sua
contagem em um perodo de 4,2 segundos, ento este ser reiniciado. Este exemplo de
configurao apresentado abaixo:
#fuses WDT!
#fuses WDT1024!
195
Esta funo retorna um nmero de 0 a 15, em que este valor normalmente armazendo
em uma varivel para anlise ou registro, conforme apresentado no exemplo abaixo, em
que a varivel res do tipo inteiro ir armazenar tal valor de retorno.
int res = restart_cause ( );
setar o MCU, ento o LED do pino B7 acende. Quando a chave do pino A1 acionada, a
funo reset_cpu executada, reiniciando o MCU e o LED do pino B6 acende indicando
reset por software. Quando o boto do pino 1 pressionado, o MCU reinicia por hardware, e o led do pino B5 acende na inicializao. O WDT foi configurado com o comando #fuses WDT, WDT1024 e ativado com a funo setup_wdt(WDT_ON) e a contagem reinicia
em cada loop do while com a funo restart_wdt. Quando a chave do pino A0 pressionada, o programa entra em um loop infinito, que faz com que o WDT seja acionado e o
LED do pino B4 acende na inicializao.
Software:
Hardware:
#include <18F2550.h>
#use delay(clock=2000000)
#fuses HS, WDT, WDT1024
void verifica_inicializacao(void)
{
int cause;
cause = restart_cause();
switch ( cause )
{
!
case 12://Inicializacao Normal
!
output_high(pin_b7);
!
break;
!
case 0: //Reinicializacao por software
!
output_high(pin_b6);
!
break;
!
case 15: //Reinicializacao por hardware
!
output_high(pin_b5);
!
break;
!
case 7: //Reinicializacao por watchdog timeout
!
output_high(pin_b4);
!
break;
} //fim switch
}
main()
{
verifica_inicializacao(); // verifica os flags do RCON
setup_wdt(WDT_ON);
while(1)
{
!
restart_wdt(); //reinicia a contagem do watchdog timer
!
if (input(pin_a0)) while(1); //se chave A0 pressionada, entra em loop e espera watchdog disparar
!
if (input(pin_a1)) reset_cpu(); // se chave A1 pressionada, reseta a cpu por software
}
}
197
11
Sensor ptico Infravermelho
O circuito abaixo composto pelos componentes TIL78 e TIL32, em que o TIL32 um
emissor infravermelho, o que nada mais que um foto-emissor, o qual funciona semelhante a um LED, emitindo um feixe quando est polarizado corretamente e possui corrente suficiente para isto. A corrente no pode ultrapassar o limite determinado pelo fabricante,
pois ir danificar o componente.
J o TIL78 um foto receptor, funcionando semelhante a um transistor, onde o sinal de base deste
transistor um feixe de luz. Quando existe a presena de luz, este componente permite passagem
de corrente no sentido do pino 2 para o pino 1, seguindo a figura ao lado. Quanto maior o sinal de
luz, maior a corrente e menor a tenso em cima
deste componente. O componente TIL78 normalmente preto e o TIL32 normalmente transparente.
Existe diversos circuitos bsicos para conexo destes dois componentes. O circuito mais
bsico apresentado na figura ao lado, mas este no leva em considerao a interferncia de rudos externos, nem filtra o sinal recebido, onde iria processar apenas o sinal de
interesse, podendo sofrer influncia de luz ambiente, de rudos, inclusive de outros sinais
Infravermelhos (IR- Infra Red). Para retirar estas possveis falhas basta inserir uma frequncia especfica no envio e na recepo do sinal.
198
Neste tipo de aplicao, um feixe projetado por LED emissor de luz infravermelha
que, ao ser refletido por algum obstculo,
detectado por um foto-transistor. Quanto
mais prximo o obstculo estiver do conjunto emissor-receptor, maior ser a intensidade do sinal recebido. Se este sinal alcanar um limite pr-definido, o sistema indica
sua presena.
199
Observe que esta mesma tcnica pode ser utilizada por um rob para o desvio de obstculos,
bem como seguir uma linha demarcada no solo.
Para este ltimo caso, dois foto-receptores detectam a posio de uma linha com coeficiente
de reflexo diferente do piso (ver Figura 5). Um
processador recebe as informaes dos sensores controlando a movimentao do rob.
Por fim, outra aplicao pode ser encontrada na deteco de presena. A Figura ao lado mostra uma porta
com foto-transmissores e receptores instalados no batente. Quando uma pessoa passa pela porta, o feixe
refletido e um sistema de alarme pode reconhecer a presena e tomar as aes necessrias.
200
Prticas
Prtica 1 - Realizar a leitura do sensor tico IR, acendendo um led quando algum objeto
estiver cortando o sinal entre o TX e RX do sensor IR.
Prtica 2 - Realizar a leitura do sensor tico IR e indicar a cor do objeto de reflexo do sinal do TX para o RX em um display de 7 segmentos, obedecendo a tabela abaixo para
cada cor, sendo 0 para branco e 6 para preto.
N-Display-bCor
Tenso-em-AN0
1bBranco-
VAN0-<-0,7V-
2bAmarelo
0,7V-<-VAN0-<-1V
3bVerde
4bAzul
2,1V-<-VAN0-<-2,8V
1,5V-<-VAN0-<-2V
VAN0=(5000*( (int32)read_adc( ) ) )/1023;
5bVermelho
6bPreto
1,2V-<-VAN0-<-1,5V
4V-<-VAN0
Observao 2: Esta prtica 2 consiste no fato de que cada cor reflete quantidades de feixes diferentes, gerando tenes diferentes nos receptores. Estes valores das tabelas so
estimativas e podem ser alterados dependendo da superfcie dos objetos.
Observao 3: O clculo de AN0 segue os mesmos princpios do clculo apresentado no
capitulo 6, onde abordada a leitura do ADC.
201
12
Memria EEPROM
Memria EEPROM memria de dados que no se apaga ou no perdida mesmo ao inicializar ou resetar o MCU. Os Microcontroladores da famlia PIC j possui 256 bytes de
memria EEPROM interna, prpria do MCU, o que pouco dependendo da aplicao.
Nestas aplicaes pode-se utilizar uma memria externa para aumentar a quantidade de
memria EEPROM disponvel na sua aplicao.
24LC256 que possui 32K bytes de memria e funciona utilizando a comunicao serial
com protocolo i2c. O uso deste componente simples visto que basta montar o hardware
de acordo com o datasheet do fabricante e utilizar a biblioteca fornecida pelo prprio
CCS para manipular este dispositivo.
MCU usado. No caso do 18f2550 os pinos so B0 e B1, e para identific-los basta procurar no datasheet as funcionalidades SCL e SDA. Para quem usa o software Proteus para
simulao isto j est descrito na identificao dos pinos B0 e B1.
Aps identificar os pinos SCL e SDA do MCU deve-se conectar estes pinos ao seu
correspondente no 24C256, em outras palavras conectar SCL com SCL e SDA com SDA.
Alm disto deve colocar dois resistores de PULL-UP de 2K nestes dois pinos para que o
dispositivo funcione corretamente. Abaixo est demonstrado o Hardware montado apenas com a memria externa, devendo acrescentar o circuito bsico.
Os pinos A0, A1 e A2 do 24C256 so utilizados para identificar o endereo da memria externa. No caso do hardware adotado neste exemplo bsico os 3 pinos esto aterrados,
sendo o endereo 000 adotado para este dispositivo.
203
Para adicionar esta biblioteca na sua aplicao basta inserir a linha de incluso da mesma
logo abaixo da identificao do MCU. Deste modo, a incluso deve ser feita com a seguinte linha de comando:
Algumas vezes ao instalar o CCS esta biblioteca vm com os pinos trocados. Para ve-
e SCL o pino B0 ento est trocado. Deve-se trocar estas linhas de comando pelas apresentadas
abaixo, trocando B0 com B1 e B1 com B0.
204
Descrio: Esta funo configura o incio do uso desta memria externa, devendo ser chamada antes de comear este dispositivo.
Descrio: Esta funo escreve o valor que est na segunda entrada da funo na posio de memria que est na primeira entrada da funo. Ressalto que o valor deve ser
at 8 bits, que de o at 255 e a posio de memria deve estar entre 0 e 32768.
205
Descrio: Esta funo escreve o valor que est na segunda entrada da funo na posio de memria que est na primeira entrada da funo. Ressalto que o valor deve ser
at 8 bits, que de o at 255 e a posio de memria deve estar entre 0 e 32768.
206
na prtica o uso destas funes citadas acima. Ressalta-se tambm que caso no tenha
feito a alterao dos pinos da biblioteca, basta trocar os pinos de conexo do MCU com
a memria EEPROM e ligar SDA com SCL e SCL com SDA no hardware.
#include <18f2550.h>
#fuses HS
#use delay(clock = 20000000)
#include <24256.c>
void main()
{
int dado;
printf("Start\n\r");
init_ext_eeprom(); //Inicializando a memria externa, deve sempre ser chamada no inicio do main
delay_us (200);! //Tempo necessrio para inicializar corretamente a EEPROM
write_ext_eeprom(0x20, 0x40); //Escrevendo o valor hexadecimal 0x40 na posio 0x20
delay_ms(200); //Tempo necessrio para escrita na EEPROM
write_ext_eeprom(30, 0xAA); //Escrevendo o valor hexadecimal 0xAA na posio 30
delay_ms(200); //Tempo necessrio para escrita na EEPROM
write_ext_eeprom(100, 10); //Escrevendo o valor 10 na posio 100
delay_ms(200); //Tempo necessrio para escrita na EEPROM
dado= read_ext_eeprom(4); //Lendo o valor da posio 4 e guardando na varivel dado
delay_ms(200); //Tempo necessrio para leitura da EEPROM
dado = read_ext_eeprom(100); //Lendo o valor da posio 4 e guardando na varivel dado
delay_ms(200); //Tempo necessrio para leitura da EEPROM
while(1);
}
207
Prticas
Prtica 1: Projete um sistema com MCU que a cada 1 segundo leia um ADC e armazene
na memria externa. Os dados devem ser armazenados em sequncia, comeando da posio e deve parar quando chegar na posio mxima de memria disponvel.
Prtica 2: Faa o mesmo que a prtica 1 utilizando a memria interna.
Prtica 3: Faa o mesmo que a prtica 1, entretanto quando completar a memria externa, peo que enviem pela porta serial as informaes, e em seguida comecem todo o processo novamente, preenchendo a memria desde a posio 0.
Prtica 4: Faa o mesmo que a prtica 3 utilizando a memria interna.
208