Download - Apresentação TIMER0 PIC16F877A 2016
1UTFPR – Campus CuritibaProf. 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 MicrocontroladosContador/Temporizador TIMER 0 - PIC16F877A
Prof. Amauri [email protected]
Contador/Temporizador Timer 0
2UTFPR – Campus CuritibaProf. 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
3UTFPR – Campus CuritibaProf. Amauri Assef
T0SE
PS2:PS0
T0CSPSA
PSA
PSA
Diagrama em bloco do TIMER 0
Contador/Temporizador Timer 0
4UTFPR – Campus CuritibaProf. 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
5UTFPR – Campus CuritibaProf. 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
6UTFPR – Campus CuritibaProf. 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
7UTFPR – Campus CuritibaProf. 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
8UTFPR – Campus CuritibaProf. Amauri Assef
Contador/Temporizador Timer 0
RESUMO DOS REGISTRADORES DO TIMER 0
Contador/Temporizador Timer 0
9UTFPR – Campus CuritibaProf. 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
10UTFPR – Campus CuritibaProf. Amauri Assef
Programa principal (Assembly):
INICIO BANK1MOVLW 0X00MOVWF TRISD ; CONFIGURA PORTD COMO SAÍDAMOVLW B'00000011‘ ; TIMER 0 -> PRESCALER DE 1:16MOVWF OPTION_REGBANK0
CLRF PORTD
TESTE BTFSS INTCON,TMR0IF ; VERIFICA SE OCORREU OVERFLOW DO T0GOTO TESTEBCF INTCON,TMR0IF ; LIMPA BIT DE OVERFLOWCOMF PORTD,F ; INVERTE O PORTD A CADA OVERFLOW DO T0GOTO TESTE
Configura o PIC16F877A
Contador/Temporizador Timer 0
11UTFPR – Campus CuritibaProf. Amauri Assef
Programa principal (C) – MikroC:
void main() {OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0TRISD = 0x00; // PORTB COMO SAÍDAPORTD = 0x00; // VALOR INICIAL = 00TMR0 = 0X00; // LIMPA TMR0while(1) {
if (INTCON.F2) // TESTA O BIT DE OVERFLOW{INTCON.F2 = 0; // LIMPA O BIT DE OVERFLOWPORTD = ~PORTD;
}}
}
Contador/Temporizador Timer 0
12UTFPR – Campus CuritibaProf. Amauri Assef
Programa principal (C) – MikroC Pro:
void main() {OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0TRISD = 0x00; // PORTB COMO SAÍDAPORTD = 0x00; // VALOR INICIAL = 00TMR0 = 0X00; // LIMPA TMR0while(1) {
if (INTCON.TMR0IF) // TESTA O BIT DE OVERFLOW{INTCON.TMR0IF = 0; // LIMPA O BIT DE OVERFLOWPORTD = ~PORTD;
}}
}
Contador/Temporizador Timer 0
13UTFPR – Campus CuritibaProf. Amauri Assef
Habilitação da interrupção do TIMER0:
a) AssemblyMOVLW B‘10100000' ; TIMER 0 -> PRESCALER DE 1:16
; ||| ---------> HABILITA A INTERRUPÇÃO DO TIMER0; | ---------> HABILITA A INTERRUPÇÃO GLOBAL
MOVWF INTCON
b) CINTCON = 0B10100000;
Contador/Temporizador Timer 0
14UTFPR – Campus CuritibaProf. Amauri Assef
Habilitação da interrupção do TIMER0:#define LEDS PORTDvoid interrupt (){
INTCON.TMR0IF = 0; // LIMPA O BIT DE OVERFLOWLEDS = ~LEDS;
}
void main() {OPTION_REG = 0B000000011; // ATRIBUIÇÃO DO PRESCALER PARA TIMER0TRISD = 0x00; // PORTD COMO SAÍDALEDS = 0x00; // VALOR INICIAL = 00TMR0 = 0X00; // LIMPA TMR0INTCON = 0B10100000; // INT DO TIMER0 HABILITADA
while(1) { }}
Contador/Temporizador Timer 0
15UTFPR – Campus CuritibaProf. 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
16UTFPR – Campus CuritibaProf. 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.