Baixe o app para aproveitar ainda mais
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
Compartilhar