CIRCUITOS DIGITAIS II



Documentos relacionados
CIRCUITOS DIGITAIS II

Prática 8: Comunicação SPI. 8.1 Introdução e objetivos. 8.2 Princípios básicos do protocolo SPI

Interrupções e timers

Programação em BASIC para o PIC Mostrando Mensagens no Display LCD Vitor Amadeu Souza

Arquitetura de Computadores. Tipos de Instruções

Copyright 2011 VW Soluções

CAPÍTULO 2 CARACTERÍSTICAS DE E/S E PORTA PARALELA

5 Entrada e Saída de Dados:

CONSTRUÇÃO DE UMA UCP HIPOTÉTICA M++ INTRODUÇÃO

Sistemas Embarcados. Introdução aos sistemas embarcados

1. Considerações Sobre o Hardware

Arquitetura e Organização de Computadores I

Copyright 2013 VW Soluções

CAPÍTULO 5. INTERFACES PARA PERIFÉRICOS DE ARMAZENAMENTO INTERFACES DIVERSAS: FIREWIRE, SPI e I 2 C INTERFACES COM O MUNDO ANALÓGICO

Entrada e Saída. Prof. Leonardo Barreto Campos 1

EXPERIÊNCIA 17 USO DO TEMPORIZADOR INTERNO

28/9/2010. Unidade de Controle Funcionamento e Implementação

Estruturas do Sistema de Computação

Gerência de Entrada/Saída

Dispositivos de Entrada e Saída

SISTEMAS OPERACIONAIS ABERTOS Prof. Ricardo Rodrigues Barcelar

Placa Acessório Modem Impacta

Guia de consulta rápida

Tutorial de Eletrônica Aplicações com 555 v

PIC18F4550. Curso Engenharia de Controle e Automação. Alex Vidigal Bastos alexvbh@gmail.com

Unidade Central de Processamento (CPU) Processador. Renan Manola Introdução ao Computador 2010/01

Introdução aos Computadores

Flip-Flops (Aplicações) Prof. Rômulo Calado Pantaleão Camara

Estrutura de um Computador

ARQUITETURA DE COMPUTADORES

FAÇA FÁCIL: DRIVER IGS PARA COMUNICAÇÃO DE PROTOCOLOS PROPRIETÁRIOS INTRODUÇÃO

Boletim Técnico R&D 03/08 CARACTERÍSTICAS DO DRIVER MPC6006L 14 de março de 2008

ARQUITETURA DE COMPUTADORES

Microprocessadores e Microcontroladores Parte 3. Expansão de Memória Mapeamento de Memória

PAINEL ELETRÔNICO DE MENSAGENS MANUAL DE OPERAÇÃO E INSTALAÇÃO CARROS URBANOS E G7 MARCOPOLO

1.3 Conectando a rede de alimentação das válvulas solenóides

Interrupções. As interrupções são casos especiais de chamadas de procedimentos.

LABORATÓRIO DE ELETRÔNICA DIGITAL Experiência 9: Análise de Circuitos com Contadores

ACENDENDO AS LUZES. Capitulo 2 - Aula 1 Livro: Arduino básico Tutor: Wivissom Fayvre

O USO DE UM SENSOR DE LUZ LINEAR COMO RECURSO DIDÁTICO PARA DEMONSTRAR PRINCÍPIOS DE DIFRAÇÃO E ESPECTROSCOPIA

ULA Sinais de Controle enviados pela UC

DECODIFICADOR DE DISPLAY DE 7 SEGMENTOS COM LATCH

Universidade Federal de Santa Catarina Centro Tecnológico Departamento de Informática e Estatística Curso de Graduação em Ciências da Computação

TEM VÁRIOS ESTADOS: 0V,0.1V,3V,3.3V,4V,5V,10V, ETC.

Controladores Lógicos Programáveis CLP (parte-3)

Programação em BASIC para o PIC Projetos com Display Gráfico Vitor Amadeu Souza

Organização de Computadores 1

Programação C para microcontroladores PIC

Kit de desenvolvimento ACEPIC 40N

3. Arquitetura Básica do Computador

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

ENTRADA E SAÍDA DE DADOS

Funções de Posicionamento para Controle de Eixos

Sistemas Computacionais II Professor Frederico Sauer

A idéia hardware sugerida é colocar a placa entre o PC e o microcontrolador, conforme mostrado no esquema abaixo.

LÓGICA DE PROGRAMAÇÃO PARA ENGENHARIA INTRODUÇÃO À ORGANIZAÇÃO DE COMPUTADORES

ECD1200 Equipamento de Consulta de Dados KIT DE DESENVOLVIMENTO

GERTEC Manual de Operação e Instalação MTi-760 Versão 1.0

BARRAMENTO DO SISTEMA

Suporta os microcontroladores: R. Leonardo da Vinci, Campinas/SP CEP F.: (19) /

Aula 3. Sistemas Operacionais. Prof: Carlos Eduardo de Carvalho Dantas

Programação Básica em STEP 7 Operações Binárias. SITRAIN Training for Automation and Drives. Página 6-1

Programação de Robótica: Modo Circuitos Programados - Avançado -

Programação Básica em Arduino Aula 2

Aplicações de Microprocessadores I. Prof. Adilson Gonzaga

Introdução à Programação

ARQUITETURA DE COMPUTADORES

E/S PROGRAMADA E/S PROGRAMADA E/S USANDO INTERRUPÇÃO

Leitor MaxProx-Lista-PC

Organização e Arquitetura de Computadores

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Manual do instalador Box Input Rev Figura 01 Apresentação do Box Input.

PIC16F628a. Pinagem do PIC16F628a:

Arquitetura de Computadores - Revisão -

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

Mapeamento de memória e programação da IHM do controlador CP-WS41/8DO8DI4AO2AI2TAI

Mecanismo de Interrupção

Processos e Threads (partes I e II)

Memórias Prof. Galvez Gonçalves

ÍNDICE 1. INTRODUÇÃO DESCRIÇÃO DO PICKIT Ligação da porta USB LEDs de estado Botão... 5

Capítulo 4. MARIE (Machine Architecture Really Intuitive and Easy)

Computadores XXI: Busca e execução Final

Sistemas Operacionais. Prof. André Y. Kusumoto

INDICE 1. INTRODUÇÃO CONFIGURAÇÃO MÍNIMA INSTALAÇÃO INTERLIGAÇÃO DO SISTEMA ALGUNS RECURSOS SERVIDOR BAM...

Instituto Tecnológico de Aeronáutica - ITA Divisão de Engenharia Eletrônica Departamento de Eletrônica Aplicada Laboratório de EEA-21

Capítulo VIII Registradores de Deslocamento e Contadores

Gerenciamento de Entrada e Saída Hélio Crestana Guardia e Hermes Senger

Display de LEDs Rotativo

TUTORIAL DE PROGRAMAÇÃO. Configuração do cartão de entrada / saída analógica CP1W-MAD11.

Micro Controladores Programáveis

Projecto de uma placa com DIP-Switches e LCD com ligação à placa DETIUA

Manual de Configuração e Operação

Memórias. O que são Memórias de Semicondutores? São componentes capazes de armazenar informações Binárias (0s e 1s)

Geral: Manual de Utilização do Software de Teste Gradual Windows

Tais operações podem utilizar um (operações unárias) ou dois (operações binárias) valores.

Capítulo 12. Projeto 5 Controle de Motores de Passo Circuito e Funcionamento

Organização de Computadores Hardware

Quadro de consulta (solicitação do mestre)

Organização Básica do Computador

MANUAL DE CONFIGURAÇÃO

Transcrição:

Universidade Federal do Piauí Centro de Tecnologia epartamento de Engenharia Elétrica CIRCUITOS IGITIS II Programação do PIC Prof. Marcos Zurita zurita@ufpi.edu.br www.ufpi.br/zurita Teresina - 2011

Sumário 1. Comandos de Saída no CCS C 2. Comandos de Entrada no CCS C 3. isplay de 7 Segmentos 4. Módulos LC 5. Conversor / Interno 6. Temporizadores 7. Interrupções 2

1. Comandos de Saída no CCS C 3

Comandos de Saída no CCS C Comandos de Saída no CCS C set_tris_x() output_bit() output_low() output_high() output_float() output_x() 4

Comandos de Saída no CCS C 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: set_tris_b(0b00000111); /* configura os pinos da porta B: b0 a b2 como entradas b3 a b7 como saídas */ 5

Comandos de Saída no CCS C 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: output_bit(pin_a2,1); // coloca o pino 2 em nível 1 output_bit(pin_a2,0); // coloca o pino 2 em nível 0 6

Comandos de Saída no CCS C 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: #define LE pin_a0 output_low(pin_b7); output_low(le); // coloca o pino B7 em nível 0 // coloca o pino 0 em nível 0 7

Comandos de Saída no CCS C 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: #define OUTRO_LE pin_c1 output_high(pin_d0); // coloca o pino 0 em nível 1 output_high(outro_le);// coloca o pino C1 em nível 1 8

Comandos de Saída no CCS C 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.: output_float(pin_c7); // coloca o pino C7 em 3-state 9

Comandos de Saída no CCS C 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: 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. */ 10

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: V: 5 s M: 2 s VM: 4 s Funcionamento ininterrupto. XTL = 4MHz. 11

Comandos de Saída no CCS C Porta B: Portas, C, e E: pinos ligados aos LEs devem ser configurados como pinos de saída; demais pinos devem ser configurados como entrada; 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. 12

2. Comandos de Entrada no CCS C 13

Comandos de Entrada no CCS C Comandos de Entrada no CCS C int input() int input_x() 14

Comandos de Entrada no CCS C int input(pino) Retorna o estado do pino indicado. Ex.: tecla = input(pin_d2); /* lê o nível lógico do pino d2 e copia para a Variável tecla. */ 15

Comandos de Entrada no CCS C int input_x() Retorna um byte contendo o valor lido da porta indicada. Ex: dado8bits = input_b(pin_d2); // lê a porta B e guarda na variável dado. 16

Comandos de Entrada no CCS C Ex. 2: Semáforo de 3 Tempos Comandado ltere 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. 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. 17 XTL = 4MHz.

3. isplay de 7 Segmentos 18

isplay de 7 segmentos isplay de 7 Segmentos Como cada segmento é um LE, os mesmos cuidados tomados com a limitação de corrente em LEs comuns devem ser tomados. Composto por 7 (ou 8) LEs conectados em Catodo Comum ou em nodo Comum. Pode ser acionado diretamente pelo microcontrolador ou através de um decodificador BC para 7 segmentos. 19

isplay de 7 segmentos tivação ireta 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. 20

isplay de 7 segmentos Representação do lfabeto em 7 Segmentos a b c d e f g h i j k l m B C E F G H I J K L M n o p q r s t u v w x y z N O P Q R S T U V W X Y Z 21

isplay de 7 segmentos tivação Via ecodificador BC Requer 4 pinos do uc (5 se o ponto for usado). Requer um componente adicional: ec BC->7 segm. Permite gerar apenas os dígitos de 0 a 9 (para maioria dos decodificadores comerciais). 22

isplay de 7 segmentos Multiplexação de isplays 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. solução mais comum para este problema é comandalos de forma multiplexada, isto é, ativando um a um alternadamente em alta velocidade. esvantagens: É 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 consequentemente, menor será seu brilho aparente. 23 umento da complexidade do sistema.

isplay de 7 segmentos Ex.: Multiplexação de 4 displays. 24

isplay 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 displays de 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. 25

isplay de 7 segmentos Ex. 4: Cronômetro Escreva um programa para cronometrar o tempo em décimos de segundos decorrido após o reset. 26

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. 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. 27

4. Módulos LC 28

Módulos LC Os Módulos de isplay LC 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 LEs indicadores ou displays de 7 segmentos pode tornar-se inadequado ou mesmo inviável. solução mais simples para esse problema é adoção de módulos LC como interface de exibição. 29

Módulos LC Módulos de display LC 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 LC alfanuméricos, baseados no H44780 da Hitachi. Resoluções comerciais: 8x1 a 40x4 (caracteres x linhas). 30

Módulos LC Características dos Módulos LC Baseados no H44780 Capacidade de exibição de caracteres alfanuméricos, pontuação, símbolos matemáticos, letras gregas e caracteres kana; Capacidade de exibição de caracteres 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. 31

Módulos LC Módulos de isplay LC: lgumas Resoluções 32

Módulos LC Módulos de isplay LC: Cores 33

Módulos LC Tela do Módulo LC 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. 34

Módulos LC Módulos de isplay LC: Pinagem PINO 1 2 3 4 5 6 7 8 9 10 11 12 13 14 NOME Vss Vdd Vee RS R/W E 0 1 2 3 4 5 6 7 FUNÇÂO Terra (GN) Vcc (5V) Contraste (0 a 5V) Register Select Read / Write Enable ata bit 0 ata bit 1 ata bit 2 ata bit 3 ata bit 4 ata bit 5 ata bit 6 ata bit 7 35

Módulos LC Memórias Internas Internamente o Módulo LC contém 3 blocos de memória: RM (isplay ata RM) RM de ados Mostrados. CGRM (Caracter Generator RM) RM do Gerador de Caracteres. CGROM (Caracter Generator ROM) - ROM do Gerador de Caracteres. 36

Módulos LC Memória RM rmazena 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). 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. 37

Módulos LC 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 38

Módulos LC Os primeiros 128 caracteres da CGROM são mapeados de forma que seus códigos correspondam aos da Tabela SCII: Ex.: se o caractere 65 ('') é enviado ao módulo ele exibirá a letra ''. 39

Módulos LC Memória CGRM rmazena 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). 40

Módulos LC Interfacemento LC - PIC Pode ser feito através da biblioteca lcd.c do diretório picc\drivers, para módulos compatíveis com o H44780. Interfaceamento no modo de 4 bits. Opera de modo transparente ao usuário através da função printf(). 41

Módulos LC Biblioteca lcd.c Utiliza os bits b0 a b2 e b4 a b7 da porta ou B (default porta ) 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 42

Módulos LC Conexão Entre o LC e o PIC +5V Vdd 5KΩ RS E R1 R0 Vss R/W 3 R3 Vee R2 4 R4 0 5 R5 1 6 R6 2 7 R7 LC PIC 43

Módulos LC Interfacemento Com LC 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) 44

Módulos LC Rotina lcd_init() Inicializa o LC Configura como LC 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). pós a inicialização o LC está pronto para receber caracteres. 45

Módulos LC 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. 46

Módulos LC Rotina lcd_read_byte() Lê o último byte enviado ao LC. É 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 LC. 47

Módulos LC Palavras de Controle do LC 48

Módulos LC Interfaceamento com o LC Incluir a biblioteca lcd.c Inicializar o LC com lcd_init() #include <lcd.c> // biblioteca de suporte ao LC void main() { // instruções de inicialização do PIC } int coisa = 12; lcd_init(); // inicializa o módulo LC lcd_putc( Teste LC\n ); printf(lcd_putc, Time: %U s, coisa); 49

Módulos LC Ex. 5: Cronômetro LC Reescreva o programa do cronômetro para exibir o tempo em um módulo LC de 16x2 caracteres. 50

Módulos LC 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. 51

5. Conversor / Interno 52

Conversor / Interno Conversor / 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. 53

Conversor / Interno Comandos Básicos Para Conversão / iretiva #device adc=10 O comando setup_adc_ports(xxx) Configura as portas do xxx pode assumir valores como LL_NLOG NO_NLOG R0_R1_R3_NLOG R0_R1_NLOGR3_REF Configurações possíveis de xxx definidos na biblioteca do dispositivo ( 16F877.h, neste caso). 54

Conversor / Interno Possíveis Configurações do C no PIC16F877 MOO N7 N6 N5 N4 N3 N2 N1 N0 Vref+ Vref- LL_NLOG V VSS NLOG_R3_REF Vref+ N3 VSS _NLOG V VSS _NLOG_R3_REF Vref+ N3 VSS R0_R1_R3_NLOG V VSS R0_R1_NLOG_R3_REF Vref+ N3 Vss NO_NLOGS --- --- NLOG_R3_R2_REF Vref+ Vref- N3 N2 NLOG_NOT_RE1_RE2 V VSS NLOG_NOT_RE1_RE2_REF_R3 Vref+ Vref- N3 VSS NLOG_NOT_RE1_RE2_REF_R3_R2 Vref+ Vref- N3 N2 _NLOG_R3_R2_REF Vref+ Vref- N3 N2 R0_R1_NLOG_R3_R2_REF Vref+ Vref- N3 N2 R0_NLOG V VSS R0_NLOG_R3_R2_REF Vref+ Vref- N3 N2 =Entrada nalógica =Entrada/Saída igital 55

Conversor / Interno 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 C e, em caso positivo, sua frequência de operação. Por exemplo, mode pode assumir valores como: C_OFF C_CLOCK_INTERNL C_CLOCK_IV_32 Valores de mode definidos na biblioteca do dispositivo ( 16F877.h, neste caso). 56

Conversor / Interno set_adc_channel(channel) Seleciona o canal do / 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). 57

Conversor / Interno Exemplo de código para aquisição no canal 6: #device adc=10 // conversor de 10bits void main() { int16 tensao; // instruções de configuração do PIC... setup_c_ports(ll_nlog); // Toda porta como // entradas analógicas setup_adc(c_clock_internl); // C com clock interno set_adc_channel(6); // Seleciona o canal 6 tensao = read_adc(); // Faz uma aquisição } 58

Conversor / Interno Ex. 6: Voltímetro Escreva um programa exibir a tensão (0 a 5V) lida no canal 1 do / em um LC de 16x2 caracteres. 59

Conversor / Interno O conversor / deverá operar no modo 10 bits. Utilize V como Vref+ e VSS como Vref precisão da leitura deve ser informada na primeira linha do LC (p/ ex.: Tensão +/- 8 mv: ); tensão deve ser exibida com 3 casas decimais de precisão na segunda linha do LC. Modele o circuito e simule o programa. Se simulação correr bem, implemente-o na plataforma de prototipagem. 60

Conversor / Interno Ex. 7: Termômetro igital Reescreva o código do exemplo anterior para que ele apresente também a temperatura dada por um sensor. 61

Conversor / Interno Sensor de temperatura utilizado: LM35. Saída: 0mV + 10mv/ C. O conversor / deverá operar no modo 10 bits. Utilize V como Vref+ e VSS como Vref temperatura deve ser informada na primeira linha do LC (p/ ex.: Temp.: 026.5 C ); tensão deve ser exibida com 3 casas decimais de precisão na segunda linha do LC. Modele o circuito e simule o programa. Se simulação correr bem, implemente-o na plataforma de prototipagem. 62

6. Temporizadores (Timers) 63

Temporizadores Temporizadores (Timers) São circuitos destinados a contagem do tempo. 64

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 Início bits incrementado por um clock 1 ms 1 ms de 1kHz: 0 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. 1 7 1 ms 1 ms 6 1 ms 2 3 5 1 ms 4 1 ms 1 ms 65

Temporizadores 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. ois 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. epende 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. 66

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. Início esvios podem ser síncronos 1 ms 1 ms (consumindo um ciclo de clock) 0 ou assíncronos (ocorrendo tão 7 1 1 ms 1 ms logo o estado proibido seja 0 ou 1 ms detectado). 6 2 1 ms 3 5 1 ms 4 1 ms 1 ms 67

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 Início mesma dimensão (em bits) 1 ms do temporizador. 1 ms 0 Para o exemplo adotado, o 1 ms 1 7 1 ms período de estouro poderia 1 ms ser reduzido para 5 ms CMP & 6 2 RESET configurando-se o comparador para reiniciar após o 1 ms 1 ms 3 5 estado 4. 1 ms 4 1 ms 68

Temporizadores umentando o Período de Estouro esde 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. 69

Temporizadores Temporizadores no PIC16F877 O PIC16F877 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. 70

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 R4/T0CK. Clock externo com borda de detecção selecionável; Interrupção associada ao estouro do contador. 71

Temporizadores iagrama Interno do Timer0 72

Temporizadores Instruções de Manipulação de Timers setup_timer_x() set_timerx() get_timerx() setup_rtcc() setup_counter() 73

Temporizadores Configurando o Timer0 setup_timer_0(constgrupo1 ConstGrupo2) Configura o clock e prescaler do Timer0 Constantes do Grupo 1 RTCC_INTERNL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L Seleciona o RTCC (fosc/4) como o clock do Timer0 Seleciona a borda de subida no pino R4 como clock do Timer0 Seleciona a borda de descida no pino R4 como clock do Timer0 Constantes do Grupo 2 RTCC_IV_1 RTCC_IV_2 RTCC_IV_4 RTCC_IV_8 RTCC_IV_16 RTCC_IV_32 RTCC_IV_64 RTCC_IV_128 RTCC_IV_256 Clock do Timer0 = RTCC (fosc/4) Clock do Timer0 = RTCC/2 (fosc/8) Clock do Timer0 = RTCC/4 (fosc/16) Clock do Timer0 = RTCC/8 (fosc/32) Clock do Timer0 = RTCC/16 (fosc/64) Clock do Timer0 = RTCC/32 (fosc/128) Clock do Timer0 = RTCC/64 (fosc/256) Clock do Timer0 = RTCC/128 (fosc/512) Clock do Timer0 = RTCC/256 (fosc/1024) 74

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) ltera o valor atual do contador do timer0 para o valor informado, permitindo-se corrigir o tempo ou mesmo aumentar a frequência de estouro. 75

Temporizadores Exemplo de código de utilizando o Timer0: #use delay(clock=4000000) // oscilador de 4MHz //(...) diretivas e inclusão da biblioteca do LC int16 t1, t2, x; void main() { // (...) instruções de configuração do PIC setup_timer_0(rtcc_internl RTCC_IV_64); // Clock do Timer0 vinculado ao RTCC // 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... } 76

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. 77

Temporizadores iagrama Interno do Timer1 78

Temporizadores Configurando o Timer1 setup_timer_1(constgrupo1 OSC ConstGrupo2) Configura o clock e prescaler do Timer1 Constantes do Grupo 1 T1_ISBLE T1_INTERNL T1_EXTERNL T1_EXTERNL_SYNC Timer1 desabilitado Timer1 habilitado com clock de entrada interno (CLK1 = fosc/4) Clock de entrada externo via pino T1CK1 (borda de subida) Clock de entrada externo e sincronizado via pino T1CK1 (bd. subida) OSC T1_CLOCK_OUT Habilita o oscilador entre os pinos T1OSO e T1OSI p/ clock externo Constantes do Grupo 2 T1_IV_1 T1_IV_2 T1_IV_4 T1_IV_8 Clock do Timer1 = CLK1 Clock do Timer1 = CLK1 / 2 Clock do Timer1 = CLK1 / 4 Clock do Timer1 = CLK1 / 8 79

Temporizadores Exemplo de código de utilizando o Timer1: //(...) diretivas e inclusão da biblioteca do LC int16 p, x; void main() { // (...) instruções de configuração do PIC setup_timer_1(t1_externl T1_IV_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... } 80

Temporizadores Timer 2 É o único temporizador do PIC16F877 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. 81

Temporizadores iagrama Interno do Timer2 82

Temporizadores 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: Constantes Possíveis para modo T2_ISBLE T2_IV_1 T2_IV_4 T2_IV_16 Timer2 desabilitado Clock do Timer2 = fosc/4 Clock do Timer2 = (fosc/4) / 4 Clock do Timer2 = (fosc/4) / 16 83

Temporizadores Exemplo de código de utilizando o Timer2: #use delay(clock=10000000) // oscilador de 10MHz //(...) diretivas e inclusão da biblioteca do LC void main() { // (...) instruções de configuração do PIC setup_timer_2(t2_iv_by_1, 124, 1); // Um estouro do Timer2 ocorrerá a cada 50 us // (...) código } 84

7. Interrupções 85

Interrupções Interrupções São rotinas executadas em função de algum evento. Ex: Mudança de estado de um pino (hardware); Estouro de um timer (software); Fim de conversão / (software); Fim de escrita na EEPROM (software). esviam 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. 86

Interrupções 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. 87

Interrupções Interrupções Existentes no PIC16F877 I da Interrupção INT_TIMER0 INT_TIMER1 INT_TIMER2 INT_RTCC INT_ INT_EXT INT_EEPROM INT_CCP1 INT_CCP2 INT_COMP INT_SSP INT_PSP INT_BUSCOL INT_TBE INT_R INT_RB escrição Gerada no estouro do contador do Timer0 Gerada no estouro do contador do Timer1 Gerada no estouro do contador do Timer2 Idem a INT_TIMER0 (trata-se apenas de um sinônimo para INT_TIMER0) Gerada ao final da conversão / Gerada pela transição de subida (ou de descida) do sinal no pino RB0/INT Ocorre ao final de uma escrita na EEPROM interna Ocorre quando uma captura ou comparação é satisfeita em CCP1 Ocorre quando uma captura ou comparação é satisfeita em CCP2 Ocorre quando uma comparação é satisfeita no comparador analógico Ocorre quando alguma atividade é detectada em comunicações SPI ou I2C Ocorre quando há dados prontos para serem lidos na porta paralela escrava Ocorre quando uma colisão é detectada no barramento de comunicação SPI Ocorre quando o buffer de transmissão está vazio na comunicação RS232 Ocorre quando há dados prontos para serem lidos na comunicação RS232 Ocorre quando alguma mudança é detectada no nível dos pinos RB4 a RB7 88

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_i antes da rotina, conforme a tabela abaixo: #int_timer0 #int_ #int_ccp1 #int_buscol #int_ssp #int_timer1 #int_ext #int_ccp2 #int_tbe #int_psp #int_timer2 #int_eeprom #int_comp #int_r #int_rb #int_rtcc 89

Interrupções lgumas 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 escrição L_TO_H Borda de subida H_TO_L Borda de descida 90

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: timer0 ad ccp1 buscol ssp timer1 ext ccp2 tbe psp timer2 eeprom comp rda rb rtcc Obs.: Uma vez que uma interrupção está sendo executada ela jamais é interrompida até seu término. 91

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: INT_TIMER0 INT_ INT_CCP1 INT_BUSCOL INT_SSP INT_TIMER1 INT_EXT INT_CCP2 INT_TBE INT_PSP INT_TIMER2 INT_EEPROM INT_COMP INT_R INT_RB INT_RTCC GLOBL Uma vez que todas as interrupções necessárias foram habilitadas, a instrução deve ser chamada novamente, com o id GLOBL, de forma a ativar a operação das interrupções habilitadas. 92

Interrupções Exemplo de código para interrupção do Timer0: //(...) int tempo = 0; #int_timer0 void fazlgo() { // 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_internl RTCC_IV_64); set_timer(131); enable_interrupts(globl INT_TIMER0);// habilita interrupções while(1){ delay_ms(300); output_b(tempo); // atualiza a porta B com o valor do tempo } } 93

Interrupções Ex. 8: Relógio LC Escreva um programa para exibir a hora no formato hh:mm:ss em um módulo LC usando a INT_RTCC. 94

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. hora deverá ser iniciada em 12:00:00 e o LC 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. 95

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, ata Sheet, 2010. Microchip Tec. Inc., PIC16F87X - 28/40/44-Pin Enhanced Flash Microcontrollers, ata Sheet, 2003. 96