Buscar

UFPI-Digitais-II_8-Programacao_do_PIC-v1_0

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 96 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 96 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 96 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Universidade Federal do Piauí
Centro de Tecnologia
Departamento de Engenharia Elétrica
CIRCUITOS DIGITAIS II
Prof. Marcos Zurita
zurita@ufpi.edu.br
www.ufpi.br/zurita
Teresina - 2011
 Programação do PIC
2
Circuitos Digitais II – Prof. Marcos Zurita
Sumário
● 1. Comandos de Saída no CCS C
● 2. Comandos de Entrada no CCS C
● 3. Display de 7 Segmentos
● 4. Módulos LCD
● 5. Conversor A/D Interno
● 6. Temporizadores
● 7. Interrupções
3
Circuitos Digitais II – Prof. Marcos Zurita
 
1. Comandos de Saída no CCS C
4
Circuitos Digitais II – Prof. Marcos Zurita
Comandos de Saída no CCS C
● set_tris_X()
● output_bit()
● output_low()
● output_high()
● output_float()
● output_X()
Comandos de Saída no CCS C
5
Circuitos Digitais II – Prof. Marcos Zurita
set_tris_X(config)
● Configura os pinos da porta X como entrada ou saída:
● Bit = 1: entrada (1 lembra I de “input”).
● Bit = 0: saída (0 lembra O de “output”).
Ex:
Comandos de Saída no CCS C
set_tris_b(0b00000111); 
/* configura os pinos da porta B:
 b0 a b2 como entradas
 b3 a b7 como saídas */
6
Circuitos Digitais II – Prof. Marcos Zurita
output_bit(pino, estado)
● Coloca o pino indicado em nível lógico alto ou baixo, 
conforme o estado especificado.
● Caso a direção do pino não esteja configurada como 
saída, ela é alterada automaticamente antes da 
atribuição.
Ex:
Comandos de Saída no CCS C
output_bit(pin_a2,1); // coloca o pino A2 em nível 1
output_bit(pin_a2,0); // coloca o pino A2 em nível 0
7
Circuitos Digitais II – Prof. Marcos Zurita
output_low(pino)
● Coloca o pino indicado em nível lógico baixo (idem a 
output_bit(pino,0)).
● Caso a direção do pino não esteja configurada como 
saída, ela é alterada automaticamente antes da 
atribuição.
Ex:
Comandos de Saída no CCS C
#define LED pin_a0
output_low(pin_b7); // coloca o pino B7 em nível 0
output_low(LED); // coloca o pino A0 em nível 0
8
Circuitos Digitais II – Prof. Marcos Zurita
output_high(pino)
● Coloca o pino indicado em nível lógico alto (idem a 
output_bit(pino,1)).
● Caso a direção do pino não esteja configurada como 
saída, ela é alterada automaticamente antes da 
atribuição.
Ex:
Comandos de Saída no CCS C
#define OUTRO_LED pin_c1
output_high(pin_d0); // coloca o pino D0 em nível 1
output_high(OUTRO_LED);// coloca o pino C1 em nível 1
9
Circuitos Digitais II – Prof. Marcos Zurita
output_float(pino)
● Coloca o pino indicado em tri-state (como entrada).
● Quando um pino não está sendo utilizado ou está 
desconectado, é conveniente deixa-lo em 3-state para 
economizar energia.
● Ex.:
Comandos de Saída no CCS C
output_float(pin_c7); // coloca o pino C7 em 3-state 
10
Circuitos Digitais II – Prof. Marcos Zurita
output_X(valor)
● Coloca um byte inteiro na saída da porta X.
● Caso a direção da porta não esteja configurada como 
saída, ela é alterada automaticamente antes da 
atribuição.
Ex:
Comandos de Saída no CCS C
output_b(0x0F);
/* Toda a porta B é colocada como saída 
 Os pinos B0 a B3 em nível alto;
 Os pinos B4 a B7 em nível baixo. */
11
Circuitos Digitais II – Prof. Marcos Zurita
Comandos de Saída no CCS C
● Ex. 1: Semáforo de 3 Tempos
● Escreva um programa para controlar um semáforo de 
3 tempos cujo circuito é representado abaixo.
● O tempo de cada 
estado deve ser:
● VD: 5 s
● AM: 2 s
● VM: 4 s
● Funcionamento 
ininterrupto.
● XTAL = 4MHz.
12
Circuitos Digitais II – Prof. Marcos Zurita
Comandos de Saída no CCS C
● Porta B:
● pinos ligados aos LEDs devem ser configurados como 
pinos de saída;
● demais pinos devem ser configurados como entrada;
● Portas A, C, D e E:
● todos os pinos devem ser configurados como tri-state.
● Escolha corretamente as instruções de mudança de 
estado dos pinos para assegurar que os demais não 
terão suas direções (E/S) iniciais alteradas.
● Utilize a função delay_ms() para ajustar os tempos.
● Modele o circuito e simule o programa .
● Se simulação correr bem, implemente-o na plataforma 
de prototipagem.
13
Circuitos Digitais II – Prof. Marcos Zurita
 
2. Comandos de Entrada no CCS C
14
Circuitos Digitais II – Prof. Marcos Zurita
Comandos de Entrada no CCS C
● int input()
● int input_X()
Comandos de Entrada no CCS C
15
Circuitos Digitais II – Prof. Marcos Zurita
int input(pino)
● Retorna o estado do pino indicado.
 Ex.:
Comandos de Entrada no CCS C
tecla = input(pin_d2);
/* lê o nível lógico do pino d2 e copia para a 
 Variável “tecla”. */
16
Circuitos Digitais II – Prof. Marcos Zurita
int input_X()
● Retorna um byte contendo o valor lido da porta 
indicada.
 Ex: 
Comandos de Entrada no CCS C
dado8bits = input_b(pin_d2);
// lê a porta B e guarda na variável “dado”. 
17
Circuitos Digitais II – Prof. Marcos Zurita
Comandos de Entrada no CCS C
● Ex. 2: Semáforo de 3 Tempos Comandado
● Altere o projeto do semáforo de modo que ele só saia 
do verde 5 segundos após a solicitação de passagem 
de um pedestre, por
meio de um botão.
● A solicitação só 
deve ser aceita 
após o botão ser 
liberado.
● Voltando para o
“verde” o semáforo 
volta a aguardar 
nova solicitação.
● XTAL = 4MHz.
18
Circuitos Digitais II – Prof. Marcos Zurita
 
3. Display de 7 Segmentos
19
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
Display de 7 Segmentos
● Como cada segmento é um LED, os 
mesmos cuidados tomados com a 
limitação de corrente em LEDs comuns 
devem ser tomados.
● Composto por 7 (ou 8) LEDs conectados 
em Catodo Comum ou em Anodo Comum.
● Pode ser acionado diretamente pelo 
microcontrolador ou através de um 
decodificador BCD para 7 segmentos.
20
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
Ativação Direta
●  Requer 7 pinos do uC (8 se o ponto for usado).
●  Não requer componentes intermediários (salvo os 
resistores de limitação de corrente).
●  Permite gerar outros caracteres além dos dígitos.
21
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
Representação do Alfabeto em 7 Segmentos
a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
22
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
Ativação Via Decodificador BCD
●  Requer 4 pinos do uC (5 se o ponto for usado).
●  Requer um componente adicional: Dec BCD->7 segm.
●  Permite gerar apenas os dígitos de 0 a 9 (para maioria 
dos decodificadores comerciais).
23
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
Multiplexação de Displays
● Em aplicações que requerem mais de um display, a 
quantidade de pinos de I/O necessária para comandar 
diretamente todos eles pode tornar-se inviável.
● A solução mais comum para este problema é comanda-
los de forma multiplexada, isto é, ativando um a um 
alternadamente em alta velocidade.
● Desvantagens:
● É necessário o refresh contínuo dos displays, mesmo não 
havendo alteração no valor mostrado.
● Quanto maior o número de displays multiplexados, maior 
será o tempo que cada um passará desligado e conse-
quentemente, menor será seu brilho aparente.
● Aumento da complexidade do sistema. 23
24
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
● Ex.: Multiplexação de 4 displays.
25
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
● Ex. 3: Voltímetro True-RMS 
● Um voltímetro True-RMS baseado em um 
microcontrolador está sendo projetado. O valor da 
tensão lida deve ser apresentado através de 4 displaysde 7 segmentos, sendo o ponto decimal deslocado 
automaticamente pelo uC, conforme a faixa de tensão 
lida.
● → Proponha um circuito capaz de acionar os 4 displays 
e seus respectivos pontos, utilizando uma única porta de 
8 bits do uC.
26
Circuitos Digitais II – Prof. Marcos Zurita
Display de 7 segmentos
● Ex. 4: Cronômetro
● Escreva um programa para cronometrar o tempo em 
décimos de segundos decorrido após o reset.
27
Circuitos Digitais II – Prof. Marcos Zurita
Comandos de Saída no CCS C
● O programa deve conter uma sub-rotina dedicada 
apenas a apresentar nos displays o valor passado para 
ela como argumento.
● A contagem deve reiniciar automaticamente quando o 
tempo atingir “FFFF”.
● Modele o circuito e simule o programa .
● Se simulação correr bem, implemente-o na plataforma 
de prototipagem.
28
Circuitos Digitais II – Prof. Marcos Zurita
 
4. Módulos LCD
29
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Os Módulos de Display LCD
● Em sistemas embarcados é comum a necessidade de 
interação do sistema com o usuário.
● Quando o volume de informações visuais a serem 
entregues cresce, o uso de LEDs indicadores ou 
displays de 7 segmentos pode tornar-se inadequado ou 
mesmo inviável.
● A solução mais simples 
para esse problema é 
adoção de módulos LCD 
como interface de exibição.
30
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
● Módulos de display LCD são padronizados, isto é, 
possuem uma interface comum e obedecem ao mesmo 
protocolo de comunicação, independente da resolução.
● Entre os mais populares estão os Módulos de display 
LCD alfanuméricos, baseados no HD44780 da Hitachi.
● Resoluções comerciais: 8x1 a 40x4 (caracteres x linhas).
31
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Características dos Módulos LCD Baseados no HD44780
● Capacidade de exibição de carac-
teres alfanuméricos, pontuação, 
símbolos matemáticos, letras 
gregas e caracteres kana;
● Capacidade de exibição de carac-
teres customizados;
● Recursos de deslocamento automático de mensagens 
(para a direita e para a esquerda);
● Exibição opcional do cursor;
● Retenção automática do conteúdo (não requer refresh);
● Interfaceamento através de 6 a 11 pinos;
● Baixo custo.
32
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Módulos de Display LCD: Algumas Resoluções
33
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Módulos de Display LCD: Cores
34
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
A Tela do Módulo LCD
● Cada caractere é formado por 
uma matriz de 5x8 ou 5x11 
pixels.
● Um módulo 16x2 pode conter 
duas linhas de 16 caracteres 
cada.
● O ajuste de contraste é 
dado pela tensão no pino 
3 (0 a 5V) e pode ser feito 
simplesmente através de 
um trim-pot.
35
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Módulos de Display LCD: Pinagem
PINO NOME FUNÇÂO
1 Vss Terra (GND)
2 Vdd Vcc (5V)
3 Vee Contraste (0 a 5V)
4 RS Register Select
5 R/W Read / Write
6 E Enable
7 D0 Data bit 0
8 D1 Data bit 1
9 D2 Data bit 2
10 D3 Data bit 3
11 D4 Data bit 4
12 D5 Data bit 5
13 D6 Data bit 6
14 D7 Data bit 7
36
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Memórias Internas
● Internamente o Módulo LCD contém 3 blocos de 
memória:
● DDRAM (Display Data RAM) – “RAM de Dados 
Mostrados”.
● CGRAM (Caracter Generator RAM) – “RAM do Gerador 
de Caracteres”.
● CGROM (Caracter Generator ROM) - “ROM do Gerador 
de Caracteres”.
37
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
A Memória DDRAM
● Armazena os caracteres que serão exibidos na tela.
● Tem capacidade para armazenar até 80 caracteres;
● Sua operação é bastante simples: caracteres enviados 
ao módulo são armazenados em posições consecutivas 
da memória (endereço incrementado automaticamente).
● A tela exibirá os caracteres contidos dentro da “janela de 
visualização, cuja posição relativa pode ser movida para 
a direita ou para a esquerda, criando o efeito de shifting.
38
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
A Memória CGROM
● Contém o mapa de todos os caracteres padrão que 
podem ser exibidos na tela.
● Cada caractere está associado a uma posição de 
memória
39
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
● Os primeiros 128 
caracteres da 
CGROM são 
mapeados de 
forma que seus 
códigos corres-
pondam aos da 
Tabela ASCII:
● Ex.: se o caractere 
65 ('A') é enviado 
ao módulo ele 
exibirá a letra 'A'.
40
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
A Memória CGRAM
● Armazena caracteres 
customizados pelo 
usuário.
● Pode conter até 8 
caracteres de 5x8 
pixels.
● Cada símbolo é gerado 
a partir de 8 registros de 
8 bits (apenas os bits 0 
a 4 são usados).
41
Circuitos Digitais II – Prof. Marcos Zurita
Interfacemento LCD - PIC
● Pode ser feito através da biblioteca “lcd.c” do diretório 
picc\drivers, para módulos compatíveis com o 
HD44780.
● Interfaceamento no modo de 4 bits.
● Opera de modo transparente ao usuário através da 
função “printf()”.
Módulos LCD
42
Circuitos Digitais II – Prof. Marcos Zurita
A Biblioteca “lcd.c”
● Utiliza os bits b0 a b2 e b4 a b7 da porta D ou B (default 
porta D)
● Para empregar a porta B deve-se retirar o comentário 
da instrução da linha 39 do arquivo “lcd.c”:
 #define use_portb_lcd TRUE
Módulos LCD
43
Circuitos Digitais II – Prof. Marcos Zurita
Conexão Entre o LCD e o PIC
+5V
D
7
D
6
D
5
D
4
D
3
D
2
D
1
D
0
R
/W
R
S
E
LCD
R
D
7
R
D
6
R
D
5
R
D
4
R
D
3
 R
D
2
R
D
1
R
D
0
Vdd
Vee
Vss
5KΩ
PIC
Módulos LCD
44
Circuitos Digitais II – Prof. Marcos Zurita
Interfacemento Com LCD
● Principais rotinas da biblioteca “lcd.c”
● void lcd_init()
● void lcd_gotoxy(byte x, byte y)
● void lcd_putc(char c)
● char lcd_getc(byte x, byte y)
● byte lcd_read_byte()
● void lcd_send_byte(byte address, byte n)
Módulos LCD
45
Circuitos Digitais II – Prof. Marcos Zurita
A Rotina “lcd_init()”
● Inicializa o LCD
● Configura como LCD de 2 linhas (default);
● Seta o modo de operação em 4 bits;
● Seleciona cursor simples;
● Limpa a tela;
● Posiciona o cursor na posição (0,0).
● Após a inicialização o LCD está pronto para receber 
caracteres.
Módulos LCD
46
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Rotina “lcd_gotoxy(byte x, byte y)”
● Posiciona o cursor de escrita na coluna “x”, linha “y” 
da tela.
Rotina “lcd_putc(char c)”
● Imprime um ou mais caracteres na tela.
Rotina “lcd_getc(byte x, byte y)” 
● Retorna o caractere localizado na coluna “x”, linha “y”. 
É necessário que o pino “R/W” esteja conectado ao 
PIC para poder utiliza-la.
47
Circuitos Digitais II – Prof. Marcos Zurita
Rotina “lcd_read_byte()”
● Lê o último byte enviado ao LCD. É necessário que o 
pino “R/W” esteja conectado ao PIC.
Rotina “lcd_send_byte(byte address, byte n)”
● Envia um byte de controle (address = 0) ou de 
caractere (address = 1) ao LCD.
Módulos LCD
48
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
Palavras de Controle do LCD
49
Circuitos Digitais II – Prof. Marcos Zurita
Interfaceamento com o LCD
● Incluir a biblioteca “lcd.c”
● Inicializar o LCD com “lcd_init()”
Módulos LCD
#include <lcd.c> // biblioteca de suporte ao LCD
void main()
{
 // instruções de inicialização do PIC
 int coisa = 12;
 lcd_init(); // inicializa o módulo LCD
 lcd_putc(”Teste LCD\n”);
 printf(lcd_putc,”Time: %U s”, coisa);
}
50
Circuitos Digitais II – Prof. MarcosZurita
Módulos LCD
● Ex. 5: Cronômetro LCD
● Reescreva o programa do cronômetro para exibir o 
tempo em um módulo LCD de 16x2 caracteres.
51
Circuitos Digitais II – Prof. Marcos Zurita
Módulos LCD
● A contagem deve reiniciar automaticamente quando o 
tempo atingir “FFFF”.
● Modele o circuito e simule o programa .
● Se simulação correr bem, implemente-o na plataforma 
de prototipagem.
52
Circuitos Digitais II – Prof. Marcos Zurita
 
5. Conversor A/D Interno
53
Circuitos Digitais II – Prof. Marcos Zurita
Conversor A/D Interno
● Conversor por aproximação sucessiva;
● Resolução máxima de 10 bits;
● Múltiplas entradas multiplexadas;
● Clock configurável;
● Impedância máxima da fonte: 10KΩ.
● Tempo de aquisição: de 10 a 20 µs.
Conversor A/D Interno
54
Circuitos Digitais II – Prof. Marcos Zurita
Comandos Básicos Para Conversão A/D
● Diretiva #device adc=10
● O comando setup_adc_ports(xxx)
● Configura as portas do AD
● xxx pode assumir valores como
● ALL_ANALOG
● NO_ANALOG
● RA0_RA1_RA3_ANALOG
● RA0_RA1_ANALOGRA3_REF
● Configurações possíveis de “xxx” definidos na 
biblioteca do dispositivo (“16F877A.h”, neste caso).
Conversor A/D Interno
55
Circuitos Digitais II – Prof. Marcos Zurita
Conversor A/D Interno
Possíveis Configurações do ADC no PIC16F877
MODO AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref-
ALL_ANALOG A A A A A A A A VDD VSS
ANALOG_RA3_REF A A A A Vref+ A A A AN3 VSS
A_ANALOG D D D A A A A A VDD VSS
A_ANALOG_RA3_REF D D D A Vref+ A A A AN3 VSS
RA0_RA1_RA3_ANALOG D D D D A D A A VDD VSS
RA0_RA1_ANALOG_RA3_REF D D D D Vref+ D A A AN3 Vss
NO_ANALOGS D D D D D D D D --- ---
ANALOG_RA3_RA2_REF A A A A Vref+ Vref- A A AN3 AN2
ANALOG_NOT_RE1_RE2 D D A A A A A A VDD VSS
ANALOG_NOT_RE1_RE2_REF_RA3 D D A A Vref+ Vref- A A AN3 VSS
ANALOG_NOT_RE1_RE2_REF_RA3_RA2 D D A A Vref+ Vref- A A AN3 AN2
A_ANALOG_RA3_RA2_REF D D D A Vref+ Vref- A A AN3 AN2
RA0_RA1_ANALOG_RA3_RA2_REF D D D D Vref+ Vref- A A AN3 AN2
RA0_ANALOG D D D D D D D A VDD VSS
RA0_ANALOG_RA3_RA2_REF D D D D Vref+ Vref- D A AN3 AN2
A=Entrada Analógica D=Entrada/Saída Digital
56
Circuitos Digitais II – Prof. Marcos Zurita
O Comando “setup_adc(mode)”
● Configura se o modo de operação do conversor.
● O modo de operação resume-se a habilitação ou não 
do ADC e, em caso positivo, sua frequência de 
operação.
● Por exemplo, “mode” pode assumir valores como:
● ADC_OFF
● ADC_CLOCK_INTERNAL
● ADC_CLOCK_DIV_32
● Valores de “mode” definidos na biblioteca do 
dispositivo (“16F877A.h”, neste caso).
Conversor A/D Interno
57
Circuitos Digitais II – Prof. Marcos Zurita
set_adc_channel(channel)
● Seleciona o canal do A/D em que serão feita as 
próximas leituras.
● Para um conversor de 8 canais pode assumir valores 
de 0 a 7.
read_adc()
● Colhe uma amostra analógica no canal selecionado.
● O valor da amostra deve estar entre 0 e Vref Volts 
(normalmente Vref = 5V).
Conversor A/D Interno
58
Circuitos Digitais II – Prof. Marcos Zurita
Exemplo de código para aquisição no canal 6:
Conversor A/D Interno
#device adc=10 // conversor de 10bits
void main()
{
 int16 tensao;
 // instruções de configuração do PIC...
 setup_ADC_ports(ALL_ANALOG); // Toda porta A como
 // entradas analógicas
 setup_adc(ADC_CLOCK_INTERNAL); // ADC com clock interno
 set_adc_channel(6); // Seleciona o canal 6
 tensao = read_adc(); // Faz uma aquisição
}
59
Circuitos Digitais II – Prof. Marcos Zurita
Conversor A/D Interno
● Ex. 6: Voltímetro
● Escreva um programa exibir a tensão (0 a 5V) lida no 
canal 1 do A/D em um LCD de 16x2 caracteres.
60
Circuitos Digitais II – Prof. Marcos Zurita
Conversor A/D Interno
● O conversor A/D deverá operar no modo 10 bits.
● Utilize VDD como Vref+ e VSS como Vref-
● A precisão da leitura deve ser informada na primeira 
linha do LCD (p/ ex.: “Tensão +/- 8 mV:”);
● A tensão deve ser exibida com 3 casas decimais de 
precisão na segunda linha do LCD.
● Modele o circuito e simule o programa .
● Se simulação correr bem, implemente-o na plataforma 
de prototipagem.
61
Circuitos Digitais II – Prof. Marcos Zurita
Conversor A/D Interno
● Ex. 7: Termômetro Digital
● Reescreva o código do exemplo anterior para que ele 
apresente também a temperatura dada por um sensor.
62
Circuitos Digitais II – Prof. Marcos Zurita
Conversor A/D Interno
● Sensor de temperatura utilizado: LM35.
● Saída: 0mV + 10mv/°C.
● O conversor A/D deverá operar no modo 10 bits.
● Utilize VDD como Vref+ e VSS como Vref-
● A temperatura deve ser informada na primeira linha do 
LCD (p/ ex.: “Temp.: 026.5°C”);
● A tensão deve ser exibida com 3 casas decimais de 
precisão na segunda linha do LCD.
● Modele o circuito e simule o programa .
● Se simulação correr bem, implemente-o na plataforma 
de prototipagem.
63
Circuitos Digitais II – Prof. Marcos Zurita
 
6. Temporizadores
(Timers)
64
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Temporizadores (Timers)
● São circuitos destinados a contagem do tempo.
65
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
● Temporizadores digitais podem ser implementados 
simplesmente através de um contador cujo incremento 
(ou decremento) é comandado por uma fonte de clock 
de frequência precisa e conhecida.
● Considere um contador de 3 
bits incrementado por um clock 
de 1kHz:
● Um incremento será feito a 
cada 1ms.
● Um “estouro” do contador 
ocorrerá a cada 8ms.
● O sistema comporta-se como 
um temporizador capaz de 
“contar” intervalos de 8ms.
0
4
6 2
7
35
1
Início
1 ms
1 ms
1 ms
1 ms1 ms
1 ms
1 ms
1 ms
66
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
● A detecção de tempo decorrido é feita através da 
detecção do estouro do contador, isto é, toda vez que, 
após atingir o valor máximo, um incremento provoca a 
transição para o valor zero, reiniciando a contagem.
● Dois parâmetros de um timer são notáveis neste ponto:
● Resolução: é intervalo de tempo entre cada incremento, 
sendo dependente do clock de entrada do temporizador. 
Para este exemplo a resolução é de 1ms.
● Período de Estouro: (overflow period) é o intervalo entre 
dois estouros consecutivos do temporizador. Depende da 
resolução e do número de incrementos entre um estouro o 
o valor máximo do contador. Para este exemplo vale 8ms.
● Tamanho: é o número de bits do contador associado ao 
temporizador. Neste exemplo o temporizador é de 3 bits.
67
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Reduzindo o Período de Estouro
● Reduzindo-se o número de estados da máquina é 
possível contar intervalos de tempo menores.
● Isto pode ser obtido por meio de desvios na sequência 
de contagem.
● Desvios podem ser síncronos 
(consumindo um ciclo de clock) 
ou assíncronos (ocorrendo tão 
logo o estado “proibido” seja 
detectado).
0
4
6 2
7
35
1
Início
1 ms
1 ms
1 ms
1 ms1 ms
1 ms
1 ms
1 ms
0 ou 1 ms
68
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
● Uma forma de tornar o número de estados configurável 
é comparar o estado atual da máquina a um valor 
informado e reinicia-la caso este valor seja alcançado.
● Tal solução é comumente adotada por requerer apenas 
um comparador binário de
mesma dimensão (em bits)
do temporizador.
● Para o exemplo adotado, o 
período de estouro poderia 
ser reduzido para 5 ms 
configurando-se o compara-
dor para reiniciar após o 
estado “4”.
0
4
6 2
7
35
1
Início
1 ms
1 ms
1 ms
1 ms1 ms
1 ms
1 ms
1 ms
CMP &
RESET
1 ms
69
Circuitos DigitaisII – Prof. Marcos Zurita
Temporizadores
Aumentando o Período de Estouro
● Desde que o número máximo de estados da máquina é 
fixado pelo contador, o período de estouro do 
temporizador pode ser aumentado de três formas:
● Via Prescaler: O prescaler ou “pré-escalonador” nada 
mais é que um divisor de clock configurável capaz de 
dividir o clock de alimentação do temporizador.
● Para o exemplo dado, se um prescaler de 2:1 fosse usado, 
o período de estouro do timer passaria de 8 para 16ms.
● Via Postscaler: O postscaler ou “pós-escalonador” pode 
ser visto como um “divisor de estouros”. Ele conta um 
determinado número de estouros do contador antes de 
sinalizar um “estouro” em sua saída;
● Uso conjunto do Prescaler + Postscaler.
70
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Temporizadores no PIC16F877A
● O PIC16F877A possui três temporizadores 
independentes:
● Timer 0; 
● Timer 1;
● Timer 2.
● Cada temporizador possui características e recursos 
diferentes, embora sejam baseados nos mesmos 
princípios anteriormente expostos.
71
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Timer 0
● Possui uma vasta gama de aplicações. Pode ser 
programado para gerar pulsos de duração arbitrária, 
medir o tempo ou contar pulsos externos.
● Suas características são:
● Tamanho: 8 bits;
● Prescaler: 8 bits;
● Postscaler: não possui;
● Fonte de clock selecionável: 
● Interna: RTCC (fosc/4);
● Externa: Pino RA4/T0CK.
● Clock externo com borda de detecção selecionável;
● Interrupção associada ao estouro do contador.
72
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Diagrama Interno do Timer0
73
Circuitos Digitais II – Prof. Marcos Zurita
Instruções de Manipulação de Timers
● setup_timer_X()
● set_timerX()
● get_timerX()
● setup_rtcc()
● setup_counter()
Temporizadores
74
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Configurando o Timer0
 setup_timer_0(ConstGrupo1 | ConstGrupo2)
● Configura o clock e prescaler do Timer0
Constantes do Grupo 2
RTCC_DIV_1 Clock do Timer0 = RTCC (fosc/4) 
RTCC_DIV_2 Clock do Timer0 = RTCC/2 (fosc/8) 
RTCC_DIV_4 Clock do Timer0 = RTCC/4 (fosc/16) 
RTCC_DIV_8 Clock do Timer0 = RTCC/8 (fosc/32) 
RTCC_DIV_16 Clock do Timer0 = RTCC/16 (fosc/64) 
RTCC_DIV_32 Clock do Timer0 = RTCC/32 (fosc/128) 
RTCC_DIV_64 Clock do Timer0 = RTCC/64 (fosc/256) 
RTCC_DIV_128 Clock do Timer0 = RTCC/128 (fosc/512) 
RTCC_DIV_256 Clock do Timer0 = RTCC/256 (fosc/1024) 
Constantes do Grupo 1
RTCC_INTERNAL Seleciona o RTCC (fosc/4) como o clock do Timer0
RTCC_EXT_L_TO_H Seleciona a borda de subida no pino RA4 como clock do Timer0
RTCC_EXT_H_TO_L Seleciona a borda de descida no pino RA4 como clock do Timer0
75
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Lendo e Escrevendo o Contador do Timer0
● O valor do contador vinculado ao Timer0 pode ser lido 
ou mesmo reescrito a qualquer momento através das 
instruções:
● get_timer0()
● set_timer0()
get_timer0()
● Retorna o valor atual do contador do timer0 (8 bits), 
permitindo-se medir o tempo passado desde o último 
estouro.
set_timer0(valor)
● Altera o valor atual do contador do timer0 para o “valor” 
informado, permitindo-se corrigir o tempo ou mesmo 
aumentar a frequência de estouro.
76
Circuitos Digitais II – Prof. Marcos Zurita
Exemplo de código de utilizando o Timer0:
Temporizadores
#use delay(clock=4000000) // oscilador de 4MHz 
//(...) diretivas e inclusão da biblioteca do LCD
int16 t1, t2, x;
void main() {
 // (...) instruções de configuração do PIC
 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64);
 // Clock do Timer0 vinculado ao RTCC
 // A frequência de incremento será:
 // f_inc = (4MHz/4)/64 = 15.625 kHz
 t1 = get_timer0();
 lcd_init();
 for (x=0; x<10000; x++) {} // gasta tempo
 t2 = get_timer0();
 printf(lcd_putc, “deltaT = %Lu us”, (t2-t1)*64);
 while (1) {} // espera alguém desligar o PIC...
}
77
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Timer 1
● Possui um contador 2 vezes maior que o do Timer0 e 
pode ser associado a um oscilador próprio.
● Suas características são:
● Tamanho: 16 bits;
● Prescaler: 3 bits;
● Postscaler: não possui;
● Fonte de clock selecionável: 
● Interna: (fosc/4);
● Externa: Pino RC0/T1CKI (borda de subida).
● Externa via oscilador dedicado: até 200 kHz
● Operação síncrona ou assíncrona (via RC0/T1CKI).
● Interrupção associada ao estouro do contador.
78
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Diagrama Interno do Timer1
79
Circuitos Digitais II – Prof. Marcos Zurita
Configurando o Timer1
 setup_timer_1(ConstGrupo1 | OSC | ConstGrupo2)
● Configura o clock e prescaler do Timer1
Constantes do Grupo 1
T1_DISABLED Timer1 desabilitado
T1_INTERNAL Timer1 habilitado com clock de entrada interno (CLK1 = fosc/4) 
T1_EXTERNAL Clock de entrada externo via pino T1CK1 (borda de subida) 
T1_EXTERNAL_SYNC Clock de entrada externo e sincronizado via pino T1CK1 (bd. subida) 
Temporizadores
Constantes do Grupo 2
T1_DIV_1 Clock do Timer1 = CLK1
T1_DIV_2 Clock do Timer1 = CLK1 / 2
T1_DIV_4 Clock do Timer1 = CLK1 / 4
T1_DIV_8 Clock do Timer1 = CLK1 / 8
OSC
T1_CLOCK_OUT Habilita o oscilador entre os pinos T1OSO e T1OSI p/ clock externo
80
Circuitos Digitais II – Prof. Marcos Zurita
Exemplo de código de utilizando o Timer1:
Temporizadores
//(...) diretivas e inclusão da biblioteca do LCD 
int16 p, x;
void main() {
 // (...) instruções de configuração do PIC
 setup_timer_1(T1_EXTERNAL | T1_DIV_BY1);
 // Clock do Timer0 vinculado ao pino RC0/T1OSI
 lcd_init();
 for (x=0; x<10000; x++) {} // gasta tempo
 p = get_timer1(); // o contador indicará quantos
 // pulsos ocorreram no pino T1OSI
 // desde a inicialização do o PIC
 printf(lcd_putc, “pulsos = %Lu”, p);
 while (1) {} // espera alguém desligar o PIC...
}
81
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Timer 2
● É o único temporizador do PIC16F877A que possui um 
prescaler, um postscaler e um comparador .
● Suas características são:
● Tamanho: 8 bits;
● Prescaler: 4 bits;
● Postscaler: 4 bits;
● Período de estouro do contador ajustável via comparador 
binário integrado, permitindo que o estouro ocorra até na 
mesma frequência do clock interno (fosc/4)
● Interrupção associada ao estouro do contador.
82
Circuitos Digitais II – Prof. Marcos Zurita
Temporizadores
Diagrama Interno do Timer2
83
Circuitos Digitais II – Prof. Marcos Zurita
Configurando o Timer2
 setup_timer_2(modo, periodo, postscaler)
● Configura o período, prescaler e postscaler do Timer2.
● período: (0 a 255) – determina o período de contagem 
(número de incrementos entre dois estouros).
● postscaler: (1 a 16) – determina o número de estouros 
do contador necessários para gerar uma interrupção.
● modo: habilita o Timer2 e configura o prescaler 
conforme a tabela abaixo:
Temporizadores
Constantes Possíveis para “modo”
T2_DISABLED Timer2 desabilitado
T2_DIV_1 Clock do Timer2 = fosc/4
T2_DIV_4 Clock do Timer2 = (fosc/4) / 4
T2_DIV_16 Clock do Timer2 = (fosc/4) / 16
84
Circuitos Digitais II – Prof. Marcos Zurita
Exemplo de código de utilizando o Timer2:
Temporizadores
#use delay(clock=10000000) // oscilador de 10MHz 
//(...) diretivas e inclusão da biblioteca do LCD 
void main() {
 // (...) instruções de configuração do PIC
 setup_timer_2(T2_DIV_BY_1, 124, 1);
 // Um estouro do Timer2 ocorrerá a cada 50 us
 // (...) código 
}
85
Circuitos Digitais II – Prof. Marcos Zurita
 
7. Interrupções
86
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
● São rotinas executadas emfunção de algum evento. Ex:
● Mudança de estado de um pino (hardware);
● Estouro de um timer (software);
● Fim de conversão A/D (software);
● Fim de escrita na EEPROM (software).
● Desviam a execução do programa “interrompendo” sua 
sequência normal.
● Quando o evento que dispara a interrupção ocorre, a 
execução do programa é paralisada e a rotina de 
tratamento da interrupção é executada.
Interrupções
87
Circuitos Digitais II – Prof. Marcos Zurita
ISR
● ISR (Interrupt Service Routine), é o nome dado à rotina 
responsável pelo tratamento de uma interrupção.
● O tempo consumido pela execução de uma ISR deve 
ser tão curto quanto possível.
● Uma ISR “pesada” pode tornar a execução do restante 
do programa muito lenta, ou mesmo travar o 
microcontrolador (quando a interrupção ocorre mais 
rapidamente do que a execução da ISR).
● Uma vez que a ISR será executada isoladamente em 
função de um evento, a mesma não deve retornar 
nenhum valor nem tampouco receber argumentos.
Interrupções
88
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
Interrupções Existentes no PIC16F877A
ID da Interrupção Descrição
INT_TIMER0 Gerada no estouro do contador do Timer0
INT_TIMER1 Gerada no estouro do contador do Timer1
INT_TIMER2 Gerada no estouro do contador do Timer2
INT_RTCC Idem a INT_TIMER0 (trata-se apenas de um sinônimo para INT_TIMER0)
INT_AD Gerada ao final da conversão A/D
INT_EXT Gerada pela transição de subida (ou de descida) do sinal no pino RB0/INT 
INT_EEPROM Ocorre ao final de uma escrita na EEPROM interna
INT_CCP1 Ocorre quando uma captura ou comparação é satisfeita em CCP1
INT_CCP2 Ocorre quando uma captura ou comparação é satisfeita em CCP2
INT_COMP Ocorre quando uma comparação é satisfeita no comparador analógico
INT_SSP Ocorre quando alguma atividade é detectada em comunicações SPI ou I2C
INT_PSP Ocorre quando há dados prontos para serem lidos na porta paralela escrava
INT_BUSCOL Ocorre quando uma colisão é detectada no barramento de comunicação SPI
INT_TBE Ocorre quando o buffer de transmissão está vazio na comunicação RS232
INT_RDA Ocorre quando há dados prontos para serem lidos na comunicação RS232
INT_RB Ocorre quando alguma mudança é detectada no nível dos pinos RB4 a RB7
89
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
Habilitando, Configurando e Tratando Interrupções
● O primeiro passo para se criar uma interrupção no PIC é 
escrever a rotina que irá trata-la.
● Para que o compilador reconheça a rotina escrita como 
a ISR de uma interrupção é necessário adicionar a 
diretiva #int_ID antes da rotina, conforme a tabela 
abaixo:
#int_TIMER0 #int_AD #int_CCP1 #int_BUSCOL #int_SSP
#int_TIMER1 #int_EXT #int_CCP2 #int_TBE #int_PSP
#int_TIMER2 #int_EEPROM #int_COMP #int_RDA #int_RB
#int_RTCC
90
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
● Algumas interrupções são passíveis de configuração, tal 
como a INT_EXT, por exemplo, que pode ser 
configurada para ocorrer na borda de subida ou de 
descida do sinal no pino RB0/INT.
● Essa configuração pode ser feita através da instrução 
ext_int_edge(borda), onde borda pode ser uma das 
constantes abaixo:
Constante Descrição
L_TO_H Borda de subida
H_TO_L Borda de descida
91
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
● Em programas nos quais houver mais de uma 
interrupção, pode ser necessário definir a sequência de 
prioridades em que devem ser atendidas, caso mais de 
uma ocorra simultaneamente
● Isto pode ser feito com a diretiva #priority lista, 
onde lista é uma relação de de nomes de interrupção, 
separados por vírgula, conforme a tabela abaixo:
● Obs.: Uma vez que uma interrupção está sendo 
executada ela jamais é interrompida até seu término.
timer0 ad ccp1 buscol ssp
timer1 ext ccp2 tbe psp
timer2 eeprom comp rda rb
rtcc 
92
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
● Para que a interrupção possa ocorrer, é necessário 
habilita-la no PIC, o que pode ser feito através da 
instrução enable_interrupts(id).
● id – é a constante que identifica a interrupção a ser 
habilitada, conforme a tabela abaixo:
● Uma vez que todas as interrupções necessárias foram 
habilitadas, a instrução deve ser chamada novamente, 
com o id “GLOBAL”, de forma a ativar a operação das 
interrupções habilitadas.
INT_TIMER0 INT_AD INT_CCP1 INT_BUSCOL INT_SSP
INT_TIMER1 INT_EXT INT_CCP2 INT_TBE INT_PSP
INT_TIMER2 INT_EEPROM INT_COMP INT_RDA INT_RB
INT_RTCC GLOBAL 
93
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
Exemplo de código para interrupção do Timer0:
//(...)
int tempo = 0;
#int_timer0
void fazAlgo() { // rotina de tratamento da interrupção timer0
 set_timer0(131 – get_timer0()); // altera o valor do contador
 // do timer0
 tempo++;
}
void main() {
 setup_timer_0(RTCC_INTERNAL | RTCC_DIV_64);
 set_timer(131);
 enable_interrupts(GLOBAL | INT_TIMER0);// habilita interrupções
 while(1){
 delay_ms(300);
 output_b(tempo); // atualiza a porta B com o valor do tempo
 }
}
94
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
● Ex. 8: Relógio LCD
● Escreva um programa para exibir a hora no formato 
hh:mm:ss em um módulo LCD usando a INT_RTCC.
95
Circuitos Digitais II – Prof. Marcos Zurita
Interrupções
● Sabendo que o cristal empregado é de 4MHz, programe 
o Timer0 (ou RTCC) de maneira a obter um número 
preciso de estouros do contador a cada segundo.
● Programe a ISR para incrementar as variáveis globais 
hh, mm e ss conforme a passagem do tempo.
● A hora deverá ser iniciada em 12:00:00 e o LCD 
atualizado cada vez que uma mudança nos segundos for 
detectada.
● Modele o circuito e simule o programa.
● Se simulação correr bem, implemente-o na plataforma 
de prototipagem.
● Compare a precisão do tempo informado com um relógio 
de pulso.
96
Circuitos Digitais II – Prof. Marcos Zurita
Bibliografia
● Milan Verle, “PIC Microcontrollers - 
Programming in C”, 1a Ed., MikroElektronika, 
2009.
● Fábio Pereira, “Microcontroladores PIC: 
programação em C”, 7 ed., Érica, 2009.
● Custom Computer Services Inc., “C Compiler 
Reference Manual”, 2011.
● Microchip Tec. Inc., “8-bit PIC 
Microcontrollers”, Data Sheet, 2010.
● Microchip Tec. Inc., “PIC16F87XA - 28/40/44-Pin 
Enhanced Flash Microcontrollers”, Data Sheet, 
2003.
	Slide 1
	Slide 2
	Slide 3
	Slide 4
	Slide 5
	Slide 6
	Slide 7
	Slide 8
	Slide 9
	Slide 10
	Slide 11
	Slide 12
	Slide 13
	Slide 14
	Slide 15
	Slide 16
	Slide 17
	Slide 18
	Slide 19
	Slide 20
	Slide 21
	Slide 22
	Slide 23
	Slide 24
	Slide 25
	Slide 26
	Slide 27
	Slide 28
	Slide 29
	Slide 30
	Slide 31
	Slide 32
	Slide 33
	Slide 34
	Slide 35
	Slide 36
	Slide 37
	Slide 38
	Slide 39
	Slide 40
	Slide 41
	Slide 42
	Slide 43
	Slide 44
	Slide 45
	Slide 46
	Slide 47
	Slide 48
	Slide 49
	Slide 50
	Slide 51
	Slide 52
	Slide 53
	Slide 54
	Slide 55
	Slide 56
	Slide 57
	Slide 58
	Slide 59
	Slide 60
	Slide 61
	Slide 62
	Slide 63
	Slide 64
	Slide 65
	Slide 66
	Slide 67
	Slide 68
	Slide 69
	Slide 70
	Slide 71
	Slide 72
	Slide 73
	Slide 74
	Slide 75
	Slide 76
	Slide 77
	Slide 78
	Slide 79
	Slide 80
	Slide 81
	Slide 82
	Slide 83
	Slide 84
	Slide 85
	Slide 86
	Slide 87
	Slide 88
	Slide 89
	Slide 90
	Slide 91
	Slide 92
	Slide 93
	Slide 94
	Slide 95
	Slide 96

Outros materiais

Materiais relacionados

Perguntas relacionadas

Materiais recentes

Perguntas Recentes