1
UTFPR – Campus Curitiba
Prof. Amauri Assef
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
Prof. Amauri Assef
amauriassef@utfpr.edu.br
Contador/Temporizador Timer 0
2
UTFPR – Campus Curitiba
Prof. Amauri Assef
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)
Contador/Temporizador Timer 0
3
UTFPR – Campus Curitiba
Prof. Amauri Assef
T0SE
PS2:PS0
T0CS
PSA
PSA
PSA
Diagrama em bloco do TIMER 0
Contador/Temporizador Timer 0
4
UTFPR – Campus Curitiba
Prof. Amauri Assef
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
O registro OPTION_REG fica no BANCO 1, endereço 0x81
 Bit 2-0 – PS2:PS0: Bits de seleção da taxa do prescaler
Contador/Temporizador Timer 0
5
UTFPR – Campus Curitiba
Prof. Amauri Assef
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
Contador/Temporizador Timer 0
6
UTFPR – Campus Curitiba
Prof. Amauri Assef
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
Contador/Temporizador Timer 0
7
UTFPR – Campus Curitiba
Prof. Amauri Assef
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
Contador/Temporizador Timer 0
8
UTFPR – Campus Curitiba
Prof. Amauri Assef
Contador/Temporizador Timer 0
RESUMO DOS REGISTRADORES DO TIMER 0
Contador/Temporizador Timer 0
9
UTFPR – Campus Curitiba
Prof. Amauri Assef
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):
 FCLK = 8MHz
 TTMR = 4 / 8M = 0,5μs
 TESTOURO = 256 * 0,5μs = 128μs (ver prescale)
PRESCALER TEMPO
1:2 256μs
1:4 512μs
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’
Contador/Temporizador Timer 0
10
UTFPR – Campus Curitiba
Prof. Amauri Assef
Programa principal (Assembly):
INICIO 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
Configura o
PIC16F877A
Contador/Temporizador Timer 0
11
UTFPR – Campus Curitiba
Prof. Amauri Assef
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;
}
}
}
Contador/Temporizador Timer 0
12
UTFPR – Campus Curitiba
Prof. Amauri Assef
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;
}
}
}
Contador/Temporizador Timer 0
13
UTFPR – Campus Curitiba
Prof. Amauri Assef
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;
Contador/Temporizador Timer 0
14
UTFPR – Campus Curitiba
Prof. Amauri Assef
Habilitação da interrupção do TIMER0:
#define LEDS PORTD
void interrupt ()
{
INTCON.TMR0IF = 0; // LIMPA O BIT DE OVERFLOW
LEDS = ~LEDS;
}
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) { }
}
Contador/Temporizador Timer 0
15
UTFPR – Campus Curitiba
Prof. Amauri Assef
Exercício 1
 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.
Contador/Temporizador Timer 0
16
UTFPR – Campus Curitiba
Prof. Amauri Assef
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.

AA Apresentacao_TIMER0_PIC16F877A_2016.pdf

  • 1.
    1 UTFPR – CampusCuritiba Prof. Amauri Assef 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 Prof. Amauri Assef amauriassef@utfpr.edu.br
  • 2.
    Contador/Temporizador Timer 0 2 UTFPR– Campus Curitiba Prof. Amauri Assef 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)
  • 3.
    Contador/Temporizador Timer 0 3 UTFPR– Campus Curitiba Prof. Amauri Assef T0SE PS2:PS0 T0CS PSA PSA PSA Diagrama em bloco do TIMER 0
  • 4.
    Contador/Temporizador Timer 0 4 UTFPR– Campus Curitiba Prof. Amauri Assef 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 O registro OPTION_REG fica no BANCO 1, endereço 0x81  Bit 2-0 – PS2:PS0: Bits de seleção da taxa do prescaler
  • 5.
    Contador/Temporizador Timer 0 5 UTFPR– Campus Curitiba Prof. Amauri Assef 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
  • 6.
    Contador/Temporizador Timer 0 6 UTFPR– Campus Curitiba Prof. Amauri Assef 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
  • 7.
    Contador/Temporizador Timer 0 7 UTFPR– Campus Curitiba Prof. Amauri Assef 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
  • 8.
    Contador/Temporizador Timer 0 8 UTFPR– Campus Curitiba Prof. Amauri Assef Contador/Temporizador Timer 0 RESUMO DOS REGISTRADORES DO TIMER 0
  • 9.
    Contador/Temporizador Timer 0 9 UTFPR– Campus Curitiba Prof. Amauri Assef 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):  FCLK = 8MHz  TTMR = 4 / 8M = 0,5μs  TESTOURO = 256 * 0,5μs = 128μs (ver prescale) PRESCALER TEMPO 1:2 256μs 1:4 512μs 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’
  • 10.
    Contador/Temporizador Timer 0 10 UTFPR– Campus Curitiba Prof. Amauri Assef Programa principal (Assembly): INICIO 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 Configura o PIC16F877A
  • 11.
    Contador/Temporizador Timer 0 11 UTFPR– Campus Curitiba Prof. Amauri Assef 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; } } }
  • 12.
    Contador/Temporizador Timer 0 12 UTFPR– Campus Curitiba Prof. Amauri Assef 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; } } }
  • 13.
    Contador/Temporizador Timer 0 13 UTFPR– Campus Curitiba Prof. Amauri Assef 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;
  • 14.
    Contador/Temporizador Timer 0 14 UTFPR– Campus Curitiba Prof. Amauri Assef Habilitação da interrupção do TIMER0: #define LEDS PORTD void interrupt () { INTCON.TMR0IF = 0; // LIMPA O BIT DE OVERFLOW LEDS = ~LEDS; } 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) { } }
  • 15.
    Contador/Temporizador Timer 0 15 UTFPR– Campus Curitiba Prof. Amauri Assef Exercício 1  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.
  • 16.
    Contador/Temporizador Timer 0 16 UTFPR– Campus Curitiba Prof. Amauri Assef 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.