You are on page 1of 16

UNIVERSIDADE TECNOLGICA FEDERAL DO PARAN

DEPARTAMENTO ACADMICO DE ELETROTCNICA


CURSO DE ENGENHARIA INDUSTRIAL ELTRICA TECNOLOGIA
EM AUTOMAO INDUSTRIAL

Sistemas Digitais e Microcontrolados


Contador/Temporizador TIMER 0 - PIC16F877A

Prof. Amauri Assef


amauriassef@utfpr.edu.br

UTFPR Campus Curitiba


1
Prof. Amauri Assef
Contador/Temporizador Timer 0

Contador/Temporizador Timer 0
CARACTERSTICAS
Contador binrio de 8 bits (0x00 0xFF)
Prescaler programvel (divisor de frequncia)
Seleo de clock interno ou externo
Interrupo de overflow de 0xFF para 0x00
Seleo de borda para clock externo (subida ou descida)
Registro de contagem TMR0 (endereo 0x01 banco 0)

FUNES BSICAS
Contagem de eventos externos (clock de entrada no pino RA4/T0CKI)
Temporizao (contagem de tempo) para clock interno (fclk / 4)

UTFPR Campus Curitiba


2
Prof. Amauri Assef
Contador/Temporizador Timer 0

Diagrama em bloco do TIMER 0

T0SE T0CS
PSA

PS2:PS0
PSA

PSA

UTFPR Campus Curitiba


3
Prof. Amauri Assef
Contador/Temporizador Timer 0

Registrador de configurao do TIMER 0 OPTION_REG

Bit 7 - /RBPU Bit 2-0 PS2:PS0: Bits de seleo da taxa do prescaler


Bit 6 INTEDG
Bit 5 T0CS: Bit de seleo da fonte de clock do TIMER 0
0 Interno
1 Transio do pino T0CKI
Bit 4 T0SE: Bit de seleo da borda do TMR0
0 Incrementa na transio 1 para 0 do pino T0CKI
1 Incrementa na transio 0 para 1 do pino T0CKI
Bit 3 PSA: Bit de atribuio do prescaler
0 Prescaler para o TIMER 0
1 Prescaler para p WDT

O registro OPTION_REG fica no BANCO 1, endereo 0x81

UTFPR Campus Curitiba


4
Prof. Amauri Assef
Contador/Temporizador Timer 0

Interrupo
Pode ser causada por evento interno ou externo:
Mudana de estado no pino
Overflow do timer
Converso do A/D
Endereo de retorno salvo na pilha
Vetor de interrupo no endereo 0x04
Retorno da interrupo com a instruo RETFIE
Salvamento de contexto
W, STATUS e PCLATH
Limpar o bit de sinalizao da interrupo, por exemplo
BCF INTCON, TMR0IF (Assembly)
INTCON.TMR0IF = 0 (C) ou TMR0IF_bit = 0

UTFPR Campus Curitiba


5
Prof. Amauri Assef
Contador/Temporizador Timer 0

Registro de Interrupo - INTCON

Bit 7 GIE: Bit Global Interrupt Enable Habilitao global das interrupes
0 Desabilita todas as interrupes
1 Habilita todas as interrupes desmascaradas
Bit 5 TMR0IE: Bit de habilitao da interrupo de overflow do TIMER0
0 Desabilita a interrupo do TMR0
1 Habilita a interrupo do TMR0
Bit 2 TMR0IF: Bit de sinalizao da interrupo de overflow do TIMER0
0 TIMER0 sem overflow
1 TIMER0 com overflow

UTFPR Campus Curitiba


6
Prof. Amauri Assef
Contador/Temporizador Timer 0

Interrupo do Timer 0

DESCRIO
A interrupo 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 interrupo pode ser mascarada resetando o bit TMR0IE do registro INTCON
O bit TMR0IF deve ser resetado por software para habilitar nova interrupo

UTFPR Campus Curitiba


7
Prof. Amauri Assef
Contador/Temporizador Timer 0

Contador/Temporizador Timer 0

RESUMO DOS REGISTRADORES DO TIMER 0

UTFPR Campus Curitiba


8
Prof. Amauri Assef
Contador/Temporizador Timer 0

Exemplo de clculo para o TIMER 0


Utilizando o TIMER 0, escrever um programa para inverter o contedo do PORTD
a cada 2ms (clock de 8MHz):
PRESCALER TEMPO
1:2 256s
FCLK = 8MHz
TTMR = 4 / 8M = 0,5s 1:4 512s
TESTOURO = 256 * 0,5s = 128s (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 <= B0000 0011


UTFPR Campus Curitiba
9
Prof. Amauri Assef
Contador/Temporizador Timer 0

Programa principal (Assembly):


INICIO BANK1
MOVLW 0X00
Configura o MOVWF TRISD ; CONFIGURA PORTD COMO SADA
PIC16F877A
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
UTFPR Campus Curitiba
10
Prof. Amauri Assef
Contador/Temporizador Timer 0

Programa principal (C) MikroC:

void main() {
OPTION_REG = 0B000000011; // ATRIBUIO DO PRESCALER PARA TIMER0
TRISD = 0x00; // PORTB COMO SADA
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;
}
}
}
UTFPR Campus Curitiba
11
Prof. Amauri Assef
Contador/Temporizador Timer 0

Programa principal (C) MikroC Pro:

void main() {
OPTION_REG = 0B000000011; // ATRIBUIO DO PRESCALER PARA TIMER0
TRISD = 0x00; // PORTB COMO SADA
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;
}
}
}
UTFPR Campus Curitiba
12
Prof. Amauri Assef
Contador/Temporizador Timer 0

Habilitao da interrupo do TIMER0:

a) Assembly
MOVLW B10100000' ; TIMER 0 -> PRESCALER DE 1:16
; ||| ---------> HABILITA A INTERRUPO DO TIMER0
; | ---------> HABILITA A INTERRUPO GLOBAL
MOVWF INTCON

b) C
INTCON = 0B10100000;

UTFPR Campus Curitiba


13
Prof. Amauri Assef
Contador/Temporizador Timer 0

Habilitao da interrupo do TIMER0:


#define LEDS PORTD
void interrupt ()
{
INTCON.TMR0IF = 0; // LIMPA O BIT DE OVERFLOW
LEDS = ~LEDS;
}

void main() {
OPTION_REG = 0B000000011; // ATRIBUIO DO PRESCALER PARA TIMER0
TRISD = 0x00; // PORTD COMO SADA
LEDS = 0x00; // VALOR INICIAL = 00
TMR0 = 0X00; // LIMPA TMR0
INTCON = 0B10100000; // INT DO TIMER0 HABILITADA

while(1) { }
}

UTFPR Campus Curitiba


14
Prof. Amauri Assef
Contador/Temporizador Timer 0

Exerccio 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.

Exerccio 2
Desenhar o fluxograma e escrever o firmware para executar as seguintes
funes:
1. Dentro da interrupo 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 contrrio. Obs: testar o pino de acionamento
RE0 ou RE1 para a seleo do display.
2. No lao principal, escrever a funo para que o Rele conectado no pino RE2
seja acionado/desacionado com atraso de 2 segundos implementado por
software.
UTFPR Campus Curitiba
15
Prof. Amauri Assef
Contador/Temporizador Timer 0

Exerccio 3
Desenhar o fluxograma e escrever o firmware para executar as seguintes
funes:
1. Dentro da interrupo 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 contrrio. Obs : testar o pino de acionamento
RE0 ou RE1 para a seleo do display.
2. No lao 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.

UTFPR Campus Curitiba


16
Prof. Amauri Assef

You might also like