UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ DEPARTAMENTO ACADÊMICO DE ELETROTÉCNICA CURSO DE ENGENHARIA INDUSTRIAL ELÉTRICA TECNOLOGIA EM AUTOMAÇÃO INDUSTRIAL Sistemas Digitais e Microcontrolados Contador/Temporizador TIMER 0 - PIC16F877A amauriassef@utfpr.edu.br 1
Contador/Temporizador Timer 0 CARACTERÍSTICAS Contador binário de 8 bits (0x00 0xFF) Prescaler programável (divisor de frequência) Seleção de clock interno ou externo Interrupção de overflow de 0xFF para 0x00 Seleção de borda para clock externo (subida ou descida) Registro de contagem TMR0 (endereço 0x01 banco 0) FUNÇÕES BÁSICAS Contagem de eventos externos (clock de entrada no pino RA4/T0CKI) Temporização (contagem de tempo) para clock interno (fclk / 4) 2
Diagrama em bloco do TIMER 0 T0SE T0CS PSA PSA PS2:PS0 PSA 3
Registrador de configuração do TIMER 0 OPTION_REG Bit 7 - /RBPU Bit 6 INTEDG Bit 5 T0CS: Bit de seleção da fonte de clock do TIMER 0 0 Interno 1 Transição do pino T0CKI Bit 4 T0SE: Bit de seleção da borda do TMR0 0 Incrementa na transição 1 para 0 do pino T0CKI 1 Incrementa na transição 0 para 1 do pino T0CKI Bit 3 PSA: Bit de atribuição do prescaler 0 Prescaler para o TIMER 0 1 Prescaler para p WDT Bit 2-0 PS2:PS0: Bits de seleção da taxa do prescaler O registro OPTION_REG fica no BANCO 1, endereço 0x81 4
Interrupção Pode ser causada por evento interno ou externo: Mudança de estado no pino Overflow do timer Conversão do A/D Endereço de retorno salvo na pilha Vetor de interrupção no endereço 0x04 Retorno da interrupção com a instrução RETFIE Salvamento de contexto W, STATUS e PCLATH Limpar o bit de sinalização da interrupção, por exemplo BCF INTCON, TMR0IF (Assembly) INTCON.TMR0IF = 0 (C) ou TMR0IF_bit = 0 5
Registro de Interrupção - INTCON Bit 7 GIE: Bit Global Interrupt Enable Habilitação global das interrupções 0 Desabilita todas as interrupções 1 Habilita todas as interrupções desmascaradas Bit 5 TMR0IE: Bit de habilitação da interrupção de overflow do TIMER0 0 Desabilita a interrupção do TMR0 1 Habilita a interrupção do TMR0 Bit 2 TMR0IF: Bit de sinalização da interrupção de overflow do TIMER0 0 TIMER0 sem overflow 1 TIMER0 com overflow 6
Interrupção do Timer 0 DESCRIÇÃO A interrupção do TIMER 0 é gerada quando o registro TMR0 transborda (overflow) de 0xFF para 0x00 O overflow seta o bit TMR0IF (timer 0 interrupt flag) do registro INTCON A interrupção pode ser mascarada resetando o bit TMR0IE do registro INTCON O bit TMR0IF deve ser resetado por software para habilitar nova interrupção 7
Contador/Temporizador Timer 0 RESUMO DOS REGISTRADORES DO TIMER 0 8
Exemplo de cálculo para o TIMER 0 Utilizando o TIMER 0, escrever um programa para inverter o conteúdo do PORTD a cada 2ms (clock de 8MHz): PRESCALER TEMPO 1:2 256μs FCLK = 8MHz TTMR = 4 / 8M = 0,5μs 1:4 512μs TESTOURO = 256 * 0,5μs = 128μs (ver prescale) 1:8 1,024ms 1:16 2,048ms 1:32 4,096ms 1:64 8,192ms 1:128 16,384ms 1:256 32,768ms OPTION_REG <= B 0000 0011 9
Programa principal (Assembly): INICIO Configura o PIC16F877A BANK1 MOVLW 0X00 MOVWF TRISD ; CONFIGURA PORTD COMO SAÍDA MOVLW B'00000011 ; TIMER 0 -> PRESCALER DE 1:16 MOVWF OPTION_REG BANK0 CLRF PORTD TESTE BTFSS INTCON,TMR0IF ; VERIFICA SE OCORREU OVERFLOW DO T0 GOTO TESTE BCF INTCON,TMR0IF ; LIMPA BIT DE OVERFLOW COMF PORTD,F ; INVERTE O PORTD A CADA OVERFLOW DO T0 GOTO TESTE 10
Programa principal (C) MikroC: void main() { OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0 TRISD = 0x00; // PORTB COMO SAÍDA PORTD = 0x00; // VALOR INICIAL = 00 TMR0 = 0X00; // LIMPA TMR0 while(1) { if (INTCON.F2) // TESTA O BIT DE OVERFLOW { INTCON.F2 = 0; // LIMPA O BIT DE OVERFLOW PORTD = ~PORTD; } } } 11
Programa principal (C) MikroC Pro: void main() { OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0 TRISD = 0x00; // PORTB COMO SAÍDA PORTD = 0x00; // VALOR INICIAL = 00 TMR0 = 0X00; // LIMPA TMR0 while(1) { if (INTCON.TMR0IF) // TESTA O BIT DE OVERFLOW { INTCON.TMR0IF = 0; // LIMPA O BIT DE OVERFLOW PORTD = ~PORTD; } } } 12
Habilitação da interrupção do TIMER0: a) Assembly MOVLW B 10100000' ; TIMER 0 -> PRESCALER DE 1:16 ; ---------> HABILITA A INTERRUPÇÃO DO TIMER0 ; ---------> HABILITA A INTERRUPÇÃO GLOBAL MOVWF INTCON b) C INTCON = 0B10100000; 13
Habilitação da interrupção do TIMER0: #define LEDS PORTD void interrupt () { } INTCON.TMR0IF = 0; LEDS = ~LEDS; // LIMPA O BIT DE OVERFLOW void main() { OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0 TRISD = 0x00; // PORTD COMO SAÍDA LEDS = 0x00; // VALOR INICIAL = 00 TMR0 = 0X00; // LIMPA TMR0 INTCON = 0B10100000; // INT DO TIMER0 HABILITADA while(1) { } } 14
Exercício 1 Contador/Temporizador Timer 0 A partir do exemplo anterior, desenhar o fluxograma e escrever o firmware para piscar os LEDs com atraso de 1 segundo utilizando prescaler 1:128. Exercício 2 Desenhar o fluxograma e escrever o firmware para executar as seguintes funções: 1. Dentro da interrupção do Timer 0, testar a chave conectada no pino RB0 a cada 8 ms (prescaler 1:64). Considerando 2 displays de 7 segmentos do tipo catodo comum multiplexados conectado ao PORTD, escrever os caracteres Ab se chave aberta ou FE caso contrário. Obs: testar o pino de acionamento RE0 ou RE1 para a seleção do display. 2. No laço principal, escrever a função para que o Rele conectado no pino RE2 seja acionado/desacionado com atraso de 2 segundos implementado por software. 15
Exercício 3 Desenhar o fluxograma e escrever o firmware para executar as seguintes funções: 1. Dentro da interrupção do Timer 0, testar a chave conectada no pino RB0 a cada 8 ms (prescaler 1:64). Considerando 2 displays de 7 segmentos do tipo catodo comum multiplexados conectado ao PORTD, escrever os caracteres S1 se chave aberta ou S2 caso contrário. Obs : testar o pino de acionamento RE0 ou RE1 para a seleção do display. 2. No laço principal, mover o motor para um dos sentidos (pinos RC0, RC3, RC4 e RC5), conforme o estado da chave. Obs: utilizar atraso de 10 ms por software. 16