duraçao de uma interrupçao

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

duraçao de uma interrupçao

Mensagempor cristian » 02 Dez 2009 15:12

galera fiz um codigo q vai ler uns pulsos com duraçao de 200ms nivel alto e 100ms nivel baixo como é coletor aberto estou lendo o nivel baixo usando o ccp e timer 1 dessa forma:



#int_TIMER1
void TIMER1_isr(void)
{
set_timer1(55536);
buf_pulso++;
}

#int_ccp1
void ccp_isr(void)
{//verificar estouro de timer 1
if(!borda)//se borda for 0
{
borda=1;
MEDIR_TEMPO=1;
set_timer1(55536);//zera contador
setup_timer_1(T1_internal);//liga o timer 1
setup_ccp1(CCP_CAPTURE_rE);//borda descida
}else
{
borda=0;
RESET_TIMER=0;
MEDIR_TEMPO=0;
setup_timer_1 ( T1_DISABLED );
nivel_high=buf_pulso;
NIVEL_HIGH+=1;
buf_pulso=0;
setup_ccp1(CCP_CAPTURE_FE);//borda subida
//---------------------------------------------------ja salva os pulsos no buf
if(nivel_high<12 && nivel_high>8) //verifica se o pulso esta dentro do padrao
{ //SIM
pulsos++;
// buf[ind]=pulsos; //salva os pulsos no BUF
// pulsos=0;
// ind++;
// if(ind>10){ind=0;}
pulsos_salvos=1;
//printf("P=%u\r\n",nivel_high);
}
//----------------------------------------------------fim

}
}

mas acontece q volta e meia perco um pulso tipo se mando 10 so conta 9 e assim vai estou desconfiando q o timer0 consome um tempo nao deixando a interrupçao do ccp acontecer no tempo certo

este é o timer0


//----------------------------------------------------- ------------------------TIMER 0
#int_TIMER0
void TIMER0_isr(void)
{
static int tm1,tm3,tm4,tm6,tm7=250,tempoRtc;
TM1++;

//----------------------------------------------------------------DISPLAY
IF(MEDIR_TEMPO)
{RESET_TIMER++;
if(RESET_TIMER==200)
{
MEDIR_TEMPO=0;
setup_timer_1 ( T1_DISABLED );
setup_ccp1(CCP_CAPTURE_FE);//borda subida
}
}
if(tm1==attdisplay)
{
tm1=0;
switch (PonteiroDisplay) //Alterna Display
{
case 0:
output_low(U);
Display=DEZ;
output_D(mask(display));
output_high(D);
break;
case 1:
output_low(D);
Display=UNI;
output_D(mask(display));
output_high(U);
break;
default:
PonteiroDisplay=0;
break;
}//switch (PonteiroDisplay).
if(++PonteiroDisplay >=2)PonteiroDisplay=0;
//output_D(mask(display));
}//----------------------------------------------------------------PISCA LED 1
if(piscaled1)
{
if(!tm2--)
{
tm2=flash;
led_s=!led_s;
output_bit( led1, led_s);
}
}else
{
output_high(led1);
}
//----------------------------------------------------------------PISCA LED 2
if(piscaled2)
{
if(!tm5--)
{
tm5=flash2;
led2_s=!led2_s;
output_bit( led2, led2_s);
}
}

//---------------------------------------------------------------0,5TIMER
if(timer_pulso)
{
if(pulsos)
{
if(!timer_500ms--)
{
timer_pulso=0;
trat_pulso=1;

}
}
}
//---------------------------------------------------------------1 seg TIMER
if(timer_1seg)
{
if(!tm6--)
{
timer_1seg=0;
tm6=248;
modo=1;//para botao B
}
}
//---------------------------------------------------------------ler rtc
if(!--tempoRtc)
{
tempoRtc=250;
ler_hora=1;
}
//---------------------------------------------------------------TIMER botao H
if(hab_botaoH)
{
if(!tm7--)
{
if(!tmp_30--)
{
tmp_30=30;
desbtnH=1;
}
tm7=250;
}
}
//----------------------------------------------------incrementa contador
if(off_rele)
{
tm4++;
if(tm4==15)// 250MS
{
tm4=0;
off_rele=0;
output_low(rele1);
}
}

if(incr_contador)
{
//rele armar e desarmar
tm3++;


//---------------------------------SINAL SONORO
if(tm3==tempo_att)// 250MS
{
tm3=0;
if(beep)
{
output_high(rele1);
off_rele=1;
}
//-----------------------------------------------INCREMENTA DISPLAY
uni+=1;
if (uni>9)
{dez+=1;
uni=0;
if(dez>9)
{

uni=0;
dez=0;
//falta colocar acima de 99 pisca display
// OUTPUT_low(PONTO);
output_high(PONTO);//DESLIGA PONTO
}
}
if(!--NumPulsos)
{
tm3=0;
incr_contador=0;
display_pronto=1;
//output_low(rele1);
//write_EXT_eeprom(10,2);

}
}

}
//-----------------------------------------------------------------------------
}//timer 0


estou usando o pic16f877 com CCS 4.093 com 4mhz

pensei em mudar o crsital para 8mhz ou mesmo tirar estas funçoes do timer0 para ser mais rapido

o que vcs sugerem[/code]
cristian
Word
 
Mensagens: 570
Registrado em: 03 Nov 2006 08:15
Localização: serrinha-ba

Mensagempor Djalma Toledo Rodrigues » 02 Dez 2009 16:44

A Técnica para medir Largura de Pulso com CCP:

Tirmer "Roda" continuamente, como os Pulsos possuem duração de ~200 ms há que
acionar Pré Scaler

Borda Descida CCP captura e salva

Borda de subida CCP captura

A Duração é esta última captura menos a anterior

Se resultado for negativo é porque Timmer Overflow

Neste caso: Duração = (256 - Prim. Captura) + Captura Atual

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x