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

 
 
> Вызов функции из 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
Ответов
jasper
сообщение Feb 3 2010, 05:12
Сообщение #2


Народный чинитель
***

Группа: Участник
Сообщений: 415
Регистрация: 15-07-05
Пользователь №: 6 811



Возможно, следует объявить глобальные переменные, как volatile.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 3 2010, 08:00
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(jasper @ Feb 3 2010, 07:12) *
Возможно, следует объявить глобальные переменные, как volatile.
Ага. Все. Не глядя. Вот объясните - какими мыслями вы руководствуетесь, давая такие советы?


Цитата(ut1wpr @ Feb 3 2010, 07:42) *
Для начала попробуй выключить всю оптимизацию. Абсолютно всю.
Тоже совет из серии "закрой окно, по колесу постучи".


Цитата(Savrik @ Feb 3 2010, 02:56) *
и есть функция
все операции с SystemBusy можно смело выкинуть - у вас нет разрешения вложенных прерываний, значит этот код не будет прерван. Покажите объявление currSysStatus. Добавьте в его еще конец одно поле и выводите его вместе с остальными данными. Если увидите там не 0 - у вас нехватка стека, надо переделывать программу, сокращая количество глобальных переменных. Какой смысл делать 20 преобразований АЦП, не используя их результат? Добавьте дерганье ногой в начале и конце этой функции, убедитесь, что прерывание таймера вызывает ее именно раз в 2 сек.

Цитата(Savrik @ Feb 3 2010, 02:56) *
какие есть варианты.. мне нужно быть уверенным, что функция ТОЧНО вызовется через каждые 50 мс..
Кристалл не указан - у новых мег есть возможность запускать АЦП от событий таймера. Точне вы не получите. А тем более программно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



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

 


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


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