Отправлено
gluck35533 (82.204.231.26) 09 июня 2010, г. 00:40
Пишу на CodeVisionAVR програму которая подсчитывает число статистически распределенных импульсов за единицу времени. Импульсы подаются на счетный вход таймера1 (16-bit) и регистрируются по фронту.Максимальная частота следования импульсов 5 кГц.Минимальная пауза между импульсами 200 мкс.Подсчитываю интенсивность за 1 сек и пересчитываю ее в попугаи. Временной интервал в 1 сек. формируется таймером2 работающим от внешнего часового кварца (асинхронно). В подпрограмме прерывания, которое происходит 1 раз в сек. по переполнению таймера2 производится считывание счетного регистра таймера1 и производятся вычисления. Вот кусок кода (подпрограмма обработчика прерывания):
// Reinitialize Timer 2 value TCNT2=0x80; // Place your code here if (POWER==0) goto exit; xren1=0; xren=0; Sn=TCNT1L; Sn=Sn+(TCNT1H<<8); S=S+Sn; t++; I=(float)(S/((t-tnach)-(dead_t*S))); Igamma=(float)(I/gamma_sens); Ibeta=(float)(((I*60)/7)/beta_sens); Ialfa=(float)(((I*60)/7)/alfa_sens); deltaS=sqrt(S); deltaI=(float)(deltaS/((t-tnach)-(dead_t*S))); if (I==0) { percent=100; goto x; } percent=(float)(100*(deltaI/I)); x: In=(float)Sn; del=labs(In-I); deltaSn=sqrt(Sn+1); if (I>90) {S=0; TCNT1H=0; TCNT1L=0; tnach=t; goto y;}; if ((del<(long)deltaI)||(del<(long)3*deltaSn)) {TCNT1H=0; TCNT1L=0;} else {S=0; TCNT1H=0; TCNT1L=0; tnach=t;} y: doza=doza+Igamma; doza1=(float)(doza/3600); doza2=(float)(doza/360000); if ((hour==23)&&(minute==59)&&(second==55)) jornal (); light_timer++; link_timer++; pclink(); if ((light_mode==3)&&(light_timer>=31)) LIGHT=0; exit: RTC (); conv_coplete=1; }
Проблема в том, что если мега работает на частоте 8 Мгц, то все вычисляется правльно, если предделителем тактовой частоты снижаешь ее до 2 МГц ради экономии электричества то появляется ошибка.Результат вычесления становится меньше процентов на 10. В чем может быть проблема?