Galera, fiz uns testes no Proteus e funcionaram direitinho, mas quando tentei simular o Timer0, o tempo que calculei não ficou compatível, era para inverter o estado da porta B0 a cada 1 seg. Ah, e o LED acende e nunca mais apaga hehehe
abaixo está o programa
Com o TMR0 começando a contar do 156 até o 256. Lembrando que o prescaler é de 1:1, então o calculo fica assim:
Valor inicial do TMR0 = 256 – 100 = 156
Calculando o tempo do timer0 x prescaler = tempo do estouro do timer0
Tempo do timer0 = 100
prescaler = 1
Tempo do estouro do timer0 = 100 x 1 = 100us
Tempo do estouro do timer0 = 100us
Valor do cont = (1s/ 100us) = (1000000us/100us) = 10000
cont = 10000
não acredito que tenha errado no cálculo, mas sei lá
por não apagar o led, acho que não estou ressetando o timer...
seria erro meu ou bug do proteus/mikroC? (prefiro ficar com a primeira opção)
int cont = 0;
void interrupt ( ) //rotina de interrupção
{
cont++; //incrementa o valor de cont a cada interrupção
TMR0 = 156; //Valor inicial para o Timer0, conta de 156 a 256
INTCON = 0x20; //Configura T0IE e limpa T0IF, em bin 0b00100000
}
void main ( )
{
OPTION_REG = 0x80; //Atribui prescaler de 1:1 ao TMR0
TMR0 = 156; //Valor inicial para o Timer0
INTCON = 0xA0; //habil. interrup. TMR0 e conf. os reg. GIE e T0IE
TRISB = 0b0; //configura o pino B0 como saída
PORTB = 0b0; //desliga o pino B0, LED apagado
cont = 0;
while(1)
{
if(cont >= 10000)
{
portb.f0 = ~ portb.f0; //inverte o estado do pino B0
cont = 0;
}
}
}
detalhe: nunca fiz na prática...