UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁUNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ
DEPARTAMENTO ACADÊMICO DE ELETROTÉCNICADEPARTAMENTO ACADÊMICO DE ELETROTÉCNICA
CURSO DE ENGENHARIA INDUSTRIAL ELÉTRICACURSO DE ENGENHARIA INDUSTRIAL ELÉTRICA
1UTFPR – Campus Curitiba
Prof. Amauri Assef
Disciplina de Sistemas MicrocontroladosDisciplina de Sistemas Microcontrolados
Contador/Contador/TemporizadorTemporizador TIMER 0 TIMER 0 -- PIC16F877APIC16F877A
Prof. Amauri AssefProf. Amauri Assef
[email protected]@utfpr.edu.br
Contador/Temporizador Timer 0Contador/Temporizador Timer 0
Contador/Contador/TemporizadorTemporizador Timer 0 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
2UTFPR – Campus Curitiba
Prof. Amauri Assef
� 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 0Contador/Temporizador Timer 0
T0SE T0CSPSA
Diagrama em bloco do TIMER 0Diagrama em bloco do TIMER 0
3UTFPR – Campus Curitiba
Prof. Amauri Assef
PS2:PS0
T0CSPSA
PSA
PSA
Contador/Temporizador Timer 0Contador/Temporizador Timer 0
Registrador de configuração do TIMER 0 Registrador de configuração do TIMER 0 –– OPTION_REGOPTION_REG
� Bit 7 - /RBPU � Bit 2-0 – PS2:PS0: Bits de seleção da taxa do prescaler
4UTFPR – Campus Curitiba
Prof. Amauri Assef
� 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
Contador/Temporizador Timer 0Contador/Temporizador Timer 0
InterrupçãoInterrupção
� Pode ser causada por evento interno ou externo:
� Mudança de estado no pino
� Overflow do timer
� Conversão do A/D
5UTFPR – Campus Curitiba
Prof. Amauri Assef
� 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
� PCLATH
� Limpar o bit de sinalização da interrupção, por exemplo
BCF INTCON, TMR0IF
Contador/Temporizador Timer 0Contador/Temporizador Timer 0
Registro de Interrupção Registro de Interrupção -- INTCONINTCON
� Bit 7 – GIE: Bit Global Interrupt Enable – Habilitação global das interrupções
6UTFPR – Campus Curitiba
Prof. Amauri Assef
� 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 0Contador/Temporizador Timer 0
Interrupção do Timer 0 Interrupção do Timer 0
DESCRIÇÃO
7UTFPR – Campus Curitiba
Prof. Amauri Assef
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 0Contador/Temporizador Timer 0
Contador/Contador/TemporizadorTemporizador Timer 0 Timer 0
RESUMO DOS REGISTRADORES DO TIMER 0
8UTFPR – Campus Curitiba
Prof. Amauri Assef
Contador/Temporizador Timer 0Contador/Temporizador Timer 0
Exemplo de cálculo para o TIMER 0Exemplo 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
PRESCALER TEMPO
1:2 256μs
1:4 512μs
9UTFPR – Campus Curitiba
Prof. Amauri Assef
� TTMR = 4 / 8M = 0,5μs
� TESTOURO = 256 * 0,5μs = 128μs (ver prescale)
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 0Contador/Temporizador Timer 0
Programa principal (Programa principal (AssemblyAssembly):):
INICIO BANK1
MOVLW 0X00
MOVWF TRISD ; CONFIGURA PORTD COMO SAÍDA
MOVLW B'00000011‘ ; TIMER 0 -> PRESCALER DE 1:16
MOVWF OPTION_REG
Configura o PIC16F877A
10UTFPR – Campus Curitiba
Prof. Amauri Assef
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
Contador/Temporizador Timer 0Contador/Temporizador Timer 0
Programa principal (C):Programa principal (C):
void main() {
OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0
TRISD = 0x00; // PORTB COMO SAÍDA
PORTD = 0x00; // VALOR INICIAL = 00
11UTFPR – Campus Curitiba
Prof. Amauri Assef
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 0Contador/Temporizador Timer 0
Habilitação da interrupção do TIMER0:Habilitação da interrupção do TIMER0:
a) a) AssemblyAssemblyMOVLW B‘10100000' ; TIMER 0 -> PRESCALER DE 1:16
; ||| ---------> HABILITA A INTERRUPÇÃO DO TIMER0
; | ---------> HABILITA A INTERRUPÇÃO GLOBAL
12UTFPR – Campus Curitiba
Prof. Amauri Assef
; | ---------> HABILITA A INTERRUPÇÃO GLOBAL
MOVWF INTCON
b) CINTCON = 0xB10100000;
Contador/Temporizador Timer 0Contador/Temporizador Timer 0
Habilitação da interrupção do TIMER0:Habilitação da interrupção do TIMER0:
void interrupt (){
INTCON.F2 = 0; // LIMPA O BIT DE OVERFLOWPORTD = ~PORTD;
}
13UTFPR – Campus Curitiba
Prof. Amauri Assef
void main() {OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0TRISD = 0x00; // PORTB COMO SAÍDAPORTD = 0x00; // VALOR INICIAL = 00TMR0 = 0X00; // LIMPA TMR0INTCON = 0B10100000; // INT DO TIMER0 HABILITADA
while(1) { }}