Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Para que se tenha um cronometro efetivo, não deve-se lançar mão das rotinas
de tempo baseadas em atrasos, pois essas rotinas vão acumular erros
indesejáveis no sistema.
O melhor a fazer, é utilizar a interrupção por Timer, que ocorre em tempo
sincronizado, independente da tarefa que o dispositivo esteja executando.
CRONOMETRO
Então como obter esse tempo todo sem que o programa fique parado.
Para essa tarefa usamos o contador TIMER 0, esse contador tem um registro
de 8 bits, logo o valor máximo que ele consegue armazenar é 255, se a
contagem ultrapassar esse valor, ele causa uma interrrupção.
O tempo de incremento do contador, pode ser configurado através dos BITS 0
a 2 do registrador OPTION REG, bits estes que compõem a tabela de PRE-
SCALE mostrada na página 37.
Para realizar essa configuração deve-se levar em conta que o sistema é digital,
logo é preciso evitar números fracionários.
Como a base é 1 segundo ou 1000000 de micro-segundos, temos que
1000000 não é divisível por 255, então o número mais elevado que divide
1000000 é 250.
1000000/250 = 4000 como 4000 é maior que o limite de um byte, usamos um
contador auxiliar para dividir esse valor de forma a caber 8 bits. Fazendo
4000/250 = 16. Desta forma chegamos ao valor de configuração do prescale.
1:16.
É possível usar outros valores respeitando a relação de resultados inteiros.
Ex. 1000000/125 = 8000 / 125 = 32.
- RCON
- INTCON
- INTCON2
- PIR1, PIR2
- PIE1, PIE2
- IPR1, IPR2
- Enable (habilitar): bit que permite que o programa desvie para o endereço de
vetor de interrupção quando o bit sinalizador (Flag) está definido.
Nota:
Nota:
REGISTER 9-1:
Quando IPEN = 0:
Quando IPEN = 1:
Quando IPEN = 0:
Quando IPEN = 1:
1 = Pelo menos um dos RB < 7: 4 > pinos de estado alterado (deve ser limpo
em software)
Nota 1:
REGISTRO 9-2:
bit 7 RBPU: Bit que habilita puxar para cima (pull – up) PORTB
1 = Interromper na subida
1 = Interromper na subida
1 = Alta prioridade
0 = Baixa prioridade
1 = Alta prioridade
0 = Baixa prioridade
Nota:
Módulo TIMER 0
1 = Aciona o Timer0
0 = Para o Timer0
Código exemplo
while(1)
{
if(!botao)
{
__delay_ms(10);
while(!botao){}
TMR0IE=!TMR0IE; // inverte estado do TMR0IE - liga desliga relógio
}
if(!PORTCbits.RC0)
__delay_ms(10);
while(!PORTCbits.RC0){}
lcd_clear(); // inverte estado do TMR0IE - liga desliga relógio
}
}
}
void escreve(void)
{
lcd_clear();
lcd_goto(0);
lcd_puts("interrupcao");
lcd_goto(0x40);
lcd_puts("pressionado");
}