Есть обработчик прерывания(1 мс)
Код
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
TCNT2=0x83; //сразу переинициализируем таймер
// Place your code here
timer++;
if ((timer%2000) == 0)lcdUpdateStatus = 1;
if (timer == 10000)
{
timer = 0;
}
}
и есть функция
Код
void systemCheck()
{
uchar i;
if (systemBusy)return;
systemBusy = 1;
ADMUX = ADC_U_MINUS;
for (i = 0; i < 20; i++)
{
ADCSRA.6 = 1;
while(ADCSRA.6 != 0);
}
currSysStatus.Uminus = adc_data; //currSysStatus глобальная структура
ADMUX = ADC_U_PLUS;
for (i = 0; i < 20; i++)
{
ADCSRA.6 = 1;
while(ADCSRA.6 != 0);
}
currSysStatus.Uplus = adc_data;
selectInput(MULTIPLEX_L_TEMP);//выбираем соот. вход мультиплексора
ADMUX = ADC_MULTIPLEX;
for (i = 0; i < 20; i++)
{
ADCSRA.6 = 1;
while(ADCSRA.6 != 0);
}
currSysStatus.temp_L = adc_data;
selectInput(MULTIPLEX_R_TEMP); //выбираем соот. вход мультиплексора
for (i = 0; i < 20; i++)
{
ADCSRA.6 = 1;
while(ADCSRA.6 != 0);
}
currSysStatus.temp_R = adc_data;
systemBusy = 0;
}
Если вызывать функцию из основного тела программы(напр., цикла в main() каждые 2000 мс), то все так, как надо
Цитата
Umin 1023 Uplus 0, ACErr 0 Lalar 0 Ralar 0 Ltemp 275 Rtemp 254
но если я вызываю из обработчика прерывания каждые 2000, то валится какой-то бред..
Цитата
Umin 259 Uplus 0, ACErr 0 Lalar 0 Ralar 0 Ltemp 259 Rtemp 259
Функция критична, так как в ней фактически реализован контроль за питанием усилителя.. вызывать из основного тела нереально ввиду того, что есть многоуровневое меню.. Что я не так делаю, и какие есть варианты.. мне нужно быть уверенным, что функция ТОЧНО вызовется через каждые 50 мс..