Gostaria da ajuda de vocês para solucionar um problema que ainda não consegui resolver.
Na minha programação para o PIC 16F877A estou incluindo um frequencímetro no pino C0 utilizando TIMER1. Acontece que quando uma determinada frequência é lida nesse pino, um LED deve piscar no pino C1. Quando fui fazer a programação na função main sem utilizar interrupções, não deu certo. O LED não piscava devido aos delays que sobrecarregam o processador quando é acionado juntamenteo com a função para o frequencimetro. Então coloquei essa instrução do LED em uma interrupção de TIMER0 e mantive o frequencimetro na função 'main'. Ocorre que o frequencimetro utiliza um delay de 1000ms para a leitura e quando as duas funções são iniciadas, mesmo com o LED na interrupção, há um offset na leitura do frequencimetro de 60 a 80 Hz para mais, o que é incaceitável. Isso é comprovado com um gerador de função conectado no pino C0.
Não encontrei nenhum frequencimetro na internet que utilize os ticks ao invés dos delays para fazer esse papel, para o compilador CCS que utilizo. Somente para o MIKROC. Sou iniciante em programação e não sei converter esse código ainda. No entanto, achei uma solução que pareceu resolver o meu problema em termos. Não achei para o TIMER0 mas achei um código para o LED ser colocado em uma interrupção de TIMER2 e fiz algumas modificações. O frequencimetro é utilizado na função main com o TIMER1, mas também utiliza o TIMER2 do led para o 'count'.
Aqui está o código da interrupção do LED:
cpp code
#define PER_SECOND 126 //valor que calculei para a correta leitura do frequencimetro baseado no timer2
#int_timer2
void TimerLED()
{
static int8 led_count;//=(PER_SECOND)
// a instrução original era PER_SECOND -1 para o LED piscar em cada 1s.
if (led_count)
--led_count;
else
{
output_toggle(PIN_C1);
led_count=(6); // 126 - (PER_SECOND = 120)
}
if (count)
--count;
O frequencimetro na função main:
cpp code
{
setup_timer_2(T2_DIV_BY_16,249,10); //seria 125 interrupções p/ segundo, mas na prática o valor de 126 é o correto
setup_timer_1(t1_external | T1_DIV_BY_1);
count=1;
while (count) ; //wait for interrupt
count=(PER_SECOND-1);
set_timer1(0);//start the count
while(count)
; //wait for one second
setup_timer_1(T1_DISABLED);
value=get_timer1(); }
Tudo está funcionando. Mas o meu problema é que possuo 3 condições para a piscada do LED. De acordo com a frequencia que é lida, ele pisca mais rápido para a frequência certa, mais lento para um offset de mais ou menos um valor e mais lento ainda quando esse valor é ainda maior. Acontece que não estou conseguindo uma instrução para utilizar na função main como 'if' que faça isso.
Ou seja, ele já inicia o 'rate' de piscada no valor (6) que já está dentro da interrupção. Esse valor será o utilizado para piscar mais rápido, juntamente com os valores 16 e 32 para piscar mais lento. Já tentei colocar uma variável lá e trazer os valores para a condição 'if' na função main, mas não funciona, ele pisca aleatoriamente lento além do que o frequencimetro fica com leitura alterada com offset gigantesco.
Como esse código dentro da interrupção deve ser escrito para que eu consiga na função main, controlar a taxa de piscada do LED em 3 condições diferentes e que também não afete a leitura do frequencimetro?
Obrigado e abraços.