PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: LEITURA DE IMAGENS, GRÁFICOS E MA...
AA Apresentacao_TIMER0_PIC16F877A_2016.pdf
1. 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
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)
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
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.