Здравствуйте, Сергей!
Спасибо за участие и дельные советы!!!
Зарелизил обработку прерывания ТА1, как Вы предложили. Теперь выглядит так:
Код
#pragma vector=TIMERA1_VECTOR
__interrupt void ta_interrupt_routine(void)
{
unsigned uTAIVcopy=TAIV;
switch(uTAIVcopy)
{
case 0x04:
fTime=fTimeCounter;
fTimeCounter=0;//обнуляем счетчик таймера.
fTime0=fTime1;
fTime1=TACCR2;
cFreqFalse++;//Задержка для выравнивания fTime,fTime0,fTime1.
break;
case 0x0a:
fTimeCounter++;//инкрементируем счетчик таймера.
default:
_NOP();
}
}
Расчет частоты сделал так:
Код
void main(void)
{
…
//Определяем частоту:
if(cFreqFalse>3) //Задержка для выравнивания fTime,fTime0,fTime1.
{
_DINT();
fFreq=1/(2*(fTime*3.90625e-3+(fTime1-fTime0)*30.517578125e-6));
cFreqFalse=0;
_EINT();
}
…
}
Ошики стали появляться реже…
Поставил точку останова после расчета частоты и при 50Гц их вообще не обнаружил, однако в реальном времени ошибки периодически случаются (всмысле при 50Гц). На частоте 20Гц ошибки появляются ~2...3 через 5…7 отсчетов. Т.е. при снижении частоты ошибки появляются чаще…
Что еще можно сделать???
Сообщение отредактировал A R T - Feb 15 2007, 07:27