aos Microcontroladores
PIC
1.
O que um microcontrolador?
Um microcontrolador, comumente referenciado pela sigla uC, um componente programvel capaz de controlar sistemas eletrnicos. De modo geral, esse tipo de dispositivo
pode ser encarado como um destes computadores com os quais estamos acostumados a lidar
no dia-a-dia, entretanto, em menor escala.
Essa comparao pode ser feita visto que todos os computadores, sejam simples desktops (computadores de mesa) ou robustos mainframes (computadores de grande porte destinados ao processamento de um vasto volume de informaes), possuem um conjunto de caractersticas comuns que aparecem tambm entre os microcontroladores:
Todo computador possui uma unidade central de processamento, CPU, responsvel
pela execuo dos softwares (programas de computador);
A CPU, por sua vez, precisa carregar, de algum lugar, o programa a ser executado. Em
desktops, os softwares so carregados a partir do disco rgido da mquina, conhecido
como HD, do ingls Hard Disk;
Para o armazenamento temporrio dos arquivos e programas que esto sendo executados no momento, existe a memria de acesso aleatrio (Random Access Memory),
conhecida como memria RAM ou memria de dados. O termo acesso aleatrio (ou
acesso randmico) refere-se capacidade de acesso a qualquer posio da memria
em qualquer momento, em oposio ao acesso seqencial imposto por alguns dispositivos de armazenamento;
Os computadores tambm possuem alguns dispositivos de entrada e sada, responsveis pela interface entre o usurio e a mquina. No caso dos desktops, por exemplo, o
mouse e o teclado representam dispositivos de entrada, enquanto o monitor e a impressora so dispositivos de sada. O HD, por sua vez, considerado um dispositivo de
entrada e sada, E/S, j que manipula tanto a entrada como a sada.
A principal diferena entre os computadores comuns e os microcontroladores, de fato,
est na potencialidade de cada um: computadores so mquinas de propsito geral, com a
capacidade de execuo de milhares de programas distintos; j os microcontroladores so
dispositivos de propsito especfico (dedicados), executando, normalmente, um nico software. Alm disso, existem outras especificidades que auxiliam na caracterizao dos microcontroladores:
Os microcontroladores so, de modo geral, embutidos no interior de outros dispositivos, normalmente produtos comercializveis como calculadoras, telefones, mquinas
de lavar roupas, relgios e equipamentos robticos, para que possam controlar as funes e as aes desses produtos. Por esse motivo, muitas vezes os microcontroladores
so chamados de controladores embarcados (ou controladores embutidos);
Microcontroladores geralmente so dispositivos de baixa potncia. Um desktop, por
exemplo, quase sempre ligado rede, podendo consumir dezenas de watts de energia eltrica. Um uC alimentado por bateria, por sua vez, consome uma potncia da ordem de miliwatts;
Um uC normalmente pequeno e barato. Os componentes so escolhidos de forma a
minimizar o tamanho e baratear o dispositivo.
Portanto, a partir das informaes apresentadas, possvel esclarecermos uma discusso que normalmente surge entre aqueles que esto iniciando seus estudos em microcontroladores: a diferena entre microcontroladores e microprocessadores. O aspecto mais importante que difere um uC de um microprocessador a sua funcionalidade. Para que um micropro1|P gin a
1.1.
Aspectos construtivos
Portanto, independentemente da empresa fabricante ou da famlia de microcontroladores escolhida, h elementos que se fazem presentes na arquitetura de qualquer uC, diferindo apenas em caractersticas como velocidade, capacidade de armazenamento, freqncia de
operao, entre outras. Dessa forma, todo uC dispe de:
CPU, que, como mencionada anteriormente, responsvel por interpretar as instrues de programa;
Memria de programa, na qual ser feito o armazenamento das instrues de programa. Essa memria pode ser do tipo PROM (Programmable Read Only Memory ou
Memria Programvel Somente para Leitura), no permitindo a reprogramao do
dispositivo, EEPROM (Eletrically Erasable Programmable Read Only Memory) ou flash
(memria utilizada em pen drives), sendo que as duas ltimas possibilitam regravao.
Memria de dados ou RAM, utilizada para memorizar as variveis utilizadas pelo programa. Essa memria dita voltil, pois uma vez cessada a fonte de alimentao, os
dados armazenados so perdidos, ao contrrio do que ocorre com as memrias de
programa citadas no item anterior;
Dispositivos perifricos como temporizadores, conversores A/D e D/A, contadores,
entre outros;
Linhas de I/Os (entrada e sada) para controlar dispositivos externos ou receber informaes de sensores, chaves, etc.
A presena de todos esses elementos em um espao extremamente pequeno d ao
projetista ampla gama de trabalho e enorme vantagem em usar um sistema microprocessado
do tipo, onde em pouco tempo e com poucos componentes externos possvel fazer o que
seria bastante trabalhoso com circuitos tradicionais.
1.2.
Os microcontroladores PIC
2|P gin a
Modelo
Memria de Programa
Pinagem
PIC10
12-bit palavra de programa
De 6 a 14 pinos
PIC12
12-bit palavra de programa
8 pinos
PIC16 14-bit palavra de programa (at 8kB de memria de programa) De 8 a 64 pinos
PIC18
128kB de memria de programa
De 18 a 100 pinos
Caractersticas mais detalhadas acerca de cada microcontrolador podem ser encontradas em seus respectivos datasheets (folhas de dados). A subseo seguinte toma o datasheet
dos modelos 16F87X da famlia PIC como exemplo, e apresenta algumas funcionalidades interessantes do microcontrolador PIC 16F876, que ser o dispositivo trabalhado durante as aulas.
Expostas as principais caractersticas dessa famlia de microcontroladores, importante que se justifique o porqu da escolha do PIC como ferramenta de estudo neste curso. Afinal,
3|P gin a
1.3.
PIC16F87X Caractersticas
Conforme mencionado anteriormente, o datasheet utilizado refere-se aos microcontroladores PIC 16F87X, incluindo os modelos 16F873, 16F874, 16F876 e 16F877. Portanto, antes de serem expostas as caractersticas especficas do modelo 16F876, a tabela abaixo, extrada da pgina 3 do datasheet (em anexo), traz uma comparao entre cada um dos modelos
acima citados.
Como pode ser observado, os quatro modelos apresentam a mesma faixa de freqncia de operao, variando de 0Hz (DC) a 20MHz. Os dispositivos tambm apresentam uma
memria flash de programa, cujas palavras de programa so de 14 bits. Nesse caso, o que varia a capacidade de cada uC, j que a memria de programa dos dispositivos 16F873 e
16F874 de 4kB, ao passo que nos outros dois modelos a memria de 8kB. Cada um dos
microcontroladores apresenta duas memrias de dados com capacidades de armazenamento
distintas. A menor delas uma memria EEPROM e a maior uma memria de dados voltil.
O nmero de timers e de mdulos PWM o mesmo para todos os uCs, assim como o conjunto
de instrues, um conjunto RISC de 35 instrues. Nas demais caractersticas, em geral, os
modelos 16F874 e 16F877 levam vantagem.
1.3.1. PIC16F876 Algumas funes caractersticas de microcontroladores
Fora as caractersticas deste modelo de uC j vistas na tabela anterior, interessante
que algumas caractersticas especficas sejam citadas e detalhadas, umas vez que so importantes em um estudo inicial sobre microcontroladores. Vale observar que as caractersticas
4|P gin a
Pino
VDD (pino 20)
VSS (pino 8 ou pino 19)
Osc1 (pino 9), Osc2 (pino10)
MCLR
RA0 a RA5 (pinos 2 ao 7) PORTA A
RB0 a RB7 (pinos 21 ao 28) PORTA B
RC0 a RC7 (pinos 11 ao 18) PORTA C
Funo
Alimentao do microcontrolador (5V)
Referencial de tenso (0V terra)
Ligao do circuito oscilador responsvel pelo
clock do microcontrolador
Pino de reset - Ativado quando em nvel baixo
E/S bidirecional
E/S bidirecional
E/S bidirecional
Maiores detalhes acerca das funes de cada um dos pinos do microcontrolador podem ser encontradas em seu datasheet, conforme ilustra a tabela abaixo retirada da folha de
dados referente aos modelos da famlia 16F87X.
Figura 1.5. Tabela contendo informaes acerca da pinagem do microcontrolador PIC 16F876
7|P gin a
1.4.
Figura 1.6. Configurao da freqncia de operao do microcontrolador atravs da ferramenta de projeto PICWizard do software PCW
A Figura 1.7 abaixo traz os possveis modos de gerao do sinal de clock do microcontrolador.
Dentre as principais caractersticas do circuito oscilador RC, esquematizado na Figura
1.7(a), podem ser destacadas:
Circuito mais simples e mais barato de ser implementado, quando comparado
a outros tipos de osciladores;
Utilizao de um nico pino para conexo (pino 9 OSC1);
Oscilador com pouca preciso de clock e com baixa estabilidade;
Deve ser considerado em aplicaes onde o tempo no um fator muito importante e a economia o objetivo principal;
A freqncia de oscilao baixa, inferior a 700kHz, e depende dos valores de
,
,
, temperatura e tolerncia.
8|P gin a
VCC
Circuito oscilador RC
Cext
10
C1
OSC1
XTAL
OSC2
10
PIC16F876/873
Rext
PIC16F876/873
C2
(a)
5k
Cext
Rext 100k
20 pF
(b)
OSC1
Sinal de Clock
Externo
(c)
10
PIC16F876/873
Circuito externo de
gerao de clock
Alm dessa configurao externa apresentada para o oscilador RC, tambm existe a
possibilidade de configurar o oscilador RC interno do microcontrolador. Assim como a configurao externa, a preciso e a estabilidade do sinal de clock gerado por esse circuito no boa.
Embora a imunidade a rudos e a economia de pinos seja uma vantagem do oscilador interno,
a calibrao desse circuito no confivel e, dessa forma, na maioria das vezes opta-se pelo
uso de um oscilador externo, j que as rotinas de comunicao serial so muito afetadas pela
impreciso do clock. (Fbio Pereira Microcontroladores PIC Programao em C 7 Edio).
J os circuitos osciladores que fazem uso de cristais ou ressonadores cermicos, representados pela Figura 1.7(b), podem ser divididos em trs tipos bsicos: LP (Low Power), XT
(XTAL) e HS (High Speed). A tabela abaixo mostra os valores tpicos adotados para circuitos
osciladores que utilizam cristais ou ressonadores.
Tabela 1.3. Valores recomendados para o circuito oscilador
Circuito
XT
XT
XT
HS
HS
LP
LP
XT
XT
XT
Freqncia (componente)
455kHz (ressonador)
2MHz (ressonador)
4MHz (ressonador)
8MHz (ressonador)
10MHz (ressonador)
32kHz (cristal)
200kHz (cristal)
100kHz (cristal)
2MHz (cristal)
4MHz (cristal)
Capacitor
47-100pF
15-33pF
15-33pF
15-33pF
15-33pF
68-100pF
15-33pF
100-150pF
15-33pF
15-33pF
9|P gin a
4MHz (cristal)
10MHz (cristal)
15-33pF
15-33pF
Esses osciladores possuem alta preciso e estabilidade e, por isso, custo elevado quando comparado a osciladores do tipo RC. A freqncia de oscilao, como mostra a tabela acima, alta e menos sensvel a variaes externas.
No caso da configurao LP, so necessrios um cristal oscilador de baixa freqncia
(32kHz a 200kHz) e dois capacitores cujos valores so especificados na tabela acima. Essa configurao normalmente empregada em aplicaes que exigem baixa velocidade de processamento e baixo consumo de energia, tendo em vista que utiliza cristais de baixa potncia.
O modo XT o mais usado. Sua implementao pode ser feita atravs de um cristal
oscilador ou de um ressonador cermico. O cristal apresenta uma preciso superior, e menor
sensibilidade a fatores externos, no entanto necessita de dois capacitores conectados a ele. J
no caso do ressonador cermico, a preciso menor, mas os dois capacitores so dispensados
(embutidos no ressonador) e, dessa forma, o custo menor. Durante este curso, a configurao que iremos adotar a XT, fazendo uso de um cristal oscilador de quartzo de 4MHz e dois
capacitores de 22pF cada (indo ao encontro dos dados fornecidos pela Tabela 1.3).
Freqncias de oscilao acima de 4MHz (alta velocidade de processamento) exigem a
configurao HS. Ela pode ser implementada com um cristal oscilador ou com um ressonador
cermico. Esse o modo de maior consumo de energia.
Alm disso, ainda existe a opo de um circuito que gere o clock do uC externamente,
conforme ilustra a Figura 1.7(c). Este tipo de circuito pode ser feito a partir de portas lgicas,
transistores, geradores de onda quadrada, etc. Possui a desvantagem de utilizar muitos componentes e apresentar variaes de freqncia com a temperatura. Ainda assim, representa
uma boa opo quando se deseja sincronizar vrios microcontroladores alimentados pelo
mesmo sinal de clock. Optando por essa forma de gerao de clock, apenas um pino do uC
usado, o pino 9 (OSC1).
A partir dos circuitos osciladores expostos, verifica-se que a escolha de um deles depende da aplicao em questo. No entanto, os fatores normalmente avaliados so a velocidade de processamento, o consumo de energia, a estabilidade a fatores externos, o uso de
pinos (portas) e o custo dos componentes.
Outra conexo que sempre realizaremos refere-se ao pino de reset do uC. Todo PIC
possui um pino de reset. No caso do modelo 16F876, este o pino 1, MCLR. Ele deve ser ligado
ao terminal positivo da fonte (
) atravs de uma resistncia, e sua funo inicializar o microcontrolador a partir da posio zero de memria sempre que conectado referncia da
alimentao ( ). A conexo entre o pino MCLR e o terminal
deve ser feita atravs de
uma resistncia, cuja funo conservar a tenso do pino em nvel lgico alto. O valor dessa
resistncia deve estar entre 5 e 10k.
O pino MCLR representa, portanto, uma possibilidade de resetar o microcontrolador
manualmente.
10 | P g i n a
VCC
R 10k
MCLR
PIC16F876/873
5k
no pino 20 e
5V
5k
R 10k
22 pF
4MHz
5V
22 pF
Figura 1.9. Esquema de conexes bsicas do microcontrolador PIC 16F876
NOTA: Recomenda-se que todos os dispositivos previstos pelo software que utilizam pinos de
E/S do microcontrolador sejam conectados. Caso contrrio, o sistema poder no funcionar
corretamente.
Exemplo: Display LCD
11 | P g i n a
2.
Arquivo .hex
Editor de Texto
Compilador
ou
Assembler
Cdigo em
linguagem
de mquina
2.1.
Linguagem C x Assembly
2.2.
Metodologia de programao
Em geral, na hora de programar um microcontrolador costuma-se seguir algumas etapas tpicas, com o objetivo de facilitar a organizao e a documentao do projeto. Essas etapas so mostradas no fluxograma que segue.
ETAPA 1: EXPOSIO DO PROBLEMA
O programador deve elaborar uma descrio seqencial, passo a passo, da soluo escolhida. Assim, tem-se
um algoritmo ou fluxograma.
ETAPA 4: TRADUO DO CDIGO
Atravs do algoritmo ou fluxograma elaborado, o programador deve traduzir a soluo escolhida para a
linguagem de trabalho adotada (C ou Assembly, neste caso).
ETAPA 5: DEPURAO
Compilar o programa e, caso ocorram erros, corrigir os problemas. Para programas maiores, deve-se fazer a
depurao em cada fragmento do cdigo.
ETAPA 6: SIMULAO
O programa gerado pelo compilador deve ser simulado atravs de um software que contenha o modelo do uC
em estudo.
ETAPA 7: GRAVAO
Aps a realizao de todos os testes de simulao, o arquivo .hex pode ser gravado no uC (dispositivo fsico).
13 | P g i n a
2.3.
Tipo
short int, int1, boolean
char
signed char
unsigned char
int, int8, byte
signed int, signed byte
unsigned int, unsigned byte
long int, int16
signed long int
unsigned long int
int32
signed int32
unsigned int32
float
Tamanho em
bits
1
8
8
8
8
8
8
16
16
16
32
32
32
32
Faixa de valores
0 ou 1
0 a 255
-128 a 127
0 a 255
0 a 255
-128 a 127
0 a 255
0 a 65.535
-32.768 a 32.767
0 a 65.535
0 a 4.294.967.295
-2.147.483.648 a 2.147.483.648
0 a 4.294.967.295
1,18-38 a 3,438
O padro ANSI C prev, ainda, o tipo double, que consiste em uma verso com capacidade
de representao dobrada (64 bits) em relao ao tipo float. O compilador CCS no suporta
esse tipo de dado, no entanto, a palavra double continua entre as palavras reservadas da
linguagem.
Uma varivel em C, portanto, pode ser declarada como sendo de qualquer um dos
tipos especificados na Tabela 2.1, tal que sua declarao feita conforme sintaxe abaixo:
[tipo de dado] [nome da varivel];
Como exemplo de declarao de variveis, tem-se:
14 | P g i n a
16 | P g i n a
2.4.
17 | P g i n a
(em um loop infinito, o LED fica aceso durante 0,1seg e apagado durante
#use delay(clock=4000000)
A seqncia #use especifica uma diretiva interna do compilador. No caso, a diretiva
determina ao compilador que considere o valor de
ou
para a freqncia
de clock do uC. Esse valor utilizado para gerao dos cdigos de atraso e outras rotinas que
dependem de tempo.
Na linha seguinte, aparece:
#fuses INTRC_IO, NOWDT, PUT, BROWNOUT, NOLVP, NOMCLR
Esta uma diretiva que especifica o estado dos fusveis da palavra de configurao
do dispositivo (INTRC_IO, NOWDT, PUT, BROWNOUT, NOLVP, NOMCLR). No presente caso,
estamos selecionando pela ordem: oscilador de clock interno de 4MHz, com os pinos RA6 e
RA7 disponveis para E/S. No caso da famlia de microcontroladores PIC 16F62X, os pinos RA6 e
RA7 podem ser configurados para receber um sinal de clock externo (CLKIN e CLKOUT, respectivamente). Como, nesse caso, a gerao do clock interna, ento os pinos RA6 e RA7 podem
ser setados como pinos de E/S; Aps INTRC_IO, tem-se NOWDT, que indica o desligamento do
watchdog (no watchdog timer); Em seguida, na seqncia, timer power-up ligado, reset por
brown-out ligado, programao por baixa tenso desligada e MCLR interno (pino RA5 disponvel como entrada). Estas opes variam conforme o modelo de PIC utilizado.
A lista com os valores vlidos para a determinao do estado de cada fusvel pode ser
verificada a qualquer momentos no menu VIEW > Valid Fuses do compilador.
Na prxima linha do programa, tem-se:
main()
A declarao main() especifica o nome de uma funo. No caso, a funo main()
padronizada na linguagem C e utilizada para definir a funo principal, ou o corpo principal
do programa.
Uma funo, em C, um conjunto de instrues que pode ser executado a partir de
qualquer ponto do programa.
O sinal de abertura de chave { utilizado para delimitar o incio da funo, e o sinal
de fechamento de chave } indica o fim da funo.
O primeiro comando, int tempo, corresponde a uma declarao de varivel. Este
comando determina que o compilador crie uma varivel do tipo inteiro int chamada tempo.
Atravs desta operao, reservado um espao de 8 bits na memria de programa destinado
varivel tempo. Uma vez que o tamanho da varivel criada de 8 bits, a varivel tempo s
poder assumir valores entre 0 e 255.
Em seguida, atravs do comando de atribuio tempo=100, a varivel tempo assume o valor 100 (observe que o valor da varivel est situado dentro da faixa de valores permitida).
A primeira linha do bloco de comandos da funo main() :
while(true)
Conforme j visto anteriormente, o while() um comando de controle utilizado na
repetio de um determinado bloco de instrues. Esse bloco ser repetido enquanto a avalia19 | P g i n a
20 | P g i n a
Captulo 3 - Softwares
3.
Softwares
3.1
PCWH Compiler
O CCS C o software onde escrevemos nosso cdigo em C/C++ que dever ser compilado para a utilizao no microcontrolador. Este mesmo cdigo ser utilizado para a simulao
no ISIS.
Vamos ver agora as principais funcionalidades deste software.
3.1.1 PIC Wizard
O PIC Wizard a maneira mais prtica de iniciar um novo projeto. Nele, atravs de
uma interface grfica, possvel escolher o dispositivo, a freqncia de oscilao, se haver
algum tipo de comunicao, as portas que sero utilizadas, timers, etc. uma excelente ferramenta para aqueles que esto comeando a trabalhar com PIC, pois ele gera automaticamente
o cdigo com os parmetros j definidos.
O cone do PIC Wizard fica na aba Project:
21 | P g i n a
Captulo 3 - Softwares
Nas partes destacadas em vermelho podemos escolher o dispositivo que ser utilizado,
a freqncia em que o dispositivo ir operar, e de que forma se dar essa freqncia. Como
mencionado, a principal utilidade do PIC Wizard que ele gera o cdigo baseado nos parmetros escolhidos.
esquerda temos um lista com diversas opes para configurao do PIC. Vamos agora descrever as mais importantes delas.
3.1.1.1 Communications
Em communications podemos habilitar a comunicao do PIC com outros microcontroladores, com um computador, memrias externas, e etc. Os dois tipos de comunicao disponveis so RS-232 (Serial), e a comunicao I2C.
3.1.1.2 SPI e LCD
Aqui ficam as configuraes para o protocolo de comunicao SPI, e algumas configuraes para o LCD. Esses tpicos sero abordados em captulos subseqentes.
3.1.1.3 Timers
Em timers possvel configurar os timers 0 (RTCC), 1 e 2. Outra configurao disponvel
a do timer WTD (WatchDog). Um WatchDog Timer um dispositivo eletrnico temporizador
que dispara um reset ao sistema se o programa principal, devido a alguma condio de erro,
deixar de fazer reset no WatchDog timer.
22 | P g i n a
Captulo 3 - Softwares
3.1.1.4 Analog
Em analog possvel escolher quais portas do PIC sero disponibilizadas para a converso A/D. Alm disso, escolhe-se a resoluo do conversor e a freqncia de operao deste.
3.1.1.5 Interrupts
Em interrupts habilita-se as interrupes desejadas, entre elas, RTCC, interrupes
externas, converso A/D, Timer 1, Timer 2, coliso no barramento, etc.
3.1.1.6 Drivers
Em drivers adiciona-se elementos que sero utilizados no projeto. Uma das vantagens
de adicionar um driver por aqui, que o programa j inclui as bibliotecas necessrias para sua
utilizao. Existem opes como LCD driver, memrias EEPROM, teclado 3x4, drivers de dispositivos com tecnologia touch, e etc.
3.1.1.7 I/O Pins
Conforme so habilitadas as configuraes para o programa, como por exemplo, portas para converso A/D, drivers, comunicaes de protocolos diversos, so mostradas nesta
aba as portas que so reservadas para essas determinadas configuraes. possvel ainda,
configurar manualmente essas portas para entrada, sada, entrada/sada, analgica ou sem
uso.
NOTA: importante conhecer o recurso PICWizard, principalmente para aqueles que so iniciantes na utilizao dos microcontroladores PIC. Mas necessrio, tambm, que se saiba configurar todos os elementos por meio do programa em C.
3.1.2 Compilador
Depois de finalizado o cdigo, podemos compilar o programa utilizando-se a tecla F9.
Os arquivos que sero gerados na compilao, sero armazenados na mesma pasta que foi
escolhida para o arquivo .pjt. So gerados diversos arquivos de sada, o mais importante dele
o arquivo .hex. Utilizaremos esse arquivos na simulao dos nossos programas no ISIS Proteus.
O compilador do PCWH ainda conta com um debugger, que utilizado para encontrar
erros no programa.
3.1.3 Funes do compilador CCS
Veremos agora funes que o compilador CCS disponibiliza, e que podem auxiliar no
desenvolvimento de programas.
3.1.3.1 OUTPUT_LOW()
Essa funo coloca o pino especificado do microcontrolador em nvel lgico baixo (0).
Sintaxe:
output_low(pino)
23 | P g i n a
Captulo 3 - Softwares
3.1.3.2 OUTPUT_HIGH()
Essa funo coloca o pino especificado do microcontrolador em nvel lgico alto (1).
Sintaxe:
output_high(pino)
3.1.3.3 INPUT()
L o estado lgico de um pino microcontrolador.
Sintaxe:
res = input(pino)
Nesse caso, o nvel lgico do pino especificado ser armazenado na varivel res.
3.1.3.4 OUTPUT_X()
Escreve um byte completo em uma determinada porta do microcontrolador.
Sintaxe:
output_A(valor)
output_B(valor)
output_C(valor)
Nesse caso, valor uma varivel ou constante inteira de 8 bits.
3.1.3.5 INPUT_X()
L um byte completo de uma determinada porta do microcontrolador.
Sintaxe:
valor = input_A()
valor = input_B()
valor = input_C()
3.1.3.6 DELAY_US()
Aguarda n microssegundos.
Sintaxe:
delay_us(n)
n uma varivel inteira de 8 bits ou uma constante de 16 bits.
3.1.3.7 DELAY_MS()
Aguarda n milissegundos.
Sintaxe:
delay_ms(n)
24 | P g i n a
Captulo 3 - Softwares
n uma varivel inteira de 8 bits ou uma constante de 16 bits.
Para uma consulta mais completa acerca das funes disponveis no compilador CCS,
verifique o manual de instrues do mesmo.
3.1.4 Exemplos
Nos exemplo a seguir, vamos criar e configurar um projeto utilizando o PICWizard.
3.1.4.1 Exemplo 1
Criar um programa utilizando a linguagem C que faa um LED, conectado ao pino B0 do
microcontrolador, piscar na freqncia de 2Hz.
3.1.4.2 Exemplo 2
Criar um programa utilizando a linguagem C que faa contagem regressiva de 10 a 0 na
porta B (na base binria). Quando chegar ao valor 5, deve-se acender um LED no pino A0.
Quando a contagem chegar a 0, o LED deve piscar em 1Hz.
3.2
Proteus
No software ISIS Proteus pode-se simular o programa criado no PCWH. A tela inicial do
Proteus est mostrada na Figura 3.3.
Vamos utilizar o Proteus para montar um circuito simples para o funcionamento dos
exemplos criados na seo anterior. Na simulao no necessrio alimentar o MCU (
e
).
Para adicionar componentes, clique no cone Component Mode, e a seguir no cone
P, ambos marcados em vermelho na Figura 3.3. Uma caixa, intitulada Pick Devices, com os
componentes disponveis no programa ir aparecer, tal qual a ilustrada na Figura 3.4.
25 | P g i n a
Captulo 3 - Softwares
26 | P g i n a
Captulo 3 - Softwares
Feito isso, basta clicar no cone de Play, no canta inferior esquerdo da tela.
3.2.1 Atividade Prtica
Como atividade prtica deste captulo, simular no Proteus o programa criado para o
Exemplo 2.
27 | P g i n a
4.
(a)
(b)
Figura 4.1. LCD alfanumrico (a) e grfico (b)
4.1.
A pinagem dos mdulos LCD depende muito do fabricante de cada um. muito importante que o datasheet do dispositivo seja consultado antes de realizar as conexes. Como exemplo, utilizaremos o display da marca AZ Displays, modelo ACM1602B.
Datasheet: http://reocities.com/capecanaveral/6744/a_04_03.pdf
Consultando o datasheet deste dispositivo encontramos a seguinte disposio de pinagem:
Abaixo, apresentamos a relao de pinos do LCD, e a funo que cada um desses pinos
desempenha no funcionamento do mdulo.
28 | P g i n a
Nro. Pino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
+
-
4.2.
Smbolo
Vss
Vdd
Vo
RS
R/W
E
DB0
DB1
DB2
DB3
DB4
DB5
DB6
DB7
BLBL+
funo no LCD
Funo
Terra
+5V
Ajuste do contraste do LCD
Seleo do registrador
Leitura/Escrita
Habilitado
Bit de dados 0
Bit de dados 1
Bit de dados 2
Bit de dados 3
Bit de dados 4
Bit de dados 5
Bit de dados 6
Bit de dados 7
Alimentao do Backlight Alimentao do Backlight +
Pino no uC
PIC16F876A
B0
B1
B2
B4
B5
B6
B7
Pino no LCD
Enable (Pino 6)
RS (Pino 4)
R/W (Pino 5)
D4 (Pino 11)
D5 (Pino 12)
D6 (Pino 13)
D7 (Pino 14)
29 | P g i n a
4.3.
O mdulo LCD uma forma eficaz de exibir informaes que so processadas no microcontrolador. O compilador CCS possui um driver chamado LCD.C que permite a utilizao do
mdulo, e apresenta algumas funes especficas.
Ao utilizarmos o PICWizard, para inserir o driver do mdulo LCD, vemos, no incio do
cdigo gerado, o seguinte comando:
#include <LCD.C>
Esse comando diz ao compilador para inserir as funes que sero utilizadas para o
interfaceamento do LCD com o PIC. As funes disponveis para manipular o LCD so as seguintes:
LCD_PUTC()
Essa funo utilizada para mostrar um texto qualquer na tela do LCD. A sintaxe para
utilizao dessa funo :
lcd_putc(TEXTO)
PRINTF()
Essa funo utilizada para mostrar no display uma varivel do cdigo. A sintaxe para
utilizao dessa funo :
4.4.
Atividade prtica
Nesta atividade, ser conectado um boto (push-button) junto a um pino do microcontrolador. Alm disso, deve-se conectar este boto a uma fonte de tenso cc de 5v a fim de que
haja nvel lgico 1, ou seja, 5V no pino do microcontrolador quando o boto for pressionado.
Quando o boto no estiver pressionado, deve haver nvel lgico zero no pino do microcontrolador, ou seja, como se estive conectado ao referencial terra.
Devem-se indicar no LCD quantas vezes o boto foi pressionado. Quando este valor
chegar a 5, acende-se um LED conectado a outro pino do microcontrolador e reinicia-se a contagem.
Alm disso, apresentar uma nota de abertura no LCD, com uma frase a escolha.
31 | P g i n a
5.
Converso A/D
A grande maioria das variveis fsicas com as quais temos que lidar so analgicas, ou
seja, podem assumir qualquer valor dentro de um espectro contnuo de valores. Geralmente,
so essas variveis que queremos monitorar, operar e controlar em um sistema. Exemplos de
quantidades analgicas so a temperatura, a presso, a posio, a velocidade e outros.
Sistemas digitais, como os microcontroladores, realizam todas as suas operaes internas usando circuitos e grandezas digitais. Qualquer informao que tenha de entrar em um
sistema digital precisa, primeiramente, ser digitalizada. A Erro! Fonte de referncia no encontrada. mostra o diagrama de blocos para um sistema de controle de temperatura, onde a
temperatura, quantidade analgica, medida, e seu valor ento transformado em uma
quantidade digital por um conversor analgico-digital (ADC).
A/D
Sistema Digital
(Por exemplo,
uC)
D/A
5.1.
Vamos ver agora algumas caractersticas comuns aos conversores A/D, e sua influncia
no processo, relacionando estas caractersticas com o PIC16F876A.
5.1.1. Resoluo
A especificao mais importante de um conversor A/D a sua resoluo.
32 | P g i n a
Temos que:
de
20 MHz
VS Frequncias de Operao
Frequncia do Dispositivo
5 MHz
1.25 MHz
333.33 kHz
34 | P g i n a
5.2.
Vamos ver agora algumas caractersticas da converso A/D prprias do dispositivo que
estamos utilizando. Nesta seo vamos ver quais pinos do PIC16F876A so reservados para a
converso A/D, operao no modo sleep, efeito do reset na converso A/D e interrupes do
mdulo ADC.
Vimos, ento, que o mdulo de converso A/D do PIC16F876A possui cinco canais. A
converso de uma entrada analgica resulta em um nmero digital correspondente de 10 bits.
Os canais so numerados de 0 a 4: AN0, AN1, AN2, AN3 e AN4.
35 | P g i n a
5.3.
O compilador CCS tem funes especficas para serem utilizadas na converso A/D.
Vamos ver estas funes em detalhe nesta seo.
5.3.1. SETUP_ADC()
Esta funo configura o conversor A/D interno do microcontrolador. Com esta funo
habilitamos o conversor A/D e determinamos o clock de converso.
A sintaxe para a utilizao desta funo :
setup_ADC(opes)
36 | P g i n a
FUNO
Desabilita o mdulo ADC.
Divide o clock externo por 2.
Divide o clock externo por 4.
Divide o clock externo por 8.
Divide o clock externo por 16.
Divide o clock externo por 32.
Utiliza como fonte do clock do ADC o RC interno.
5.3.2. SETUP_ADC_PORTS()
Esta funo configura as entradas analgicas do conversor A/D interno, alm de configurar os valores de referncia desejados para a converso A/D.
A sintaxe para utilizao desta funo :
setup_ADC_ports(opes)
As opes disponveis para o PIC16F876A so as seguintes:
OPO
NO_ANALOGS
ALL_ANALOG
AN0_AN1_AN3
AN0
AN0_AN1_AN2_AN4_VSS_VREF
AN0_AN1_VSS_VREF
AN0_AN1_AN4_VREF_VREF
FUNO
Desabilita todos os canais ADC.
Habilita todos os canais do mdulo ADC, 0, 1, 2, 3 e 4.
Habilita os canais 0, 1 e 3 do mdulo ADC.
Habilita apenas o canal 0 do mdulo ADC.
Habilita os canais 0, 1, 2 e 4 do mdulo ADC; determina como
o terra, e como
a tenso na porta AN3
Habilita os canais 0 e 1 do mdulo ADC; determina como
o terra, e como
a tenso na porta AN3
N0_AN1_AN4_VREF_VREF (Habilita os canais 0, 1 e 4 do mdulo ADC; determina como
a tenso na porta A2, e
como
a tenso na porta A3.
5.3.3. SET_ADC_CHANNEL()
Seleciona um canal do mdulo ADC para entrada de um sinal analgico.
A sintaxe para utilizao desta funo :
set_ADC_channel(valor)
Lembremos que aps a seleo de um canal do mdulo ADC necessrio que se aguarde o tempo de aquisio, antes de efetuar a converso A/D.
Em valor, colocamos o nmero do canal do qual ser efetuada a converso A/D.
5.3.4. READ_ADC()
Esta funo efetua a converso A/D.
A sintaxe para utilizao desta funo :
37 | P g i n a
valor = read_ADC(opes)
As opes disponveis no PIC16F876A so as seguintes:
OPO
ADC_START_AND_READ
ADC_START_ONLY
ADC_READ_ONLY
5.4.
FUNO
Este o padro quando nada especificado. Inicia a converso A/D e
realiza a leitura.
Apenas efetua a converso A/D.
Apenas efetua a leitura da converso A/D.
(a)
(b)
Como vemos nas Figuras 5.4(a) e 5.4(b), o LM35 pode ser alimentado com uma fonte
(4V 20V), ou com fontes simtricas, conforme as conexes indicadas na figura acima.
No primeiro caso, a faixa de valores em que o sensor pode operar de 2C at 150C.
No segundo caso, a faixa de valores em que o sensor pode operar de -55C at
150C. A resistncia dada por:
A tenso de sada,
38 | P g i n a
5.5.
Aplicao Prtica
Vamos agora criar um termmetro simples, cuja leitura provm do sensor de temperatura LM35, e o valor obtido colocado em C em um LCD.
Utilizar no projeto um clock externo utilizando um cristal de 10MHz, e o pino AN0 para
fazer a converso A/D. Montar o circuito no Proteus como o mostrado na Figura 5.5.
39 | P g i n a
Captulo 6 - Timers
6.
Timers
6.1.
Tempo de estouro
O tempo de estouro de um timer pode ser determinado pelos parmetros de configurao do microcontrolador. Suponha que o microcontrolador PIC possui um clock externo de
8MHz (cristal oscilador); o registrador do timer tem uma largura de 8 bits e opera com clock de
referncia igual ao clock da CPU; o prescaler igual a 2. Podemos determinar o tempo de estouro da seguinte forma:
O clock interno do PIC quatro vezes menor que o externo, ou seja, 2MHz. Foi utilizado
o preescaler de 2, ou seja, o clock de referncia do timer de 1MHz. O perodo deste clock de
1us. Como o timer0 um registrador de 8 bits, ento armazena de 0 a 255, ou seja, 256 valores. O tempo de estouro , portanto, 256 us.
Em que
6.2.
Interrupes
Uma interrupo uma funo que existe em microcontroladores que permite, atravs de um evento externo, causar um desvio na execuo do programa. Esse conceito extremamente importante no projeto de sistemas embarcados. Alguns dos eventos que podem
causar desvio na execuo do programa so:
Interrupo externa atravs do pino RB0/INT;
Escrita completada em memria externa EEPROM;
Final de converso analgica;
Recepo de dados pelo canal serial (RS232);
Final de envio de dados pelo canal serial (RS232);
Overflow do TIMER0.
Estamos interessados na interrupo do TIMER0 neste captulo. Ou seja, cada vez que
ocorrer um overflow no RTCC, uma funo chamada dentro do programa, desviando-se da
funo main. Nesta funo cabe ao programador, definir o que acontecer em cada interrupo. Veremos como utilizar as interrupes nas sees subseqentes.
40 | P g i n a
Captulo 6 - Timers
6.3.
Timers do PIC16F876A
O PIC16F876A possui trs registradores de Timer diferentes. Eles so nomeados TIMER0, TIMER1 e TIMER2.
6.3.1. TIMER0
O mdulo TIMER0 apresenta as seguintes caractersticas:
Registrador de 8 bits;
Escrita/Leitura;
Seleo de clock externo ou interno.
No TIMER0 o prescaler dividido com o Watchdog. Ou seja, o prescaler s pode ser
utilizado para um dos dois.
6.3.2. TIMER1
O mdulo TIMER1 um contador/temporizador de 16 bits. Isso significa que ele pode
operar nesses dois modos distintos.
6.3.3. TIMER2
O mdulo de TIMER2 um temporizador de 8 bits com um prescaler e um postscaler.
Ele pode ser utilizado como tempo de base para um PWM.
J vimos que o prescaler divide o clock do temporizador. J o postscaler divide a sada
de overflow do temporizador. Por exemplo, se o postscaler for 2, ser necessrio que o temporizador estoure duas vezes para indicar um overflow.
6.4.
Watchdog
6.5.
Captulo 6 - Timers
Na tela de configurao dos timers, temos a opo de configurao do Watchdog Timer, TIMER0, TIMER1 e TIMER2. O PICWizard mostra que a freqncia de operao do TIMER0
ser de 2MHz (que so os 8MHz do clock externo divididos por 4).
A resoluo do timer representa o menor tempo de overflow que podemos obter com
a frequncia utilizada. Ela est diretamente ligada ao valor do preescaler.
Uma resoluo de
significa um prescaler igual a 1, uma resoluo de
representa um prescaler igual a 2, e assim por diante. Podemos ver tambm que ao selecionarmos a
resoluo desejada, o PICWizard j fornece o perodo de overflow do TIMER0.
Aps configurarmos o TIMER0, da forma representada na Figura 1, clique em OK. A seguinte funo main ser gerada pelo CCS:
Vemos que com a configurao do TIMER0, o cdigo automaticamente habilitou esse
mdulo e utilizou a funo RTCC_DIV_2 para representar um prescaler igual a 2.
42 | P g i n a
Captulo 6 - Timers
6.5.2. Configurao do Watchdog
A configurao do Watchdog bastante simples.
Na mesma tela de configurao dos timers da Figura 1 temos a configurao do WDT
(Watchdog Timer). Para habilitar o WDT, desmarque a caixa Not used, em destaque na Figura 2. Feito isso, basta selecionar o tempo de overflow do temporizador de watchdog.
43 | P g i n a
Captulo 6 - Timers
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
setup_wdt(WDT_18MS);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
}
44 | P g i n a
Captulo 6 - Timers
Aps configurar-se o Timer 0 (RTCC) da mesma forma que fizemos anteriormente, clique em OK. O WDT no precisa estar habilitado. O cdigo que ser gerado ter a seguinte
forma:
void
{
RTCC_isr(void)
}
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
}
Vemos que o programa gerou um cdigo com uma funo anterior funo main, a
funo RTCC_isr(void). Essa a funo de interrupo do RTCC, ou seja, cada vez que houver
overflow do Timer 0, essa funo ser chamada. Como foi dito anteriormente, cabe ao programador definir o que ir haver dentro dessa funo.
Lembramos que as interrupes no esto restritas ao RTCC. Qualquer um evento da
lista da Figura 3 funciona da mesma forma. Habilitando-se um daqueles eventos, ou mais de
um, o PICWizard criar uma funo para o tratamento dessa interrupo.
6.6.
setup_timer_0(modo)
setup_rtcc(modo)
Os modos podem ser uma das seguintes constantes:
45 | P g i n a
Captulo 6 - Timers
MODO
RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L
RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
FUNO
Timer 0 com clock interno
Timer 0 com clock externo sensvel borda de subida
Timer 0 com clock externo sensvel borda de descida
Preescaler igual a 2
Preescaler igual a 4
Preescaler igual a 8
Preescaler igual a 16
Preescaler igual a 32
Preescaler igual a 64
Preescaler igual a 128
Preescaler igual a 256
As constantes que configuram o preescaler podem ser unidas a constantes de configurao do timer 0 por um operador OR (|).
6.6.2. SETUP_TIMER_1()
Configura o TIMER1.
Sintaxe:
setup_timer_1(modo)
Os modos podem ser uma das seguintes constantes:
MODO
T1_DISABLED
T1_INTERNAL
T1_EXTERNAL
T1_EXTERNAL_SYNC
T1_CLOCK_OUT
T1_DIV_BY_1
T1_DIV_BY_2
T1_DIV_BY_4
T1_DIV_BY_8
FUNO
Desliga o Timer 1
Timer 1 com clock interno
Timer 1 com clock externo assncrono
Timer 1 com clock externo sncrono
Ativa a sada externa de clock
Preescaler do Timer 1 igual a 1
Preescaler do Timer 1 igual a 2
Preescaler do Timer 1 igual a 4
Preescaler do Timer 1 igual a 8
As constantes que configuram o preescaler podem ser unidas a constantes de configurao do timer 0 por um operador OR (|).
6.6.3. SETUP_TIMER_2()
Configura o TIMER2.
Sintaxe:
setup_timer_2(modo,per,ps)
Em que modo uma varivel ou constante inteira de 8 bits, per uma varivel inteira
de 8 bits, e os um nmero entre 1 e 16.
O modo pode ser uma das opes abaixo:
46 | P g i n a
Captulo 6 - Timers
MODO
T2_DISABLED
T2_DIV_BY_1
T1_DIV_BY_2
T1_DIV_BY_4
FUNO
Desliga o Timer 1
Timer 1 com clock interno
Timer 1 com clock externo assncrono
Timer 1 com clock externo sncrono
set_rtcc(valor)
set_timer_0(valor)
set_timer_1(valor)
set_timer_2(valor)
O valor a ser escrito depende do tipo de temporizador e do modelo de PIC utilizado.
Por exemplo, no timer 0 do PIC16F876A de 8 bits, o valor mximo que pode ser utilizado 256.
6.6.5. GET_TIMERX()
L o contedo de um timer interno.
Sintaxe:
Valor
Valor
Valor
Valor
=
=
=
=
get_rtcc()
get_timer_0()
get_timer_1()
get_timer_2()
setup_wdt(modo)
Em que modo uma varivel ou constante inteira de 8 bits. Os modos disponveis so:
47 | P g i n a
Captulo 6 - Timers
MODO
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS
FUNO
Prescaler ligado ao watchdog, overflow em 18ms
Prescaler ligado ao watchdog, overflow em 36ms
Prescaler ligado ao watchdog, overflow em 72ms
Prescaler ligado ao watchdog, overflow em 144ms
Prescaler ligado ao watchdog, overflow em 288ms
Prescaler ligado ao watchdog, overflow em 576ms
Prescaler ligado ao watchdog, overflow em 1152ms
Prescaler ligado ao watchdog, overflow em 2304ms
6.6.7. RESTART_WDT()
Reinicia a contagem do watchdog.
Sintaxe:
restart_wdt()
Essa funo deve ser utilizada periodicamente para resetar ou reiniciar a contagem do
watchdog, impedindo que ele provoque um reset da CPU.
6.7.
Atividade prtica
Crie um programa que funcione como um cronmetro, utilizando o timer 0 do microcontrolador. O cronmetro deve apresentar um boto de disparo e deve estar no formato
. O programa deve ser compilado e simulado no Proteus.
48 | P g i n a
Captulo 7 - PWM
7.
PWM
A modulao por largura de pulso (PWM - Pulse Width Modulation) uma tcnica
utilizada no controle de circuitos analgicos com um processador de sadas digitais. PWM
empregada em uma enorme variedade de aplicaes, desde medies e comunicaes at
controle de potncia e converso.
Fazendo o controle digital de circuitos analgicos, os custos do sistema e o consumo
de energia podem ser drasticamente reduzidos. Alm disso, muitos microcontroladores hoje
em dia incluem PWM on-chip, tornando sua utilizao muito simples.
Superficialmente, um PWM um modo de codificar digitalmente sinais analgicos. Atravs da utilizao de contadores de alta-resoluo, o duty cycle de uma onda quadrada
modulada para codificar o nvel de um sinal analgico especfico. O PWM, ainda assim, um
sinal digital, pois em um dado instante de tempo, ou a fonte DC est totalmente aplicada, ou
desligada, como ilustrado na Figura 7.1.
FONTE
PWM
CARGA
Vemos ainda, pela Figura 7.1, que o PWM apenas controla o chaveamento. O transistor TBJ poderia ser ainda qualquer tipo de chave que possa ser controlada por tenso. O duty
cycle do PWM determina a relao entre o perodo de tempo que a chave fica ligada e o perodo total da comutao. Matematicamente:
49 | P g i n a
Captulo 7 - PWM
On = Nvel Alto
Off = Nvel Baixo
DT
DT
DT
T
A Figura 7.2 mostra trs sinais PWM distintos. A primeira delas mostra um PWM com
um duty cycle de 50%, isto , em 50% do perodo T ele est em nvel lgico alto e 50% do perodo ele est em nvel lgico baixo. As outras duas formas de onda representam sinais PWM
com duty cycles de 10% e 90%, respectivamente.
O pulso da onda PWM apresenta tenso fixa, porm o valor mdio da tenso da forma
de onda varia em funo do duty cycle. A tenso mdia
aplicada uma carga diretamente proporcional ao duty cycle, e como este varia entre 0 (quando
) e 1 (quando
) temos que a tenso mdia pode variar entre 0 e
.
7.1.
PWM no PIC16F876A
Esse modelo de PIC possui dois canais de PWM, CCP1 e CCP2, cada uma deles com resoluo mxima de 10 bits. Esses canais podem tambm ser utilizados no modo comparao e
captura. Entretanto, estudaremos apenas o caso do PWM.
O duty cycle poder ser regulado de 0% a 100% com uma resoluo mxima de 1024
pontos. No entanto, dependendo da configurao adotada essa resoluo no ser atingida.
O perodo ( ) do PWM no PIC16F876A controlado diretamente pelo TIMER2. Dessa
forma, a resoluo para ajuste do perodo depende do prescaler do TIMER2. Note-se ainda que
o postscale no possui influncia nos perodos do PWM.
Vamos agora configurar o PWM utilizando-se o PICWizard.
Abra o PICWizard, e, aps realizar as configuraes usuais, na janela esquerda, clique
em Others. Na janela Others possvel configurar o PWM, conforme mostrado na Figura 7.3.
50 | P g i n a
Captulo 7 - PWM
Podemos ver na Figura 7.3 que configuramos o PWM no canal CCP1, e a freqncia do
PWM de 1KHz. Isso o mesmo que dizer que o perodo do PWM de 1us. Configuramos
tambm o ciclo de trabalho para 50%.
Podemos utilizar o PWM para realizar o chaveamento de semicondutor. Se aplicarmos
o sinal PWM na base de um transistor TBJ, por exemplo, ele funcionar como uma chave, com
freqncia de chaveamento de 1KHz. No ciclo ativo, uma corrente circular no sentido coletoremissor, alimentando a carga. Quando o sinal PWM estiver em nvel lgico baixo, o transistor
funciona como uma chave aberta, cortando a alimentao da chave. Esse circuito est ilustrado na Figura 7.4.
51 | P g i n a
Captulo 7 - PWM
Nesse exemplo, o LED est sendo alimentado com metade da potncia da fonte, pois o
duty cycle escolhido foi de 50%. Para um exemplo mais prtico, poderamos utilizar o sinal
PWM em uma chave que faz o controle de velocidade de um motor.
7.2.
FUNO
Configura o modo de gerao de sinal PWM.
7.2.2. SET_PWMX_DUTY()
Configura o ciclo ativo do mdulo CCP no modo PWM.
Sintaxe:
52 | P g i n a
Captulo 7 - PWM
set_pwm1_duty(valor)
set_pwm2_duty(valor)
Em que valor uma varivel ou constante inteira de 8 ou 16 bits.
7.3.
Atividade prtica
Crie um programa capaz de gerar um PWM com duty cycle de 0%, 25%, 50%, 75% e
100%, que dependa do nvel lgico nos pinos da porta A. O PWM deve ser usado para controlar uma chave, que alimenta uma carga puramente resistiva.
53 | P g i n a
8.
Comunicao I2C
Vamos analisar nesta seo a arquitetura de uma comunicao I2C, bem como seu
protocolo de funcionamento e um exemplo prtico de comunicao do PIC16F876A com uma
memria EEPROM.
8.1.
Arquitetura
Um barramento de comunicao I2C consiste fisicamente de 2 fios. Esses so bidirecionais: SDL (Serial Data Line) e SCL (Serial Clock Line).
Ambas as vias de comunicao so conectadas ao positivo da fonte de alimentao atravs de resistores de pull-up, com valores tpicos de 4,7 k. Isso significa que enquanto o
barramento est livre, ambas as vias, SCL e SDA, ficam em nvel lgico alto.
8.2.
Protocolo I2C
Vamos ver agora, de uma forma geral, o fluxo do protocolo de comunicao I2C.
8.2.1. Definies
Existem algumas terminologias importantes para o estudo do protocolo I2C. As principais so:
Transmissor: o dispositivo que envia dados para o barramento.
Receptor: o dispositivo que recebe dados do barramento.
Master: o dispositivo que inicia a transferncia de dados, gera o sinal de clock e encerra a transmisso.
Slave: o dispositivo endereado pelo master.
8.2.2. Validao de dados
Os dados na via SDA devem ser estveis durante um nvel lgico alto do clock. O estado alto e baixo da linha de dados s pode ser mudado quando o sinal do clock na via SCL est
em nvel lgico baixo.
8.2.3. Condies de START e STOP
54 | P g i n a
55 | P g i n a
8.3.
#USE I2C(opes)
Existem diversas opes que podem ser adicionadas diretiva. Essas opes so separadas por vrgulas. A tabela 1 mostra as principais opes temos para a diretiva, e o que cada
uma realiza.
Tabela 1 - Opes para a diretiva #USE I2C
OPO
MASTER
SLAVE
SCL=PIN_XX
SDA=PIN_XX
FAST
SLOW
FUNO
Seta o dispositivo como master da comunicao.
Seta o dispositivo como slave da comunicao.
Seta o pino XX como SCL.
Seta o pino XX como SDA.
Usa a comunicao I2C no modo rpido.
Usa a comunicao I2C no modo lento.
i2c_start()
8.3.2. I2C_STOP()
Essa funo determina o fim de uma comunicao I2C. Com essa funo, um sinal de
STOP enviado para o barramento, encerrando uma transmisso/leitura de dados. A sintaxe
para utilizao desta funo :
56 | P g i n a
i2c_stop()
8.3.3. I2C_WRITE()
Essa funo envia para o barramento um dado de 8 bits. A sintaxe para utilizao desta
funo :
i2c_write(dados)
Aps utilizada, essa funo retorna o bit de ACKNOWLEDGE.
BIT ACK
0
1
2
SIGNIFICADO
ACK
NO ACK
Coliso no modo multi-master
8.3.4. I2C_READ()
Essa funo l um byte do barramento I2C. A sintaxe para utilizao desta funo :
dados = i2c_read()
Essa funo retorna um valor inteiro de 8 bits.
8.4.
57 | P g i n a
O byte de controle consiste de 4 bits, o cdigo de controle (Control Code). Para a memria 24C02 este o conjunto 1010, para ler e escrever na memria. Os prximos 3 bits do
byte de controle so os bits de seleo de chip (A0, A1, A2). O ltimo bit do byte de controle
define qual operao ser executada. Quando este bit 1, a operao de leitura selecionada, e quando o bit 0, a operao de escrita selecionada.
O dispositivo enviar um ACK logo aps o envio do byte de controle. O prximo byte a
ser transmitido pelo master a word do endereo, e ser escrito no ponteiro de endereo da
memria 24C02. Lembramos que 1 word = 4 bytes. Aps o recebimento da word do endereo,
o dispositivo slave responde com outro sinal ACK, e d-se inicio a transmisso de dados.
58 | P g i n a
8.5.
Aplicao
Uma memria utilizada para armazenarmos dados e no sobrecarregarmos as memrias internas do microcontrolador. Por exemplo, os dados resultantes de uma converso
A/D podem ser armazenados nesta EEPROM que estamos utilizando. Vamos ver agora como
utilizamos as funes I2C do compilador CCS para armazenarmos dados na 24C02. Depois,
veremos que o CCS disponibiliza funes especficas para a utilizao com memrias EEPROM
externas.
Programa em C
#include <LCD.C>
#include <16F876A.h>
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
NOWDT
XT
NOPUT
NOPROTECT
NODEBUG
NOBROWNOUT
NOLVP
NOCPD
WRT_50%
#use delay(clock=10000000)
#define EEPROM_SCL
PIN_C3
#define EEPROM_SDA
PIN_C4
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
void main()
{
byte result;
lcd_init();
delay_ms(3);
i2c_start();
i2c_write(0xa0);
i2c_write(2);
i2c_write(80);
i2c_stop();
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
delay_ms(10);
i2c_start();
i2c_write(0xa0);
i2c_write(2);
i2c_start();
i2c_write(0xa1);
result=i2c_read();
i2c_stop();
delay_ms(3);
printf(lcd_putc, "Data: %u
ria */
while (1);
}
59 | P g i n a
init_ext_eeprom()
8.5.1.2. WRITE_EXT_EEPROM()
Essa funo escreve na memria EEPROM um valor desejado. A sua sintaxe :
write_ext_eeprom(a, d)
60 | P g i n a
write_ext_eeprom(0x0,0x12);
Nesse exemplo, o valor 0x12 ser escrito no endereo 0 de memria.
8.5.1.3. READ_EXT_EEPROM()
Esse comando l um valor da memria EEPROM. Sua sintaxe :
d = read_ext_eeprom(a)
Esse comando ler o endereo a da memria, o byte lido ser atribudo varivel d. Por exemplo, podemos ter:
value=read_eeprom(0x0)
Nesse exemplo, o endereo 0 da memria ser lido, e o valor 0x12 ser atribudo varivel value.
8.5.1.4. EXT_EEPROM_READY()
Esse comando retorna true se a memria estiver pronta para receber opcodes. Sua sintaxe :
b = ext_eeprom_ready()
Lembramos que esses comandos s funcionam para os drivers que esto disponveis
na biblioteca do compilador CCS. Para verificar os drivers disponveis, entre na pasta onde foi
instalado o CCS, e procure pela pasta drivers.
Utilizando essas funes poderamos utilizar o programa anterior da seguinte forma:
61 | P g i n a
#include <LCD.C>
#include <16F876A.h>
#include <2402.C>
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
#FUSES
NOWDT
HS
NOPUT
NOPROTECT
NODEBUG
NOBROWNOUT
NOLVP
NOCPD
WRT_50%
#use delay(clock=10000000)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
void main()
{
BYTE result=0;
lcd_init();
init_ext_eeprom();
delay_ms(10);
write_ext_eeprom(2, 50);
delay_ms(20);
result = read_ext_eeprom(2);
delay_ms(3);
printf(lcd_putc, "data: %u
na memria */
while (1);
}
8.6.
",result);
Aplicao 2
Utilizando a comunicao I2C, armazene os dados medidos pelo termmetro projetado no captulo de converso A/D em uma memria EEPROM.
62 | P g i n a
Anexo
63 | P g i n a
Anexo
64 | P g i n a
Anexo
65 | P g i n a
Anexo
66 | P g i n a