Você está na página 1de 75

Microcontroladores

Curso de Automao Industrial


PROF. DILUS DE CARVALHO CASTRO PENIDO.
PROF. M. SC. RONALDO S. TRINDADE.
IFMG Campus Ouro Preto
Maro de 2011
verso 1.4
2
Sumrio
1 Conhecendo os Microcontroladores 9
1.1 1.1.Origem dos Microcontroladores . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Arquiteturas Harvard e Von Neuman . . . . . . . . . . . . . . . . . . . . . . . 12
2 Os Microcontroladores da Famlia PIC 17
2.1 Folha de Dados do PIC 12F675 . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 Aplicaes Simples com PIC 12F675 . . . . . . . . . . . . . . . . . . . . . . 18
2.2.1 Contador de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2 Acionador de um Sistema de Bombeamento de gua . . . . . . . . . 18
3 Hardware do Microcontrolador 23
3.1 Descriao dos pinos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 Memria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3 Registradores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 Pinos de I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.5 Temporizadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4 Hardware do microcontrolador (continuao) 29
4.1 Comparadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.2 PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Conversor A/D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.4 USART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5 Set de Instrues 33
5.1 Estrutura das instrues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.2 Grupos de instrues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.2.1 Instrues orientadas a registradores com tamanho de um byte . . . 34
5.2.2 Instrues orientadas aos bits de registradores . . . . . . . . . . . . . 35
5.2.3 Instrues orientadas a operaes com constantes (literais) e cont-
role de uxo do programa . . . . . . . . . . . . . . . . . . . . . . . . . 35
6 Interrupes 37
6.1 Interrupes no Microcontrolador . . . . . . . . . . . . . . . . . . . . . . . . . 37
3
4 SUMRIO
6.2 Interrupo de timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.3 Interrupo externa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.4 Outras interrupes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7 Programao Assembly 41
7.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
7.2 Programando em Assembly MPASM . . . . . . . . . . . . . . . . . . . . . . . 41
7.3 Exemplos de Programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.3.1 Pisca LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
7.3.2 Dissecando o Pisca LED . . . . . . . . . . . . . . . . . . . . . . . . . 46
8 Programao Assembly (continuao) 51
8.1 Programando Assembly com Interrupo . . . . . . . . . . . . . . . . . . . . 51
8.1.1 Pisca LED com Interrupo . . . . . . . . . . . . . . . . . . . . . . . . 51
8.1.2 Dissecando o Pisca LED com Interrupo . . . . . . . . . . . . . . . . 55
9 Programao C 59
9.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
9.2 Pincipais Estruturas da Linguagem C . . . . . . . . . . . . . . . . . . . . . . 59
9.2.1 Variveis, Atribuies e Comparaes . . . . . . . . . . . . . . . . . . 59
9.2.2 Estruturas de Controle . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
9.2.3 Estruturas de Repetio . . . . . . . . . . . . . . . . . . . . . . . . . . 61
9.3 Programas em C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
9.3.1 Pisca LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
9.3.2 Dissecando o Pisca LED . . . . . . . . . . . . . . . . . . . . . . . . . 63
9.3.3 Pisca LED com Interrupo . . . . . . . . . . . . . . . . . . . . . . . . 65
9.3.4 Dissecando o Pisca LED com Interrupo . . . . . . . . . . . . . . . . 66
10 Programao C (continuao) 69
10.1 conversor A/D do microcontrolador PIC12F675 . . . . . . . . . . . . . . . . . 69
10.2 Programa Exemplo A/D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
SUMRIO 5
Palavra do professor-autor
Prezado estudante,
com enorme satisfao que lhe apresentamos a disciplina MICRONTROLADORES do
seu curso de AUTOMAO INDUSTRIAL. Esse trabalho fruto de nossa longa experincia
no trato com os microntroladores seja como professor, seja como desenvolvedor de equipa-
mentos que utilizam essa maravilha da moderna microeletrnica. Os microcontroladores
tm enorme aplicao em nosso dia a dia e, muitas vezes, nem nos damos conta de que o
equipamento que estamos utilizando possui um microcontrolador. Citamos como exemplo
os aparelhos de DVD, televiso, forno de micro-ondas, geladeiras, porto eletrnico, sis-
temas eletro/eletrnicos de automveis e at o carto de crdito com chip! Se naqueles
equipamentos de uso dirio os microcontroladorese j se fazem presentes, voc nem pode
imaginar como eles esto embutidos em praticamente todas as aplicaes eletrnicas den-
tro de uma indstria. Ao longo do curso voc ser capaz de constatar por si mesmo uma
enormidade de aplicaes. Para encerrar essa conversa lembre-se: se voc chegou at
este ponto, poder ir muito mais longe, para alm desse curso. O mundo l fora precisa de
uma pessoa como voc, que corre atrs de seus objetivos, que busca aprender e se mel-
horar cada vez mais. Conte com toda a nossa equipe para apoi-lo e esteja certo de que
voc ir superar as suas diculdades. Um forte abrao dos professores Ronaldo Trindade e
dilus Penido.
6 SUMRIO
Apresentao da disciplina
Nesta disciplina de Microcontroladores, vamos juntos percorrer um universo novo de
aplicaes da microeletrnica. At aqui voc j teve a oportunidade de conhecer e estudar
os diversos componentes eletrnicos tais como diodos, transistores e circuitos integrados.
Voc j sabe que os componentes eletrnicos so interligados para formar circuitos que de-
sempenham funes especcas e pde estudar, na Eletrnica Digital, como os circuitos po-
dem executar funes lgicas (AND, OR, XOR, NOT) em suas mais variadas combinaes.
Acontece que, quando a complexidade de um circuito aumenta muito (em termos das diver-
sas funes a serem executadas), muitas vezes torna-se invivel a produo de tal circuito.
Nesse ponto, ca mais fcil e mais barato utilizar um circuito que possa ser programado
(o microcontrolador) e, utilizando-se corretamente os seus terminais de entrada e de sada,
executar internamente as funes desejadas atravs de um software. <Glossrio> software:
Termo ingls que designa o conjunto de instrues que pode ser interpretadas e executadas
por um determinado processador de dados. Software tambm conhecido como programa
de computador </Glossrio> A proposta dessa disciplina , ento, ensin-lo a programar
um microcontrolador, de tal forma que ele possa executar as funes a ele designadas.
Para atingir nosso objetivo, estudaremos a estrutura interna de um microcontrolador, suas
funes internas, seus perifricos associados, seus registradores, temporizadores, pinos
de entrada/sada e demais perifricos de interface com o mundo exterior. Estudaremos
tambm a forma de programar, gravar e testar o software dentro de um microcontrolador e,
nalmente, apresentaremos algumas aplicaes prticas que voc poder implementar.
SUMRIO 7
Projeto instrucional
Disciplina: MICROCONTOLADORES
Ementa:
Arquitetura dos Microcontroladores.
Instrues Assembler.
Tcnicas de Programao.
Desenvolvimento de Sistemas Microcontrolados.
AULA OBJETIVOS MATERIAIS C. HORRIA
1. Conhecendo os Conhecer os microcontro- Caderno de texto e
Microcontroladores ladores no seu aspecto geral. Ambiente virtual 7
2. Os Microcontroladores Conhecer caractersticas do Caderno de texto e
da famlia PIC PIC 12F675 Ambiente virtual 7
3. Hardware do Conhecer o harware interno Caderno de texto e
microcontrolador do microcontrolador. Ambiente virtual 7
4. Hardware do Conhecer o harware interno Caderno de texto e
microcontrolador do microcontrolador Ambiente virtual 8
(continuao)
5. Set de instrues Conhecer o set de intrues Caderno de texto e
do microcontrolador Ambiente virtual 8
6. Interrupes Conhecer as interrrupes Caderno de texto e
do microcontrolador Ambiente virtual 8
7. Programao Assembly Conhecer a programao Caderno de texto e
assembly do PIC Ambiente virtual 8
8. Programao Assembly Conhecer a programao Caderno de texto e
assembly do PIC Ambiente virtual 8
9.Programao C Conhecer a programao C Caderno de texto e
do PIC Ambiente virtual 7
10. Programao C Conhecer a programao C Caderno de texto e
do PIC Ambiente virtual 7
8 SUMRIO
Captulo 1
Conhecendo os Microcontroladores
Objetivos da aula
Conhecer os fundamento de microcontroladores
conhecer as principais arquiteturas de microcontroladores
Figura 1.1: Mapa conceitual.
1.1 1.1.Origem dos Microcontroladores
Um microcontrolador , em ltima anlise, um computador em um nico chip (guras 1.2 e
1.3). Esse chip contm um processador (unidade lgica e aritmtica ULA), memria, per-
ifricos de entrada e de sada, temporizadores, dispositivos de comunicao serial, dentre
9
10 CAPTULO 1. CONHECENDO OS MICROCONTROLADORES
outros. Os microcontroladores surgiram como uma evoluo natural dos circuitos digitais,
devido ao aumento da complexidade dos mesmos. Chega um ponto em que ca mais sim-
ples, mais barato e mais compacto, substituir a lgica das portas digitais por um conjunto
de processador e software.
Figura 1.2: Microcontrolador PIC 12F675.
Figura 1.3: Microcontrolador INTEL 8051.
O primeiro microcontrolador foi lanado pela Intel em 1977 e recebeu a sigla 8048. Pos-
teriormente, esse microcontrolador evoluiu, dando origem famlia 8051. Este chip pro-
gramado em linguagem assembly e possui um poderoso conjunto de instrues. Por ser um
dos precursores, utilizado em milhares de aplicaes de automao em diversas reas
em todo o mundo.
O Microcontrolador possui internamente os seguintes dispositivos:
Uma CPU (Central Processor Unit ou Unidade de Processamento Central) cuja nali-
dade interpretar as instrues de programa.
1.1. 1.1.ORIGEM DOS MICROCONTROLADORES 11
Uma memria PROM (Programmable Read Only Memory ou Memria Programvel
Somente de Leitura) na qual sero gravadas as instrues do programa.
Uma memria RAM (Random Access Memory ou Memria de Acesso Aleatrio) uti-
lizada para memorizar as variveis utilizadas pelo programa.
Um conjunto de LINHAS de I/O para controlar dispositivos externos ou receber impul-
sos de sensores, interruptores, etc.
Um conjunto de dispositivos auxiliares ao funcionamento, ou seja, gerador de clock,
contadores, UASART para comunicao, etc.
A gura 1.4 apresenta o diagrama de blocos de um microcontrolador, mostrando os
principais elementos descritos at aqui.
Figura 1.4: Diagrama de blocos PIC 12F675.
12 CAPTULO 1. CONHECENDO OS MICROCONTROLADORES
Saiba mais
Atualmente, os principais fabricantes de microcontroladores so:
http://www.intel.com
Zilog: http://www.zilog.com
National: http://www.national.com
Microchip: http://www.microchip.com
Motorola: http://www.motorola.com
Analog Devices: http://www.analog.com/microconverter
1.2 Arquiteturas Harvard e Von Neuman
Quando um sistema de processamento de dados (processadores e microcontroladores)
possui uma nica rea de memria onde cam armazenados os dados (variveis) e o pro-
grama a ser executado (software), dizemos que esse sistema segue a arquitetura de Von
Neuman (pronuncia-se fon noiman).
No caso em que os dados (variveis) cam armazenados em uma rea de memria e o
programa a ser executado (software) ca armazenado em outra rea de memria, dizemos
que esse sistema segue a arquitetura Harvard.
A mquina proposta por Von Neuman composta dos seguintes componentes (gura
1.5):
memria;
unidade de controle;
unidade lgica e aritmtica (ULA);
registradores
perifricos de entrada e sada
Como se observa na gura 1.5, no existe separao entre dados e programa, uma vez
que temos uma nica rea de memria. Dessa forma, o processador deve executar uma
nica ao por vez: ou acessa os dados ou executa uma instruo.
Na arquitetura Harvard (gura 1.6) observamos dois barramentos distintos: um para
acessar a memria de dados e outro para acessar a memria de programas. Dessa forma,
o processador pode buscar e executar uma instruo ao mesmo tempo em que acessa a
memria de dados para ler ou para gravar algum valor. Veja a gura 1.5, onde pode-se
observar o barramento de dados (Data Bus) em vermelho, partindo da memria RAM e
seguindo at a Unidade Lgica e Aritmtica (ALU em ingls). Na mesma gura, observa-se
1.2. ARQUITETURAS HARVARD E VON NEUMAN 13
Figura 1.5: Arquitetura Von Neuman.
o barramento de programa (Programm Bus) em azul, que parte da memria de programa e
chega na ALU.
Devido separao entre dados e programa, um processador da arquitetura Harvard
executar um programa em menor tempo que um processador da arquitetura Von Neuman
de mesmo clock.
14 CAPTULO 1. CONHECENDO OS MICROCONTROLADORES
Figura 1.6: Arquitetura Harvard.
1.2. ARQUITETURAS HARVARD E VON NEUMAN 15
Resumo
Nesta aula, voc aprendeu que um microcontrolador um computador em miniatura
dentro de um nico chip, capaz de executar funes especcas, atravs de um programa
(software).
Aprendeu tambm as duas arquiteturas de construo de microcontroladores e a difer-
ena entre ambas.
Atividades de aprendizagem
Como atividade de aprendizagemdesta aula, procure identicar nos equipamentos eletroeletrni-
cos de sua casa, aquele que utilizam microcontroladores e faa uma lista dos mesmos.
Mande a sua listagem para a plataforma.
Responda, tambm, s seguintes questes:
1- Quais as principais diferenas entre um microcontrolador e um microprocessador?
2- Quais as principais vantagens da arquitetura Harvard?
Consulte a bibliograa disponvel no polo e tambm a internet.
16 CAPTULO 1. CONHECENDO OS MICROCONTROLADORES
Captulo 2
Os Microcontroladores da Famlia PIC
Objetivos da aula
Conhecer a famlia de microcontroladores PIC Microchip
TM
2.1 Folha de Dados do PIC 12F675
Um dos grandes fabricantes mundiais de microcontroladores a Microchip
TM
, que produz
os microcontroladores PIC (Peripherical Interface Controller). So microcontroladores da
tecnologia RISC (Reduced Instruction Set Computer), processadores com conjunto de in-
strues reduzidos (no caso, so 35 instrues simples que executam em 1 ou 2 ciclos de
mquina). Existem PICs de 14, 16 e 32 bits, de 8 a 40 pinos no encapsulamento, o que
permite uma ampla gama de opes de aplicao.
Para que possamos enter o funcionamento dos microcontroladores da famlia PIC, es-
tudaremos um dos mais simples representantes dessa famlia: o PIC 12F675. Esse micro-
controlador encapsulado em um invlucro de 8 pinos e possui um pequeno nmero de
funes externas mantendo toda a arquitetura interna, o que facilita o aprendizado.
A gura 2.1 apresenta as principais caractersticas do PIC 12F675. A gura apresenta o
texto em ingls por se tratar do data-sheet (folha de dados) emitido pela Microchip
TM
.
High Performance RISC CPU: trata-se de uma CPU de alto desempenho na arquitetura
RISC que possui apenas 35 instrues (assembly) que executam em um ciclo de clock. O
clock mximo chega a 20MHz e o ciclo de instruo pode ser to pequeno quanto 200ns.
Possui capacidade de interrupo com oito nveis de profundidade da pilha e ainda modos
de endereamento direto, indireto e relativo.
Special Microcontroller Features: caractersticas especiais do microcontrolador tais como:
opo de oscilador interno ou externo (RC, ressonador ou cristal); modo SLEEP para econo-
mia de energia; ampla faixa de tenses de operao (2V a 5,5V); Watchdog Time com
temporizador independente; interrupo por variao de sinal nos pinos; memria Flash de
alta persistncia, podendo ser regravado at 100.000 vezes e ciclo de escrita na memria
EEPROM de at um milho de vezes, com reteno na memria acima de 40 anos.
Low Power Features: caractersticas de baixa potncia tais como consumo de corrente
17
18 CAPTULO 2. OS MICROCONTROLADORES DA FAMLIA PIC
em modo de espera de 1nA quando alimentado com 2V; corrente de operao de 100uA
com clock de 1MHz.
Peripheral Features: caractersticas de perifricos: 6 pinos disponveis para entrada/sada;
possibilidade de fornecimento de corrente para acionamento de Leds; mdulo comparador
analgico com tenso de referncia programvel; mdulo conversor analgico/digital com
resoluo de 10bits com quatro canais de entrada multiplexveis e entrada para etnso de
referncia do A/D; timer/contador de 8bits com prescaler programvel; timer melhorado de
16bits e programao serial In-Circuit (ICSP) atravs de dois pinos.
2.2 Aplicaes Simples com PIC 12F675
Para ilustrar a aplicao prtica dos microcontroladores, veremos dois circuitos: um conta-
dor de eventos e um controlador de acionamento de bombeamento de gua.
2.2.1 Contador de Eventos
Um contador de eventos pode ser utilizado, por exemplo, para contar o nmero de peas
produzidas em uma linha de montagem em um determinado perodo. O circuito ilustrado
na gura 2.2, possui um sensor tico (fototransistor T1) que acionado toda vez que uma
pea passa por ele em uma correia transportadora.
Quando o feixe luminoso interrompido, o fototransistor (T1) vai da saturao para o
corte e a tenso do coletor vai de nvel zero para nvel alto. Esse nvel alto aciona o pino de
interrupo externa (pino 5). A rotina de tratamento de interrupo incrementa um contador
e o seu valor transmitido para a porta serial de um microcomputador atravs dos pinos 6
e 7 do PIC.
O LED D2 chamado de heart beat (batimento cardaco) pois ca piscando a cada
500ms apenas para indicar o funcionamento do circuito. Esse led acionado atravs da
interrupo de um temporizador interno (Timer0).
A gura 2.2 apresenta um transistor operando como chave.
2.2.2 Acionador de um Sistema de Bombeamento de gua
A gura 2.3 apresenta o diagrama esquemtico de um sistema de bombeamento de gua.
Temos duas caixas dgua, uma inferior e outra superior, ambas equipadas com sensores
de nvel, que fornecem um sinal analgico proporcional ao nvel da gua na caixa.
No circuito, o PIC programado para acionar a bomba dgua sempre que o nvel da
caixa inferior estiver acima de 10% do total (para evitar que a bomba dgua seja ligada sem
gua) e o nvel da caixa superior estiver abaixo de 50%.
Uma vez acionada a bomba dgua, a mesma permanece ligada at que a gua atinja
90% do nvel da caixa superior ou que a caixa inferior esvazie.
2.2. APLICAES SIMPLES COM PIC 12F675 19
Observe a necessidade de uma interface de potncia para ligar o PIC na bomba dgua,
uma vez que a corrente mxima de um pino do PIC da ordem de 20mA e a corrente de
acionamento da bomba dgua de alguns amperes, alternada e em tenso elevada (127V
ou 220V).
Os sensores de nvel normalmente so ajustados para fornecer uma tenso de 1V a 5V
na faixa de vazio a cheio da caixa dgua. Valores abaixo de 1V indicam falha no sensor de
nvel e essa uma forma de implementar segurana a falha no sistema de sensoriamento.
20 CAPTULO 2. OS MICROCONTROLADORES DA FAMLIA PIC
Figura 2.1: Folha de Dados do PIC 12F675.
2.2. APLICAES SIMPLES COM PIC 12F675 21
Figura 2.2: Contador de eventos.
Figura 2.3: Sistema de bombeamento.
22 CAPTULO 2. OS MICROCONTROLADORES DA FAMLIA PIC
Resumo
Nesta aula, voc conheceu um pouco da famlia de microcontroladores PIC atravs do
PIC 12F675 e foi apresentado a duas aplicaes prticas envolvendo esse microcontro-
lador.
Atividades de aprendizagem
Responda s seguintes questes:
1- Quem o fabricante do PIC 12F675?
2- Quantas instrues Assembly possui o PIC?
3- Qual o consumo de corrente do PIC no clock de 1MHz?
4- Qual a faixa de tenso de alimentao do PIC?
5- Qual a resoluo (em bits) do conversor A/D do PIC?
6- Quantos temporizadores possuem o PIC12F675?
7- Nos circuitos apresentados, qual a funo do LED heart beat?
8- Nos circuitos apresentados, qual deles utiliza o conversor A/D?
9- Nos circuitos apresentados, qual deles utiliza a interrupo externa?
10- Descreva, sucintamente, uma outra aplicao onde se poderia utilizar o PIC12F675.
Captulo 3
Hardware do Microcontrolador
Objetivos da aula
Conhecer o hardware interno do microcontrolador PIC12F675.
3.1 Descriao dos pinos
A gura 3.1 apresenta a pinagem do PIC 12F675.
Figura 3.1: Pinagem do PIC 12F675.
O pino 1 a entrada de alimentao positiva de +5V.
O pino 2 um pino que pode assumir as seguintes conguraes: entrada e sada
(congurvel) geral (GP5), clock do timer1 (T1CK), entrada1 do circuito externo de
oscilador de clock (OSC1) ou entrada de sinal externo de clock.
O pino 3 um pino que pode assumir as seguintes conguraes: entrada e sada
(congurvel) geral (GP4), quarta entrada analgica (AN3), entrada2 do circuito ex-
terno de oscilador de clock (OSC2) ou sada de sinal externo de clock.
O pino 4 um pino que pode assumir as seguintes conguraes: entrada (cong-
urvel) geral (GP3), Master clear (baixo ativo), Tenso de programao (VPP).
O pino 5 um pino que pode assumir as seguintes conguraes: entrada e sada
(congurvel) geral (GP2), terceira entrada analgica (AN2), clock do timer 0, inter-
rupo externa (INT) ou sada do comparador interno (COUT).
23
24 CAPTULO 3. HARDWARE DO MICROCONTROLADOR
O pino 6 um pino que pode assumir as seguintes conguraes: entrada e sada
(congurvel) geral (GP1), segunda entrada analgica (AN1), Entrada inversora do
comparador interno (CIN-), tenso de referencia do comparador interno (VREF) ou
clock da programao in-circuit (ICSPCLK).
O pino 7 um pino que pode assumir as seguintes conguraes: entrada e sada
(congurvel) geral (GP0), primeira entrada analgica (AN0), Entrada no-inversora
do comparador interno (CIN+), ou dados da programao in-circuit (ICSPDAT).
O pino 8 o terra da alimentao.
3.2 Memria
O PIC 12F675 possui dois tipos de memria: memria de programa com 1024 palavras
(words) de 8bits e memria de dados, sendo 64 bytes de RAM esttica e 128 bytes de de
EEPROM.
A memria de programa onde ca armazenado o programa gravado no PIC e que ser
executado to logo o mesmo seja ligado na alimentao.
Na memria de dados, armazenamos as variveis do programa ou at 128 bytes de
dados na memria EEPROM, que sero mantidos mesmo que o circuito seja desligado da
alimentao.
3.3 Registradores
Os registradores (SFR Special Function Regiters) so posies da memria que rebem
nomes especcos e tm funo bem denida. Eles servem para guardar a congurao e
o estado de funcionamento atual do PIC.
Normalmente, cada bit do registrador tem uma funo especca. Assim temos um
registrador para denir se as portas so entrada ou sada, ativar e desativar interrupes,
apresentar o estado da cpu, etc.
Os principais registradores do PIC 12F675 e seus respectivos endereos em hexadeci-
mal so:
TMR0 (01h) armazena a contagem do timer0. Sempre que esse contador chegar a
zero, a interrupo de timer zero ser ativada se o INTCON estiver ativado.
STATUS (03h) mostra o estado interno da cpu.
GPIO (05h) apresenta o estado dos pinos de entrada/sada.
INTCON (0Bh) ativa/desativa o conjunto de todas as interrupes e cada uma delas
de forma independente.
3.3. REGISTRADORES 25
CMCON (19h) apresenta o estado das entradas e da sada do comparador interno.
ADCON (1Fh) apresenta o estado do conversor A/D.
TRISIO (85h) dene se os pinos de entrada/sada atuaro como entrada ou como
sada (individualmente).
ANSEL (9Fh) seleciona o estado de cada um dos pinos de entrada/sada quanto a
sua operao como pino analgico ou digital.
As guras 3.2 e 3.3 apresentam as tabela do fabricante com todas as interrupes.
Figura 3.2: Registradores do PIC 12F675.
26 CAPTULO 3. HARDWARE DO MICROCONTROLADOR
Figura 3.3: Registradores do PIC 12F675 (continuao).
3.4 Pinos de I/O
O PIC 12F675 possui seis pinos de I/O que so (conforme gura 3.1):
Pino 7 GP0 entrada ou sada analgica ou digital, congurado nos registradores
TRISIO e ANSEL respectivamente.
Pino 6 GP1 entrada ou sada analgica ou digital, congurado nos registradores
TRISIO e ANSEL respectivamente.
Pino 5 GP2 entrada ou sada analgica ou digital, congurado nos registradores
3.5. TEMPORIZADORES 27
TRISIO e ANSEL respectivamente.
Pino 4 GP3 apenas entrada analgica ou digital, congurado nos registradores
TRISIO e ANSEL respectivamente.
Pino 3 GP4 entrada ou sada analgica ou digital, congurado nos registradores
TRISIO e ANSEL respectivamente.
Pino 2 GP5 entrada ou sada analgica ou digital, congurado nos registradores
TRISIO e ANSEL respectivamente.
Os pinos 8 e 2 so utilizados para alimentao positiva e terra respectivamente.
3.5 Temporizadores
Os temporizadores tm ampla aplicao pois permitem a marcao precisa de intervalos
de tempo. O PIC 12F675 possui dois temporizadores: um de 8bits (Timer0) e um de 16bits
(Timer1).
O Timer0 conta de 0 a 255 (8bits)e o Timer1 conta de 0 a 65535 (16bits). Sempre que
o timer atinge sua contagem mxima, ao adicionarmos mais uma unidade, ele retorna a
zero e dizemos que houve um estouro ou transbordamento do timer. Nesse momento a
interrupo associada ao timer acionada caso a mesma esteja habilitada.
Como cada incremento do timer gasta, exatamente, um ciclo de mquina, podemos ini-
cializar o timer com o valor adequado para produzir a contagem de tempo que desejarmos.
Por exemplo, se desejarmos contar 100s, podemos inicializar o Timer0 com 156 (256-
100) para um ciclo de mquina de 1s. Quando o Timer0 atingir 255 e tentar passar para
256, ele retorna a zero e ter-se- passado exatamente 100 incrementos de 1s, totalizando
100s.
28 CAPTULO 3. HARDWARE DO MICROCONTROLADOR
Resumo
Nesta aula, voc iniciou o aprendizado sobre o hardware interno do PIC12F675. Con-
heceu a pinagem do mesmo, aprendeu sobre a memria, os temporizadores e os reg-
istradores internos desse microcontrolador.
Atividades de aprendizagem
Responda s seguintes questes:
1- Quantos pinos de I/O temos disponveis no PIC 12F675?
2- Emqual pino do PIC12F675 devemos ligar umsinal que produza interrupo externa?
3- Quantos conversores A/D existem no PIC 12F675?
4- Quais pinos do PIC 12F675 podem ser utilizados como entrada de converso A/D?
5- Qual o registrador utilizado para denir se um pino de entrada o de sada no PIC
12F675?
5- Qual o registrador utilizado para ativar/desativar as interrupes no PIC 12F675?
6- Quantos e quais so os temporizadores do PIC 12F675?
7- O que acontece quando a contagem de um timer atinge o mximo?
8- Qual deve ser o valor inicial de um timer de 16bits para contar o intervalo de tempo
de 1ms com ciclo de mquina de 1s?
Captulo 4
Hardware do microcontrolador
(continuao)
Objetivos da aula
Conhecer o hardware interno do microcontrolador PIC12F675.
4.1 Comparadores
O mdulo comparador consiste em um circuito de comparador analgico (gura 4.1) que
pode ter suas entradas e sua sada acessados pelos pinos do PIC. controlado pelo reg-
istrador CMCON, que permite desligar ou ligar os pinos do comparador aos pinos externos
do PIC (5, 6 e 7).
A sada do comparador vai ao nvel alto sempre que o valor da entrada no inversora for
maior que o valor da entrada inversora.
Atravs do registrador VRCON podemos ajustar o nvel de tenso de referncia a ser
aplicada entrada inversora do comparador.
4.2 PWM
O mdulo PWM (Pulse-Width Modulation modulao por largura de pulso) no existe no
PIC12F675. Entretanto, pela sua importncia e como esse mdulo encontrados nos PICs
de maior nmero de pinos, vamos estud-lo.
O mdulo PWM consiste em um oscilador de onda retangular onde se xa a frequncia
e se varia o ciclo ativo (duty cycle) conforme ilustrado na gura 4.2. Normalmente os PICs
possuem o PWM com ajuste da largura de pulso de 10bits (2
10
= 1023) ou seja, podemos
ajustar o nvel alto desde zero (sada desligada) at 1023 que representa o mximo do sinal
(sada ligada continuamente).
Atravs do PWM, podemos gerar um sinal contnuo (atravs da ltragem ou da inte-
grao) a partir de um sinal digital pulsado.
29
30 CAPTULO 4. HARDWARE DO MICROCONTROLADOR (CONTINUAO)
Figura 4.1: Comparador.
O valor mdio de sada vale:
V
S
= V
P
.
T
ON
T
Onde:
V
S
tenso de sada.
V
P
Tenso mxima de sada.
T
ON
Tempo de nvel alto (duty cycle valor varivel).
T Perodo do sinal (valor xo).
O PWM muito utilizado para o controle de velocidade de motores de corrente contnua.
4.3 Conversor A/D
O conversor analgico-digital (A/D) efetua a converso de um sinal analgico para a sua
representao digital de 10-bits. O PIC12F675 possui quatro entradas analgicas (GP0 a
GP3) que so multiplexadas para um circuito de amostragem e reteno conforme ilustrado
na gura 4.3. A sada do circuito de amostragem e reteno ligado entrada do conversor
A/D de 10 bits.
O conversor A/D gera um resultado binrio atravs de um processo de aproximao
sucessivas e armazena o resultado em um registrador de 10 bits. A tenso de referncia
utilizada pelo conversor pode ser selecionada por software entre a tenso de alimentao
ou a tenso aplicada ao pino Vref.
4.4. USART 31
Figura 4.2: Modulao por largura de pulso PWM.
Figura 4.3: Conversor Analgico Digital.
4.4 USART
O mdulo USART (Universal Synchronous Asynchronous Receiver Transmitter - Transmis-
sor/Receptor Universal Sncrono e Assncrono) que utilizado para a comunicao serial
tambm no est presente no PIC12F675 (nesse caso, devemos implementar a comuni-
cao serial por software), mas vamos abord-lo devido sua importncia e sua existn-
cia em vrios microcontroladores.
Esse mdulo implementa todo o protocolo lgico de comunicao pela porta serial RS-
232 com o microcomputador. Para o protocolo fsico, devemos utilizar um conversor de
nveis (como o MAX232), uma vez que o PIC fornecer nveis de tenso de 0V a 5V e a
RS-232 trabalha com nveis de +15V a -15V.
A gura 4.4 ilustra alguns desses elementos.
32 CAPTULO 4. HARDWARE DO MICROCONTROLADOR (CONTINUAO)
Figura 4.4: Comunicao serial.
Resumo
Nesta aula, voc concluiu o aprendizado sobre o hardware interno do PIC12F675. Con-
heceu a utilizao do comparador interno, da modulao por largura de pulso (PWM), a
utilizao do conversor A/D e da comunicao serial.
Atividades de aprendizagem
Responda s seguintes questes:
1- Quando que a sada do comparador vai ao nvel alto?
2- Qual o registrador responsvel pelo ajuste da tenso de refer6encia do comparador?
3- Descreva, sucintamente, o funcionamento do PWM.
4- D uma aplicao do PWM.
5- Quantos conversores A/D temos no PIC12F675?
6- Qual o processo de converso utilizado pelo PIC12F675?
7- Qual a funo do mdulo USART?
8- Qual a funo do chip MAX232?
Captulo 5
Set de Instrues
Objetivos da aula
Conhecer o conjunto de instrues assembly do microcontrolador PIC12F675.
5.1 Estrutura das instrues
Todas as operaes lgicas e aritmticas do PIC12F675 realizadas pela ULA (Unidade Lg-
ica e Aritmtica) do processador esto relacionadas com o registrador de trabalho (working
register), chamado de W.
Essas operaes lgicas e aritmticas podem ser realizadas entre o contedo do reg-
istrador W e o contedo de um outro registrador ou uma constante, chamada pela Microchip
de literal.
Esse C possui vrios tipos de perifricos, cujo funcionamento gerenciado atravs reg-
istradores especcos chamados SFRs (Special Function Registers Registradores com
Funo Especial).
Como os SFRs esto presentes sicamente na memria de dados do microcontrolador,
eles devem ser ajustados sempre antes da execuo repetitiva da rotina principal de acordo
com as funes pretendidas para o circuito.
Eles so organizados em dois blocos, chamados de Banco de Memria 0 e Banco de
Memria 1, cuja seleo feita atravs do bit 5 do registrador STATUS. Sendo assim, antes
de ler ou escrever em um SFR, devemos nos assegurar que estamos no Banco de Memria
correto atravs do ajuste em 0 ou 1 do bit 5 do registrador STATUS.
Algumas funes e modos de operao do PIC12F675 no so selecionveis direta-
mente pelo rmware, devendo ser congurados durante o processo de programao. Essa
congurao se d atravs de diretivas includas no programa fonte e que so usadas ape-
nas na programao, no fazendo parte diretamente do rmware propriamente dito (no
so instrues passveis de serem executadas pelo processador do C).
33
34 CAPTULO 5. SET DE INSTRUES
5.2 Grupos de instrues
Didaticamente, as instrues do microcontrolador PIC so organizadas em trs grupos: in-
strues orientadas a registradores com tamanho de um byte; instrues orientadas aos
bits de registradores e instrues orientadas a operaes com constantes (literais) e con-
trole de uxo do programa. Detalhando as instrues temos:
5.2.1 Instrues orientadas a registradores com tamanho de um byte
ADDWF - (add le em work) adiciona os contedos dos registradores W e F.
ANDWF - (and le e work) executa a operao E (AND) lgica entre os contedos
dos registradores W e f.
CLRF - (clear le) carrega o valor 0 no registrador F.
CLRW - (clear work) carrega o valor 0 no registrador W.
COMF - (complementa le) complementa (inverte bit a bit) o contedo do registrador
F.
DECF - (dec le) decrementa (subtrai um) do contedo do registrador F.
DECFSZ - (dec le, skip se zero) decrementa (subtrai um) do contedo do registrador
F e no executa (pula) a prxima instruo se o resultado do incremento for igual 0.
INCF - (inc le) incrementa (soma um) o contedo do registrador F.
INCFSZ - (inc le, skip se zero) incrementa (soma um) ao contedo do registrador F
e no executa (pula) a prxima instruo se o resultado do incremento for igual 0.
IORWF - (W or le) executa a operao OU (OR) lgica entre os contedos dos
registradores W e F.
MOV F - (move le para W) move o valor do registrador F para o registrador W.
MOV WF - (move W para F) copia o contedo do registrador W para o registrador F.
NOP - (NO operation) Nenhuma operao executada, apenas gasta um ciclo de
mquina.
RLF - (rotate left le) rotaciona esquerda o contedo do registrador F.
RRF - (rotate rigth le) rotaciona direita o contedo do registrador F.
SUBWF - (sub f de W) subtrai o contedo do registradores F do registrador W e
armazena o resultado em W.
5.2. GRUPOS DE INSTRUES 35
SWAPF - (troca le) troca os 4 bits mais signicativos com os 4 menos signicativos
de F.
XORWF - (W XOR F) executa a operao Ou Exclusivo (XOR) lgica entre os
contedos dos registradores W e F e armazena em W.
5.2.2 Instrues orientadas aos bits de registradores
BCF - (bit clear le) ajusta o bit b do registrador f para nvel baixo (0)
BSF - (bit set le) ajusta o bit b do registrador f para nvel alto (1)
BTFSC - (bit teste le, skip se clear) testa o bit b do registrador f e no executa a
prxima instruo se o ele estiver em nvel baixo (0)
BTFSS - (bit teste le, skip se set) testa o bit b do registrador f e no executa a
prxima instruo se o ele estiver em nvel baixo (1)
5.2.3 Instrues orientadas a operaes com constantes (literais) e
controle de uxo do programa
ADDLW - (add literal a W) O contedo do registrador W somado a uma constante
k de 8-bits e o resultado guardado no registrador W.
ANDLW - (and literal e W) executa a operao E (AND) lgica entre o contedo do
registrador W e uma constante k de 8-bits e armazena o resultado em W.
CALL - chamada uma sub-rotina.
CLRWDT - (clear wdt) carrega o valor 0 no temporizador do watchdogtime.
GOTO - salto incondicional para um outro local no programa.
IORLW - (literal OR W) executa a operao OU (OR) lgica entre o contedo do
registrador W e uma constante k de 8-bits e armazena o resultado em W.
MOV LW - (move literal para W) carrega uma constante k de 8-bits no registrador W.
RETFIE - retorno de uma rotina de interrupo.
RETLW - retorno de uma sub-rotina com o carregamento de uma constante k de
8-bits (literal) no registrador W.
RETURN - retorno de uma sub-rotina.
SLEEP - coloca o processador no modo de baixo consumo.
36 CAPTULO 5. SET DE INSTRUES
SUBLW - subtrai o literal de 8-bits do contedo do registrador W e armazena o resul-
tado no registrador W.
XORLW - executa a operao Ou Exclusivo (XOR) lgica entre o contedo do reg-
istrador W e uma constante k de 8-bits (literal).
Resumo
Nesta aula, voc conheceu o conjunto de instrues assembly do PIC12F675, a forma
como essas instrues so estruturadas e a forma como elas so agrupadas para facilitar
a memorizao.
Atividades de aprendizagem
Responda s seguintes questes:
1- Onde so realizadas as operaes lgicas e aritmticas do PIC12F675?
2- Qual o principal registrador do PIC12F675?
3- Quem gerencia os perifricos do microcontrolador?
4- Quais os grupos de instrues assembly do PIC12F675?
5- Quantas so as instrues assembly do PIC12F675?
Captulo 6
Interrupes
Objetivos da aula
Conhecer a funo das interrupes em um microcontrolador.
Conhecer as interrupes disponveis no microcontrolador PIC12F675.
6.1 Interrupes no Microcontrolador
O mtodo mais utilizado para a vericao do estado de um pino de entrada a leitura
frequente do nvel nele presente (tcnica de polling sondagem) por ser o mtodo de
mais fcil implementao.
No entanto, a despeito desta simplicidade, este mtodo no se mostrada adequado em
situaes onde queremos uma resposta imediata do processador assim que houver uma
mudana no nvel de um pino.
Em tais casos recomendado que utilizemos uma interrupo, ou seja, a chamada de
uma funo auxiliar que s executada se houver ocorrido um evento especco como, por
exemplo, a mudana do estado de um pino.
Neste caso, aps essa chamada da funo auxiliar, o uxo original do programa principal
s ser retomado quando a interrupo for concluda.
Alm da citada interrupo por alterao de nvel em pino, o PIC12F675 possui vrias
outras fontes de interrupo, que podem ser conguradas e usadas a partir de informaes
obtidas em seu datasheet.
Para utilizar as interrupes, o registrador INTCON.GIE deve ser ativado (INTCON ->
endereo 0Bh, GIE -> bit 7 do INTCON). O GIE funciona como uma espcie de chave geral
de todas as interrupes. Se colocarmos zero no INTCON.GIE, desabilitamos, simultanea-
mente, todas as interrupes.
Como o prprio nome indica, uma interrupo serve para interromper a execuo normal
do programa principal e, imediatamente, tratar do evento que gerou a interrupo.
37
38 CAPTULO 6. INTERRUPES
6.2 Interrupo de timer
A interrupo de timer ocorre sempre que o contador do timer estoura, isso , atinge o
valor mximo e incrementado de uma unidade. Por exemplo, o TIMER0 (endereo 01h)
um temporizador de 8 bits (conta de 0 a 255). Quando esse contador atingir 255, no
prximo incremento ele estourar (tentar passar para 256), retornando a zero e disparando
a interrupo de TIMER0.
Para que essa interrupo funcione, devemos ter INTCON.GIE = 1 (liga chave geral);
INTCON.T0IE = 1 (liga TIMER0). Sempre que ocorrer o estouro do contador, o bit INT-
CON.T0IF estar em 1 e a rotina de tratamento dessa interrupo ser acionada.
A interrupo de timer muito util quando desejamos medir intervalos de tempo de
forma precisa. Por exemplo, considerando um clock interno de 1MHz, teremos um ciclo de
mquina de 1s. Carregando o TIMER0 com o valor 250, aps 5 ciclos de mquina (5s)
teremos a ocorrncia da interrupo de timer. Poderemos utilizar essa interrupo para
incrementar um contador. Assim, teremos um contador que conta de forma precisa de 5s
em 5s.
6.3 Interrupo externa
A interrupo externa muito utilizada pois nos permite detectar exetamente o intante em
que eventos externos acontecem (por exemplo: quando algum objeto passou em frente de
um sensor de presena, quando um eixo que gira completou uma volta, quando a tenso
da rede passou por zero, etc.).
Essa interrupopode ser disparada pela borda de subida ou ple aborda de descida do
sinal. Essa seleo feita no registrador OPTION_REG.INTDEG (81h.6).
Essa interrupo ativada fazendo-se INTCON.GIE = 1 (liga chave geral); INTCON.INTE
= 1 (liga INT EXT). Sempre que ocorrer uma transio de sinal no pino correspondente, INT-
CON.INTF (0Bh.1) estar em 1 e a rotina de tratamento dessa interrupo ser acionada.
Antes de sairmos da rotina de interrupo, esse ag dever ser colocado em zero.
6.4 Outras interrupes
O microcontrolador PIC possui vrias outras interrupes tai como:
Interrupo de mudana de estado - ocorre quando algum pino muda de nvel de sinal.
Interrupo de escrita na EEPROM - ocorre quando se conclui a escrita na memria
EEPROM.
Interrupo de m de converso A/D - ocorre quando se conclui a converso analgica
para digital do conversor A/D.
6.4. OUTRAS INTERRUPES 39
Interrupo de WDT - ocorre quando estoura o Watch Dog Time e o sistema reini-
cializado.
Resumo
Nesta aula voc aprendeu qual a funo das interrupes em microcontroladores. Con-
heceu tambm as interrupes disponveis no PIC12F675.
Atividades de aprendizagem
Responda s seguintes questes:
1- Para que utilizamos interrupes em um microcontrolador?
2- Qual registrador utilizado como chave geral de interrupo no PIC12F675?
3- O que acontece quando o ag INTCON.INTF estiver em 1 no PIC12F675?
4- Como se ativa a interrupo externa no PIC12F675?
5- Qual interrupo utilizada para se vericar o trmino de converso do conversor A/D
no PIC12F675?
40 CAPTULO 6. INTERRUPES
Captulo 7
Programao Assembly
Objetivos da aula
Conhecer a programao assembly de um microcontrolador.
Entender a importncia de se programar o PIC12F675 em assembly.
7.1 Introduo
Um programa de computador um conjunto ordenado de instrues capazes de executar
uma ao til em um sistema computacional. Esse programa pode ser representdado de
diversas formas (linguagens). Em ltima anlise, o processador s entende uma linguagem:
a linguagem de mquina, que constituda de "zeros e "uns"
Com o objetivo de facilitar o entendimento para os humanos, surgiram uma srie de
linguagens de programao que so, nada mais nada menos, que formas mais elaboradas
de se desenvolver o raciocnio computacional de uma forma mais inteligvel.
Todo programa de computador, em qualquer linguagem, dever ser traduzido (atravs
de um compilador ou de um interpretador) para linguagem de mquina.
Uma das linguagens de mais baixo nvel (mais prximas da mquina) o assembly.
constitudo de instrues simples (Mnemnicos), que so a representao simblica da
linguagem de mquina. No caso do PIC, temos 35 instrues.
7.2 Programando em Assembly MPASM
Programar se aprende programando. Para que possamos entender melhor os aspectos de
programao do PIC, escreveremos alguns programas simples em MPASM, o assembly da
Microchip. Para escrevermos programas em assembly, precisamos de um programa que os
traduza para a linguagem de mquina.
A Microchip disponibiliza um programa gratuito que faz o papel de ambiente grco de
desenvolvimento e vem com ferramentas de assemblador e linker, o MPLAB. O MPLAB
pode ser obtido gratuitamente no site da Microchip (www.microchip.com) para a plataforma
41
42 CAPTULO 7. PROGRAMAO ASSEMBLY
Windows. Instale-o em seu computador. As guras 7.1 e 7.2 apresentam esse ambiente de
desenvolvimento (IDE).
Figura 7.1: MPLAB - tela de abertura.
Figura 7.2: MPLAB - tela de desenvolvimento.
Devido exiguidade de tempo, no trataremos do uso do MPLAB nesse curso. Vrios tu-
toriais podem ser obtidos na internet ou nas referncias bibliogrcas. Um bom tutorial pode
ser encontrado em: ftp://ftp.cefetes.br/Cursos/Eletrotecnica/Microprocessadores/PIC/MiniCursoMplab5.pdf
7.3. EXEMPLOS DE PROGRAMAS 43
7.3 Exemplos de Programas
Para entender melhor os conceitos de programao, vamos analisar uma srie de progra-
mas escritos para o PIC12F675. Todos eles foram desenvolvidos considerando as ligaes
fsicas de chaves, resistores, potencimetros e LEDs mostradas na gura 7.3.
Figura 7.3: Circuito base.
7.3.1 Pisca LED
O programa a seguir faz com que o LED verde (ligado no pino 2), pisque em intervalos de
500ms.
A funo desse programa pode ser implementada com o seguinte algoritmo:
1. Congurar os SFRs pertinentes
2. Colocar o pino 2 em nvel alto
3. Pausar a execuo do programa por um tempo
4. Colocar o pino 2 em nvel baixo
5. Pausar a execuo do programa por um tempo
6. Repetir as operaes de 2 a 5 indenidamente
44 CAPTULO 7. PROGRAMAO ASSEMBLY
Analisando o datasheet do PIC12F675, podemos descobrir quais SFRs devem ser con-
gurados e com quais valores de acordo com as especicaes do sistema. Ao fazer isso
para este primeiro exemplo, constatamos que devemos congurar os registradores abaixo
para que o programa que ser escrito funcione adequadamente com o circuito j apresen-
tado:
ANSEL: Seleo da funo analgica ou digital para os pinos de entrada e sada que
podem operar nestes dois modos, conforme descrito a seguir. Escrevendo 1 no
bit associado ao pino, estaremos indicando que o seu funcionamento ser no modo
analgico. J se escrevermos 0, estaremos congurando o pino para trabalhar no
modo digital.
Pino 7: Modo digital (GPIO 0) ou modo analgico (AN 0)
Pino 6: Modo digital (GPIO 1) ou modo analgico (AN 1)
Pino 5: Modo digital (GPIO 2) ou modo analgico (AN 2)
Pino 3: Modo digital (GPIO 4) ou modo analgico (AN 3)
TRISIO: Denio da direo do sinal (entrada ou sada) em um pino. Escrevendo 0
no bit associado ao pino, estaremos congurando o pino como sada (Output). J se
escrevermos 1, estaremos congurando o pino como entrada (Input).
CMCON: Controle das funes do comparador de tenso interno do C.
GPIO: Seleo do nvel lgico de um pino quando ele for congurado como sada dig-
ital ou leitura do nvel presente em um pino quando ele for congurado como entrada
digital.
Para fazer a congurao correta destes SFRs, devemos estar atentos para o fato que
os registradores ANSEL e TRISIO esto presentes sicamente no Banco de Memria 1, en-
quanto os registradores CMCON e GPIO esto presentes sicamente no Banco de Memria
0. Sendo assim, antes de utilizados, devemos congurado adequadamente o bit 5 (RP0) do
registrado STATUS.
Um possvel modo de escrever em assembly um programa que se comporte desta
maneira mostrado a seguir. Tudo o que est aps o ";" comentrio e no executado
pelo PIC.
;INCLUSAO DE ARQUIVOS
#INCLUDE <p12f675.inc> ;Defini c~ oes referentes ao PIC12F675
;CONFIGURAC
~
AO DO MODO DE FUNCIONAMENTO
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CPD_OFF & _CP_OFF &
7.3. EXEMPLOS DE PROGRAMAS 45
;DEFINI C
~
AO DOS NOMES E ENDERE COS DAS VARI

AVEIS UTILIZADAS NO PROGRAMA


CBLOCK 0x0C ; Endere co inicial da mem oria de usu ario
TEMP1 ; contador para o delay de 1ms;
TEMP500 ; Contador para o delay de 500ms
ENDC ; fim do blodo de mem oria de vari aveis
;DEFINI C
~
AO DAS ENTRADAS DIGITAIS
#DEFINE Chave_1 GPIO, 2; Pino 5
#DEFINE Chave_2 GPIO, 3; Pino 4
;DEFINI C
~
AO DAS SA

IDAS DIGITAIS
#DEFINE LED_VD GPIO, 5 ;Pino 2
#DEFINE LED_AM GPIO, 4 ;Pino 3
#DEFINE LED_VM GPIO, 1 ;Pino 6
;DEFINI C
~
AO DO SELETOR DO BANCO DE MEM

ORIA
#DEFINE Banco STATUS, RP0 ;Bit RP0 do registrador Status (SFR)
;CONFIGURAC
~
AO DOS SFRS
BSF Banco ;Selec~ ao do Banco 1 da Mem oria
MOVLW B00000001 ;Modo anal ogico/digital dos pinos de I/O
MOVWF ANSEL
MOVLW B00001101 ;Direc~ ao dos pinos de I/O digitais
MOVWF TRISIO
BCF Banco ;Selec~ ao do Banco 0 da Mem oria
MOVLW B00000111 ;Desativa c~ ao do comparador de tens~ ao
MOVWF CMCON
;INICIALIZAC
~
AO DO PROGRAMA
BCF LED_VD ;Apaga o LED verde
BCF LED_AM ;Apaga o LED amarelo
BCF LED_VM ;Apaga o LED vermelho
;ROTINA PRINCIPAL, implementa um loop infinito
Principal:
BSF LED_VD ;Acende o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
46 CAPTULO 7. PROGRAMAO ASSEMBLY
BCF LED_VD ;Apaga o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
GOTO Principal ;Salto para o incio da rotina principal
; Rotina de delay de 500ms. Repete 200x a rotina de 2,5ms
DELAY_500MS:
MOVLW .200
MOVWF TEMP500
DL_50
CALL DELAY_2MS ;Pausa de 10ms
DECFSZ TEMP500,F ; decrementa TEMP500, zerou?
GOTO DL_50 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
; Rotina de delay de 2,5ms. Repete 250x a rotina de 10us
DELAY_2MS:
MOVLW .250
MOVWF TEMP1
DL_10 ; cada ciclo gasta 10microsegundos
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
DECFSZ TEMP1,F ; decrementa TEMP1, zerou?
GOTO DL_10 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
;FIM DO PROGRAMA
END
7.3.2 Dissecando o Pisca LED
Vamos detalhar os blocos do programa passo a passo:
7.3. EXEMPLOS DE PROGRAMAS 47
Incluso
;INCLUSAO DE ARQUIVOS
#INCLUDE <p12f675.inc> ;Defini c~ oes referentes ao PIC12F675
Nesse bloco, incluimos um arquivo externo, no caso o arquivo p12f675.inc que contm
os nomes dos registradores do microcontrolador em uso.
Congurao
;CONFIGURAC
~
AO DO MODO DE FUNCIONAMENTO
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CPD_OFF & _CP_OFF &
Nesse bloco, conguramos os fuses internos do microcontrolador, eles funcionam como
chaves internas que podem ser ligadas ou desligadas como, por exemplo:
_INTRC_OSC_NOCLKOUT - o PICutilizar o oscilador interno de 4MHz, o que garante
que cada ciclo de mquina ter 1s de durao.
_WDT_OFF - desliga o WatchDogTime.
_PWRTE_OFF - desliga o reset de power on.
_MCLRE_OFF - desliga o masterclear.
Variveis
;DEFINI C
~
AO DOS NOMES E ENDERE COS DAS VARI

AVEIS UTILIZADAS NO PROGRAMA


CBLOCK 0x0C ; Endere co inicial da mem oria de usu ario
TEMP1 ; contador para o delay de 1ms;
TEMP500 ; Contador para o delay de 500ms
ENDC ; fim do blodo de mem oria de vari aveis
Aqui denimos o endereo inicial para a criao das variveis, bem como a denio
das mesmas.
Entradas e sadas
;DEFINI C
~
AO DAS ENTRADAS DIGITAIS
#DEFINE Chave_1 GPIO, 2; Pino 5
#DEFINE Chave_2 GPIO, 3; Pino 4
48 CAPTULO 7. PROGRAMAO ASSEMBLY
;DEFINI C
~
AO DAS SA

IDAS DIGITAIS
#DEFINE LED_VD GPIO, 5 ;Pino 2
#DEFINE LED_AM GPIO, 4 ;Pino 3
#DEFINE LED_VM GPIO, 1 ;Pino 6
Nesse bloco, associamos nomes signicativos aos pinos do microcontrolador.
Congurao dos registradores
;DEFINI C
~
AO DO SELETOR DO BANCO DE MEM

ORIA
#DEFINE Banco STATUS, RP0 ;Bit RP0 do registrador Status (SFR)
;CONFIGURAC
~
AO DOS SFRS
BSF Banco ;Selec~ ao do Banco 1 da Mem oria
MOVLW B00000001 ;Modo anal ogico/digital dos pinos de I/O
MOVWF ANSEL
MOVLW B00001101 ;Direc~ ao dos pinos de I/O digitais
MOVWF TRISIO
BCF Banco ;Selec~ ao do Banco 0 da Mem oria
MOVLW B00000111 ;Desativa c~ ao do comparador de tens~ ao
MOVWF CMCON
Nesse bloco conguramos alguns registradores internos que sero utilizados no programa.
Perceba que inicialmente colocamos o valor numrico (literal) para o registrador W e, na
sequncia, transferimos o valor de W para o registrador alvo.
Inicializao
;INICIALIZAC
~
AO DO PROGRAMA
BCF LED_VD ;Apaga o LED verde
BCF LED_AM ;Apaga o LED amarelo
BCF LED_VM ;Apaga o LED vermelho
Inicializamos os pinos de sada, apagando todos os LEDs pela imposio de valor zero aos
pinos correspondentes.
7.3. EXEMPLOS DE PROGRAMAS 49
Loop Principal
;ROTINA PRINCIPAL, implementa um loop infinito
PRINCIPAL:
BSF LED_VD ;Acende o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
BCF LED_VD ;Apaga o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
GOTO PRINCIPAL ;Salto para o incio da rotina principal
Implementamos um loop innito criando o label "PRINCIPAL", executando algumas in-
strues e, no nal, efetuando um salto incondicional (GOTO) para o mesmo label.
Iniciamos ligando o LED verde pela imposio de nvel "1"no pino correspondente,
chamamos uma subrotina que provoca um delay de 500ms, colocamos nvel "0"no LED,
chamamos novamente a subrotina de delay de 500ms e recomeamos a mesma sequn-
cia.
Rotinas de Delay
; Rotina de delay de 500ms. Repete 200x a rotina de 2,5ms
DELAY_500MS:
MOVLW .200
MOVWF TEMP500
DL_50
CALL DELAY_2MS ;Pausa de 2,5ms
DECFSZ TEMP500,F ; decrementa TEMP500, zerou?
GOTO DL_50 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
; Rotina de delay de 2,5ms. Repete 250x a rotina de 10us
DELAY_2MS:
MOVLW .250
MOVWF TEMP1
DL_10 ; cada ciclo gasta 10microsegundos
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
50 CAPTULO 7. PROGRAMAO ASSEMBLY
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
DECFSZ TEMP1,F ; decrementa TEMP1, zerou?
GOTO DL_10 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
O delay de 500ms conseguido atravs da repetio de 200 vezes a rotina de atraso
de 2,5ms. Iniciamos colocando o valor 200 na varivel TEMP500 (atravs do registrador W)
e efetuamos sucessivas chamadas rotina de atraso de 2,5ms e vamos decrementando a
varivel TEMP500 at que ela chegue a zero, momento em que haver o retorno (RETURN)
da subrotina.
Analogamente, temos a rotina de atraso de 2,5ms, que obtida pela repetio de 250
vezes de um bloco que consome 10 microsegundos. Esse tempo conseguido atravs de
sete instrues NOP (que no fazem nada e consomem 1 ciclo de mquina), uma instruo
DECFSZ que consome mais 1 ciclo de mquina e a instruo GOTO que consome 2 ciclos
de mquina.
Fim do Programa
;FIM DO PROGRAMA
END
imprescindvel que o programa se encerre com a instruo END.
Resumo
Nesta aula voc aprendeu sobre a programao assembly do PIC12F675 atravs de um
exemplo comentado.
Atividades de aprendizagem
Responda s seguintes questes:
1- Qual a linguagem que o microprocessador entende?
2- O que assembly?
3- O que faz o comando NOP?
4- Como se implementa um loop innito em assembly?
5- Como se efetua a chamada de uma subrotina em assembly?
6- Como se efetua o retorno de uma subrotina em assembly?
Captulo 8
Programao Assembly (continuao)
Objetivos da aula
Expandir os conceitos sobre a programao assembly do microcontrolador PIC12F675
atravs de exemplos.
8.1 Programando Assembly com Interrupo
Assim que ocorrer um evento de interrupo e o bit GIE e a habilitao individual da inter-
rupo estejam ativados, teremos o desvio do programa para o vetor de interrupo 0x0004.
Para se tratar adequadamente a interrupo, deve-se observar o seguinte:
1. Salvamento do contexto atual - procedimento necessrio para se preservar o contedo
dos registradores que estejam sendo utilizados no programa principal e que possam
ser alterados pela sub-rotina de tratamento da interrupo. Normamente deve-se sal-
var os registradores W e STATUS.
2. Vericao do tipo de interrupo que ocorreu - utiliza-se uma sequencia de teste
BTFSC para vericar os ags das possveis interrupes, desviando-se para o trata-
mento individual de cada uma.
3. Tratamento da interrupo - apaga-se o ag da interrupo em questo e procede-se
execuo das aes necessrias ao atendimento da interrupo.
4. Recuperao do contexto e retorno - restaura-se o contedo dos registradores STSUS
e W e executa-se o RETFIE.
8.1.1 Pisca LED com Interrupo
Retomamos o programa anterior em que o LED verde pisca a cada 500ms e acrescentamos
um tratamento de interrupo externa para acender o LED vermelho sempre que a chave 1
passar do nvel baixo para o nvel alto.
51
52 CAPTULO 8. PROGRAMAO ASSEMBLY (CONTINUAO)
;INCLUSAO DE ARQUIVOS
#INCLUDE <p12f675.inc> ;Defini c~ oes referentes ao PIC12F675
;CONFIGURAC
~
AO DO MODO DE FUNCIONAMENTO
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CPD_OFF & _CP_OFF &
;DEFINI C
~
AO DOS NOMES E ENDERE COS DAS VARI

AVEIS UTILIZADAS NO PROGRAMA


CBLOCK 0x0C ; Endere co inicial da mem oria de usu ario
TEMP1 ; contador para o delay de 1ms;
TEMP500 ; Contador para o delay de 500ms
W_TEMP ; para salvar W
STATUS_TEMP ; para salvar STATUS
ENDC ; fim do bloco de mem oria de vari aveis
;Endere co de incio do programa
ORG 0x0000
GOTO PRINCIPAL
;Vetor de interrupc~ ao
ORG 0x0004
MOVWF W_TEMP ; salva o conteudo de W em W_TEMP
SWAPF STATUS, W ;salva o conteudo de STATUS
MOVWF STATUS_TEMP ; em STATUS_TEMP
BTFSC INTCON,T0IF ; testa se ocorreu interrupcao de timer0
GOTO TRATA_TMR0 ; se ocorreu, trata a interrupc~ ao
BTFSC INTCON,T0IF ; testa se ocorreu interrupcao de timer0
GOTO TRATA_TMR0 ; se ocorreu, trata a interrupc~ ao
BTFSC PIR1,TMR1IF ; testa se ocorreu interrupcao de timer1
GOTO TRATA_TMR1 ; se ocorreu, trata a interrupc~ ao
BTFSC INTCON,INTF ; testa se ocorreu interrupcao externa
GOTO TRATA_INT ; se ocorreu, trata a interrupc~ ao
FIM_INT:
8.1. PROGRAMANDO ASSEMBLY COM INTERRUPO 53
SWAPF STATUS_TEMP, W ; restaura o conteudo do
MOVWF STATUS ; registrador STATUS
SWAPF W_TEMP, W ; restaura o conteudo do registrador W
RETFIE ; retorna da interrupc~ ao
TRATA_TMR0:
BCF INTCON,T0IF
; executa comandos para tratamento
; da interrupc~ ao de timer0
GOTO FIM_INT
TRATA_TMR1:
BCF PIR1,T1IF
; executa comandos para tratamento
; da interrupc~ ao de timer1
GOTO FIM_INT
TRATA_INT: ; tratamento da interrupc~ ao externa
BCF INTCON,INTIF
BSF LED_VM ; acende o LED vermelho
GOTO FIM_INT
;DEFINI C
~
AO DAS ENTRADAS DIGITAIS
#DEFINE Chave_1 GPIO, 2; Pino 5
#DEFINE Chave_2 GPIO, 3; Pino 4
;DEFINI C
~
AO DAS SA

IDAS DIGITAIS
#DEFINE LED_VD GPIO, 5 ;Pino 2
#DEFINE LED_AM GPIO, 4 ;Pino 3
#DEFINE LED_VM GPIO, 1 ;Pino 6
;DEFINI C
~
AO DO SELETOR DO BANCO DE MEM

ORIA
#DEFINE Banco STATUS, RP0 ;Bit RP0 do registrador Status (SFR)
;CONFIGURAC
~
AO DOS SFRS
BSF Banco ;Selec~ ao do Banco 1 da Mem oria
MOVLW B00000001 ;Modo anal ogico/digital dos pinos de I/O
MOVWF ANSEL
MOVLW B00001101 ;Direc~ ao dos pinos de I/O digitais
54 CAPTULO 8. PROGRAMAO ASSEMBLY (CONTINUAO)
MOVWF TRISIO
BCF Banco ;Selec~ ao do Banco 0 da Mem oria
MOVLW B00000111 ;Desativa c~ ao do comparador de tens~ ao
MOVWF CMCON
MOVLW B10010000 ;Ativa interrupc~ oes GIE e interrupc~ao externa INTE
MOVWF INTCON
;INICIALIZAC
~
AO DO PROGRAMA
BCF LED_VD ;Apaga o LED verde
BCF LED_AM ;Apaga o LED amarelo
BCF LED_VM ;Apaga o LED vermelho
;ROTINA PRINCIPAL, implementa um loop infinito
PRINCIPAL:
BSF LED_VD ;Acende o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
BCF LED_VD ;Apaga o LED verde
CALL DELAY_500MS ;Pausa de 500 ms
GOTO PRINCIPAL ;Salto para o incio da rotina principal
; Rotina de delay de 500ms. Repete 200x a rotina de 2,5ms
DELAY_500MS:
MOVLW .200
MOVWF TEMP500
DL_50
CALL DELAY_2MS ;Pausa de 10ms
DECFSZ TEMP500,F ; decrementa TEMP500, zerou?
GOTO DL_50 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
; Rotina de delay de 2,5ms. Repete 250x a rotina de 10us
DELAY_2MS:
MOVLW .250
MOVWF TEMP1
DL_10 ; cada ciclo gasta 10microsegundos
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
8.1. PROGRAMANDO ASSEMBLY COM INTERRUPO 55
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
NOP ; gasta um ciclo de tempo
DECFSZ TEMP1,F ; decrementa TEMP1, zerou?
GOTO DL_10 ; n~ ao, repete o ciclo
RETURN ; sim, finaliza a rotina
;FIM DO PROGRAMA
END
8.1.2 Dissecando o Pisca LED com Interrupo
Vamos detalhar, passo a passo, os blocos do programa que foram alterados/acrescentados
no programa anterior:
Variveis
;DEFINI C
~
AO DOS NOMES E ENDERE COS DAS VARI

AVEIS UTILIZADAS NO PROGRAMA


CBLOCK 0x0C ; Endere co inicial da mem oria de usu ario
TEMP1 ; contador para o delay de 1ms;
TEMP500 ; Contador para o delay de 500ms
W_TEMP ; para salvar W
STATUS_TEMP ; para salvar STATUS
ENDC ; fim do bloco de mem oria de vari aveis
Acrescentamos as variveis W_TEMP e STATUS_TEMP necessrias ao salvamento de
contexto ao se tratrar interrupes.
Incio do programa
;Endere co de incio do programa
ORG 0x0000
GOTO PRINCIPAL
Defenimos o endereo de incio do programa e desviamos o uxo para o loop pricipal.
56 CAPTULO 8. PROGRAMAO ASSEMBLY (CONTINUAO)
Vetor de Interrupo
;Vetor de interrupc~ ao
ORG 0x0004
MOVWF W_TEMP ; salva o conteudo de W em W_TEMP
SWAPF STATUS, W ; salva o conteudo de STATUS
MOVWF STATUS_TEMP ; em STATUS_TEMP
BTFSC INTCON,T0IF ; testa se ocorreu interrupcao de timer0
GOTO TRATA_TMR0 ; se ocorreu, trata a interrupc~ ao
BTFSC INTCON,T0IF ; testa se ocorreu interrupcao de timer0
GOTO TRATA_TMR0 ; se ocorreu, trata a interrupc~ ao
BTFSC PIR1,TMR1IF ; testa se ocorreu interrupcao de timer1
GOTO TRATA_TMR1 ; se ocorreu, trata a interrupc~ ao
BTFSC INTCON,INTF ; testa se ocorreu interrupcao externa
GOTO TRATA_INT ; se ocorreu, trata a interrupc~ ao
FIM_INT:
SWAPF STATUS_TEMP, W ; restaura o conteudo do
MOVWF STATUS ; registrador STATUS
SWAPF W_TEMP, W ; restaura o conteudo do registrador W
RETFIE ; retorna da interrupc~ ao
TRATA_TMR0:
BCF INTCON,T0IF
; executa comandos para tratamento
; da interrupc~ ao de timer0
GOTO FIM_INT
TRATA_TMR1:
BCF PIR1,T1IF
; executa comandos para tratamento
; da interrupc~ ao de timer1
GOTO FIM_INT
TRATA_INT: ; tratamento da interrupc~ ao externa
BCF INTCON,INTIF
8.1. PROGRAMANDO ASSEMBLY COM INTERRUPO 57
BSF LED_VM ; acende o LED vermelho
GOTO FIM_INT
Defenimos o endereo do vetor de interrupo, salvamos o contexto (W e STATUS) e
vericamos os ags de interrupo para descobrir qual delas ocorreu (BTFSC). Uma vez
detectada a interrupo, desviamos para a rotina especca (GOTO).
No caso, tratamos a interrupo externa (INTCON,INTF) desviando para "TRATA_INT:".
Inicalmente limpamos o ag correspondente, setamos o LED vermelho e chamamos a rotina
de retorno de interrupo (FIM_INT). Essa rotina efetua a restaurao de contexto (valores
de W e de STATUS) e retorna da interrupo (RETFIE).
O restante doprograma ca inalterado e o LED verde continua piscando a cada 500ms.
Resumo
Nesta aula voc expandiu os conhecimentos sobre programao assembly pela utiliza-
o da interrupo externa do PIC12F675.
Atividades de aprendizagem
Responda s seguintes questes:
1- Qual a importncia de se utilizar interrupes em um microcontrolador?
2- Qual registrador utilizado como chave de interrupo externa no PIC12F675?
3- Por que necessario salvar o contexto do programa antes de se atender a uma
interrupo?
4- O que se deve fazer ao trmino do atendimento de uma interrupo?
58 CAPTULO 8. PROGRAMAO ASSEMBLY (CONTINUAO)
Captulo 9
Programao C
Objetivos da aula
Conhecer a linguagem C aplicada ao microcontrolador.
Estudar aplicaes da linguagem C para o microcontrolador PIC12F675.
9.1 Introduo
C uma linguagem de programao de alto nvel largamente utilizada. Existe uma extensa
e bem diversicada literatura sobre a mesma.
Uma das principais caractersticas da linguagem C a sua operao atravs de funes
que podem ser chamadas a partir de uma funo principal, chamada main(). Ela deve
existir em qualquer programa escrito nesta linguagem (uso obrigatrio).
Em termos de funcionamento, os programas mostrados a seguir, so idnticos aos re-
spectivos programas escritos em assembly mostrados anteriormente. As observaes que
sero feitas serviro para realar as diferenas entre as diferentes formas de escrever os
rmwares de controle.
A utilizao de linguagens de alto nvel para se programar microcontroladores se deve
grande complexidade dos programas escritos em assembly. O volume de cdigo muito
maior em assembly do que em linguagens de alto nvel, o que torna muito difcil a depurao
dos mesmos quando esccritos em assembly.
De qualquer forma, muito importante o conhecimento do hardware interno do PIC, bem
como dos seus registradores e funes especiais, para que se tire o mximo proveito dos
mesmos com a programao em linguagem C.
9.2 Pincipais Estruturas da Linguagem C
9.2.1 Variveis, Atribuies e Comparaes
Em C temos os seguintes tipos bsicos de variveis:
59
60 CAPTULO 9. PROGRAMAO C
char: Guarda um caracter;
int: Guarda um nmero inteiro;
oat: Guarda um nmero real com preciso simples;
double: Guarda um nmero real com preciso dupla;
void: Tipo vazio.
A declarao de variveis e atribuio de valores para as mesmas feita como em:
int evento ;
char corrida;
float tempo;
evento = 5;
corrida = C;
tempo = 27.25;
Para efetuarmos comparaes, utilizamos os seguintes operadores:
> maior que;
>= maior ou igual;
< menor que;
<= menor ou igual;
== igual;
!= diferente.
9.2.2 Estruturas de Controle
A principal estrutura de controle o comando if, que testa se uma condio verdadeira e,
ento, executa um bloco de comandos. caso a condio do if no seja verdaeira, podemos
executar um outro bloco de comandos com o camando else, como no exemplo a seguir:
void main(void){
int a;
a = 5;
if (a > 0){
printf("a e positivo);
} else if (a == 0){
printf("a e nulo);
9.2. PINCIPAIS ESTRUTURAS DA LINGUAGEM C 61
} else {
printf("a e negativo);
}
}
9.2.3 Estruturas de Repetio
Em C temos as seguintes estruturas de repetio:
For
for(variavel = valor_inicial; condicao_envolvendo_variavel; incremento/decremento de variavel)
{
comandos...
}
Exemplo:
for(int i=0; i <= 10; i++) {
printf("i=",i);
}
While
while(condicao)
{
comandos...
/*N~ ao esqueca de que os comandos devem, de alguma forma, alterar condicao*/
}
Exemplo:
int i=1;
while(i <= 10){
printf("i=",i);
i++;
}
Do While
do
62 CAPTULO 9. PROGRAMAO C
{
comandos...
/*N~ ao esqueca de que os comandos devem, de alguma forma, alterar condicao*/
} while(condicao);
Exemplo:
int i=1;
do{
printf("i=",i);
i++;
}while(i <= 10);
9.3 Programas em C
9.3.1 Pisca LED
O programa a seguir faz com que o LED verde (ligado no pino 2), pisque em intervalos de
500ms.
A funo desse programa pode ser implementada com o seguinte algoritmo:
1. Congurar os parmetros de inicializao.
2. Colocar o pino 2 em nvel baixo.
3. Iniciar um loop innito.
4. Inverter o estado do pino 2.
5. Pausar a execuo do programa por um tempo
#include <12f675.h>
#include <regs_12f6xx.h>
#use delay(clock=4000000)
#fuses INTRC_IO, WDT, NOPUT, MCLR, NOBROWNOUT
// defini c~ ao das entradas e sadas
#bit Chave_1 = GPIO.2 // Pino 5
#bit Chave_2 = GPIO.3 // Pino 4
#bit LED_VD = GPIO.5 // Pino 2
#bit LED_AM = GPIO.4 // Pino 3
#bit LED_VM = GPIO.1 // Pino 6
9.3. PROGRAMAS EM C 63
// vari aveis para defini c~ ao da dire c~ ao dos pinos
#bit Tris_Chave_1 = TRISIO.2
#bit Tris_Chave_2 = TRISIO.3
#bit Tris_LED_VD = TRISIO.5
#bit Tris_LED_AM = TRISIO.4
#bit Tris_LED_VM = TRISIO.1
void main(){
setup_ADC_ports(NO_ANALOGS);
Tris_LED_VD = 0; // sada
Tris_LED_AM = 0; // sada
Tris_LED_VM = 0; // sada
Tris_Chave_1 = 1; // entrada
Tris_Chave_2 = 1; // entrada
LED_VD = 0; // apagado
LED_AM = 0; // apagado
LED_VM = 0; // apagado
while (true){
LED_VD = !LED_VD;
delay_ms(500);
}
}
9.3.2 Dissecando o Pisca LED
Incluso e Congurao
#include <12f675.h>
#include <regs_12f6xx.h>
#use delay(clock=4000000)
#fuses INTRC_IO, NOWDT, NOPUT, NOMCLR, NOBROWNOUT
Nesse bloco, temos a incluso dos arquivos contendo as denies dos registradores
do PIC12F675. Temos, tambm, a denio da frquencia de clock (4MHz) e a denico dos
fuses internos do PIC.
64 CAPTULO 9. PROGRAMAO C
Entradas e sadas
// defini c~ ao das entradas e sadas
#bit Chave_1 = GPIO.2 // Pino 5
#bit Chave_2 = GPIO.3 // Pino 4
#bit LED_VD = GPIO.5 // Pino 2
#bit LED_AM = GPIO.4 // Pino 3
#bit LED_VM = GPIO.1 // Pino 6
Nesse bloco, denimos os nomes dos pinos de entrada e de sada
Direo das Entradas e sadas
// vari aveis para defini c~ ao da dire c~ ao dos pinos
#bit Tris_Chave_1 = TRISIO.2
#bit Tris_Chave_2 = TRISIO.3
#bit Tris_LED_VD = TRISIO.5
#bit Tris_LED_AM = TRISIO.4
#bit Tris_LED_VM = TRISIO.1
Nesse bloco, denimos os nomes das variveis que sero usados na denio da di-
reo dos pinos de entrada e de sada
Loop Principal
void main(){
setup_ADC_ports(NO_ANALOGS);
Tris_LED_VD = 0; // sada
Tris_LED_AM = 0; // sada
Tris_LED_VM = 0; // sada
Tris_Chave_1 = 1; // entrada
Tris_Chave_2 = 1; // entrada
LED_VD = 0; // apagado
LED_AM = 0; // apagado
LED_VM = 0; // apagado
while (true){
LED_VD = !LED_VD;
delay_ms(500);
}
9.3. PROGRAMAS EM C 65
}
Temos a funo main(), que onde o programa "roda"efetivamente. Inicialmente, den-
imos todas as portas como entradas e sadas digitais. A seguir, denimos a direo dos
pinos (entradas e sadas). Inicializamos todos os LEDs com apagados e entramos no loop
innito, que inverte o valor do LED e aguarda 500ms.
Note-se que o cdigo cou bem mais simples e mais legvel.
9.3.3 Pisca LED com Interrupo
Retomamos o programa anterior em que o LED verde pisca a cada 500ms e acrescentamos
um tratamento de interrupo externa para acender o LED vermelho sempre que a chave 1
passar do nvel baixo para o nvel alto.
#include <12f675.h>
#include <regs_12f6xx.h>
#use delay(clock=4000000)
#fuses INTRC_IO, WDT, NOPUT, MCLR, NOBROWNOUT
// defini c~ ao das entradas e sadas
#bit Chave_1 = GPIO.2 // Pino 5
#bit Chave_2 = GPIO.3 // Pino 4
#bit LED_VD = GPIO.5 // Pino 2
#bit LED_AM = GPIO.4 // Pino 3
#bit LED_VM = GPIO.1 // Pino 6
// vari aveis para defini c~ ao da dire c~ ao dos pinos
#bit Tris_Chave_1 = TRISIO.2
#bit Tris_Chave_2 = TRISIO.3
#bit Tris_LED_VD = TRISIO.5
#bit Tris_LED_AM = TRISIO.4
#bit Tris_LED_VM = TRISIO.1
#int_ext
void trata_int_ext() // trata a interrupc~ ao externa
{
LED_VM = 1;
}
void main(){
setup_ADC_ports(NO_ANALOGS);
66 CAPTULO 9. PROGRAMAO C
enable_interrupts(global | int_ext);
Tris_LED_VD = 0; // sada
Tris_LED_AM = 0; // sada
Tris_LED_VM = 0; // sada
Tris_Chave_1 = 1; // entrada
Tris_Chave_2 = 1; // entrada
LED_VD = 0; // apagado
LED_AM = 0; // apagado
LED_VM = 0; // apagado
while (true){
LED_VD = !LED_VD;
delay_ms(500);
}
}
9.3.4 Dissecando o Pisca LED com Interrupo
#int_ext
void trata_int_ext() // trata a interrupc~ ao externa
{
LED_VM = 1;
}
Acrescentamos a rotina que trata a interrupo externa, cuja funo ligar o LED ver-
melho.
void main(){
setup_ADC_ports(NO_ANALOGS);
enable_interrupts(global | int_ext);
Tris_LED_VD = 0; // sada
Tris_LED_AM = 0; // sada
Tris_LED_VM = 0; // sada
Tris_Chave_1 = 1; // entrada
Tris_Chave_2 = 1; // entrada
9.3. PROGRAMAS EM C 67
LED_VD = 0; // apagado
LED_AM = 0; // apagado
LED_VM = 0; // apagado
while (true){
LED_VD = !LED_VD;
delay_ms(500);
}
}
Habilitamos a interrupo global e a interrupo externa (enable_interrupts(global | int_ext);).
Note-se como muito mais simples de se lidar com interrupes em C quando se com-
para com o assembly.
Resumo
Nesta aula voc aprendeu sobre a linguagem C aplicada aos microcontroladores. Con-
heceu tambm aplicaes epeccas da a linguagem C para o PIC12F675.
Atividades de aprendizagem
Responda s seguintes questes:
1- Como associamos nomes aos pinos do PIC em C?
2- Como denimos se um pino do PIC entrada ou se sada em C?
3- Como implementamos um loop innito em C?
4- Como se ativa a interrupo externa no PIC12F675 em C?
5- Como se trata a interrupo externa no PIC12F675 em C?
68 CAPTULO 9. PROGRAMAO C
Captulo 10
Programao C (continuao)
Objetivos da aula
Conhecer o conversor analgico digital (A/D) do microcontrolador PIC12F675.
Estudar a utilizao prtica do conversor A/D do microcontrolador PIC12F675.
10.1 conversor A/D do microcontrolador PIC12F675
O PIC12F675 possui um conversor A/D (analgico / digital) interno que quando utilizado no
modo oito bits de resoluo, gera um resultado entre 0 e 255 correspondente a uma tenso
entre 0 e 5 V aplicada em um de seus pinos que podem operar no modo analgico.
Pode-se congur-lo, tambm, para operar em dez bits de resoluo. Isso aumenta a
preciso da converso A/D mas torna a converso mais lenta que em oito bits.
Para uma converso A/D de dez bits, o resultado estar ente 0 e 1023 correspondendo
a uma tenso de 0V a 5V linearmente.
Para utilizarmos este conversor, necessrio lig-lo inicialmente e congurar o pino de
entrada como entrada analgica.
10.2 Programa Exemplo A/D
O programa a seguir implementa um conversor A/D no pino 7 e, atarvs de um potn-
ciometro, possibilita variar a tenso entre 0V e 5V (ver circuito do Cap 7).
Os LEDs sero acionados em funo do nvel de tenso na entrada. Abaixo de 2V,
acende o LED verde. Entre 2V e 4V, acende o LED amarelo. Acima de 4V, acende o LED
vermelho.
Utilizando o conversor de 10bits, a tenso de 0V a 5V, ser mapeada em nmeros de 0
a 1023. A converso ser efetuada em degraus de 5V/1023 = 4,888mV.
Efetuando interpolao linear, os valores aps a converso para as tenses de refern-
cia sero: 2V -> 409 e 4V -> 818. necessrio o arredondamentos para valor inteiro.
69
70 CAPTULO 10. PROGRAMAO C (CONTINUAO)
#include <12f675.h>
#include <regs_12f6xx.h>
#device ADC=10
#use delay(clock=4000000)
#fuses INTRC_IO, WDT, NOPUT, MCLR, NOBROWNOUT
// defini c~ ao das entradas e sadas
#bit Chave_1 = GPIO.2 // Pino 5
#bit Chave_2 = GPIO.3 // Pino 4
#bit LED_VD = GPIO.5 // Pino 2
#bit LED_AM = GPIO.4 // Pino 3
#bit LED_VM = GPIO.1 // Pino 6
// vari aveis para defini c~ ao da dire c~ ao dos pinos
#bit Tris_Chave_1 = TRISIO.2
#bit Tris_Chave_2 = TRISIO.3
#bit Tris_LED_VD = TRISIO.5
#bit Tris_LED_AM = TRISIO.4
#bit Tris_LED_VM = TRISIO.1
void main(){
setup_ADC_ports(AN0_ANALOG); // AN0 como entrada anal ogica, as demais como digital
setup_ADC(ADC_CLOCK_INTERNAL); // utiliza o clock interno para o conversor A/D
Tris_LED_VD = 0; // sada
Tris_LED_AM = 0; // sada
Tris_LED_VM = 0; // sada
Tris_Chave_1 = 1; // entrada
Tris_Chave_2 = 1; // entrada
LED_VD = 0; // apagado
LED_AM = 0; // apagado
LED_VM = 0; // apagado
int16 V; // declara vari avel
while (true){
set_adc_channel(0); // AN0 -> pino 7
delay_us(15); // tempo para a convers~ ao A/D
10.2. PROGRAMA EXEMPLO A/D 71
V = read_adc(); // 0 a 1023
// compara c~ ao para determinar qual o LED deve ser ligado
if (V < 409){ // < 2V
LED_VD = 1;
LED_AM = 0;
LED_VM = 0;
} else if (V < 818){ < 4V
LED_VD = 0;
LED_AM = 1;
LED_VM = 0;
} else {
LED_VD = 0;
LED_AM = 0;
LED_VM = 1;
}
}
}
Os pontos relevantes desse cdigo so:
#deviceADC = 10 : dene que a converso ser de 10 bits;
setup_ADC_ports(AN0_ANALOG) : dene o pino 7 como entrada analgica;
setup_ADC(ADC_CLOCK_INTERNAL) : utiliza o clock interno para acionar o con-
versor A/D;
set_adc_channel(0) : inicia a converso A/D no AN0;
delay_us(15) : aguarda tempo para garantir o trmino da converso;
V = read_adc() : transfere o valor do conversor para a varivel V;
if(V < 409) : compara valor para determinar o LED que ser ativado.
Resumo
Nesta aula voc aprendeu a utilizar o conversor A/D do PIC12F675.
Atividades de aprendizagem
Responda s seguintes questes:
1- Qual a diferena prtica entre converso A/D de 8bits e de 10bits?
2- Qual o comando utilizado para denir se um pino entrada analgica no PIC12F675?
72 CAPTULO 10. PROGRAMAO C (CONTINUAO)
3- Qual o comando utilizado para selecionar o canal de entrada para o conversor A/D no
PIC12F675?
4- Qual o comando utilizado para efetuar a leitura do valor armazenado no conversor
A/D do PIC12F675?
10.2. PROGRAMA EXEMPLO A/D 73
Currculo dos professores-autores
dilus de Carvalho Castro Penido
Oprof. dilus de Carvalho Castro Penido engenheiro eletricista
formado pela PUC-MG e leciona a disciplina "Projetos de Au-
tomao"no IFMG Campus Ouro Preto. desenvolvedor de sis-
temas microcontrolados.
Ronaldo Silva Trindade
O prof. Ronaldo Silva Trindade engenheiro civil formado pela
Universidade Federal de Ouro Preto UFOP, com mestrado em
estruturas metlicas pela REDEMAT. professor do IFMG Cam-
pus Ouro Preto (antiga Escola Tcnica Federal de Ouro Preto)
desde 1987. autodidata em eletrnica e em computao, pos-
suindo grande experincia em laboratrio de eletroeletrnica e
no desenvolvimento de sistemas microcontrolados.
74 CAPTULO 10. PROGRAMAO C (CONTINUAO)
Referncias Bibliogrcas
[1] Wagner da Silva Zanco. Microcontroladores PIC - Tcnicas de Software e Hardware
para Projetos de Circuitos Eletrnicos. rica, So Paulo, 2006.
[2] David Jos de Souza. Desbravando o PIC - Ampliado e Atualizado para PIC 16F628A.
rica, So Paulo, 2005.
[3] David Jos de Souza and Nicols Csar Lavinia. Conectando o PIC - Recursos Avana-
dos. rica, So Paulo, 2002.
[4] Andr Schneider Oliveira and Fernando Souza Andrade. Sistemas Embarcados - Hard-
ware e Firmware na Prtica. rica, So Paulo, 2006.
[5] Fbio Pereira. Microcontroladores PIC - Tcnicas Avanadas. rica, So Paulo, 2002.
[6] Fbio Pereira. Microcontroladores PIC Programao em C. rica, So Paulo, 2003.
[7] Daniel Rodrigues. Desbravando o PIC24 - Conhea os Microcontroladores de 16 bits.
rica, So Paulo, 2003.
75