lpagano escreveu:Mixicus,
Primeiramente seja benvindo ao nosso fórum.
Quanto à sua dúvida essa idéia do timer é boa mas como ele conta ciclos de máquina dividido pelo seu prescaler você teria que pegar o valor do timer ao final do nível 0, tirar do valor inicial (diferença entre início e fim do timer) e multiplicar por um fator que dê o tempo em ms. Aí você quarda esse valor numa variável e o joga no LCD.
O MikroC tem bibliotecas prontas e bem eficientes para trabalhar com LCD
É uma resumo simples mas espero ter ajudado.
Valeu!
Olá...
Estava tentando montar um esboço para praticar o prescaler do TIMER0, mas quando diminuo ele de 5 para 3 (OPTION_REG=5 para OPTION_REG=3), o valor do contador não é mais mostrado no LCD.
Este programa serve apenas para ver se o prescaler esta funcionando para começar a trabalhar com o TIMER0.
Como disse, sou iniciante em programação e desculpe qualquer besteira no programa hehe.
Gostaria de que me ajudassem a descobrir qual o problema do programa para dar continuidade à ele.
Abraços.
Segue abaixo o programa q fiz:
//INCLUSÕES DE ARQUIVOS FONTE
#include <C:\Arquivos de programas\Mikroelektronika\mikroC\Uses\ceprob.c>
#include <C:\Arquivos de programas\Mikroelektronika\mikroC\Uses\lcd.c>
//****************************************************************
//DEFINIÇÕES DAS ENTRADAS
#define chave RA7
//****************************************************************
//DEFINIÇÕES DAS SAÍDAS
//****************************************************************
// VARIÁVEIS GLOBAIS
char contador; // Variável de 8 bits
unsigned tempo; // Variável de 16 bits
//****************************************************************
void interrupt() // Início da rotina de interrupção
{
if(T0IF) // Verifica se a interrupção foi do Timer0
{
T0IF=0; // Se foi, limpa o flag de indicação
if(TMR0==0) // Quando o TIMER0 estourar sua contagem...
{ // ...terá passado 64us x 125 = 8ms
tempo--; // A cada 8ms decrementa o "tempo"
if(tempo==0) // Quando o "tempo" chegar a "zero"...
{ // ...terá passado 8ms x 125 = 1 segundo
contador++; // Incrementa o contador
if(contador==10) // Se o contador chegar a 10...
{
contador=0; // ...zera o contador
}
tempo=125; // O "tempo" é recarregado com 125
}
TMR0=131; // O TIMER0 é recarregado com 131
}
}
}
//****************************************************************
//ROTINA PRINCIPAL
void main() // Início do programa principal
{
TRISB = 0b00000000; // Todos os pinos do PortB como saída
PORTB = 0b00000000; // PortB é carregado
CMCON = 0x07; // Desabilita os comparadores de tensão
GIE=1; // Habilitação geral das interrupções
T0IE=1; // Habilitação da interrupção do Timer0
OPTION_REG=0x83; // Prescaler do Timer0 em 1:64
TMR0=131; // Carrega o Timer 0 para que ocorra uma interrupção a cada 8ms
tempo=125; // Carrega o tempo com 125
contador=0; // Contador inicia com o valor 0
lcd_inicia(); // Rotina para iniciar o LCD
lcd_limpa(); // Limpa o LCD
//****************************************************************
while(1)
{
lcd_posiciona(1,1); // Posiciona o cursor na linha 1 e coluna 1
lcd_valor(contador); // Imprimi o valor do contador no LCD
}
} // Fim do programa principal