реклама на сайте
подробности

 
 
> Вызов функции из interrupt [TIM2_OVF], неправильно обрабатывает данные
Savrik
сообщение Feb 3 2010, 00:56
Сообщение #1


наблюдаю..
***

Группа: Свой
Сообщений: 291
Регистрация: 11-12-06
Из: Украина
Пользователь №: 23 369



Есть обработчик прерывания(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 мс..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smac
сообщение Feb 3 2010, 04:56
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Savrik @ Feb 3 2010, 03:56) *
Что я не так делаю, и какие есть варианты.. мне нужно быть уверенным, что функция ТОЧНО вызовется через каждые 50 мс..

Вызывать функции из обработчиков прерываний совсем не комильфо, но если очень хочется, тогда нужно обратить внимание на стек ну и ассемблерный листинг неплохо бы посмотреть.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 06:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01351 секунд с 7
ELECTRONIX ©2004-2016