Olá, pessoal.
Estou fazendo um programa para controlar o disparo de 1 triac com o pic 16f877a, mplab e compilador ccs. Durante os testes descobrimos que ele não está fazendo as contas da chamada de interrupção e, quando colocamos o delay em ms, ele não o faz corretamente.
Eis parte do código fonte:
#int_ccp1 //Interrupção gerada pela entrada CCP1
void detecta_zero()
{
if (liga == 1)
{ // Lembrando que o período desejado para controle é de 8,333ms (1 semi-ciclo de 60Hz)
fase = 8 - (0.08*saida_perc); // converte a saída percentual desejada para tempo
delay_ms(fase); // delay para disparo do triac na fase correta
output_high(pin_c0); // seta a saída de disparo do triac
delay_us(100); // largura do pulso de disparo do triac
output_low(pin_c0); // reseta a saída de disparo do triac
}
}
Com esse código ele fica dando pulsos aleatórios (para mim) e não no tempo que eu especifiquei. Também gera avisos de desligamento da interrupção para não causar reentrâncias. Li que teria de desabilitar o flag da interrupção depois de tratada, então acrescentei a seguinte linha:
#asm
BCF PIR1, CCP1IF ;
#endasm
mas o compilador não aceita e dá erro. Não reconhece o PIR1 e nem o CCP1IF.
O que fazer???
Ah, configurei as portas dessa forma:
/* No modo captura, a entrada CCP1 gerará uma interrupção toda vez que houver a borda de subida. Dessa forma será
possível efetuar o disparo do TRIAC no tempo desejado. */
setup_ccp1(CCP_CAPTURE_RE); // coloca a entrada CCP1 em modo de captura com sensibilidade na borda de subida
setup_timer_1(T1_INTERNAL); // habilita o timer 1 com clock interno
enable_interrupts(INT_CCP1); // habilita a interrupção de CCP1
enable_interrupts(GLOBAL); // habilita as interrupções selecionadas, no nosso caso a interrupção de CCP1
Desde já agradeço a ajuda.
Abraço,