Здравствуйте. Недавно начал осваивать прерывания микроконтроллера. Освоение двигалось нормально, но вот когда дошол до внутренних прерываний - прерывание по совпадению, то тут столкнулся с проблемкой. В функции прерывания нужно увеличивать переменную на единицу и в фуннкции main выводить значение на 7-ми сегментном индикаторе (что-то похожее на часы - подсчет количества временных интервалов). Но значение переменной (time) не увеличивается, не пойму почему. Может кто-то подскажет в чем проблема. Заранее благодарен.
В прерывании обнулять регистр TCNT1 не надо, лишняя трата времени. + как выше написано, для переменных изменяемых в прерывании привыкайте использовать volatile.
Урааа!!! заработало!!! Большое спасибо! А где можно почитать об volatile? А то я об этом первый раз слышу. Перерыл не один форум, сайт и в книгах не встречал такого объявления переменных.
А управление портом мне как раз и надо. К ШИМ режимам я еще не дошол... практически, только теорию почитал.
А че тут читать) volatile запрещает компилятору оптимизировать переменную. То есть например есть код
Код:
bool flag=false; while(flag) { ... }
тут цикл скорее всего выполняться не будет, ибо значение переменной flag не поменятеся в процессе выполнения программы. если же ее объявить как volatile цикл честно выполнится.
В вашем случае тоже самое - компилятор не просматривает обработчики прерываний, считает что переменная не используюется и оптимизирует ее. ИМХО ибо я в winavr не работаю
Заголовок сообщения: Re: Функция прерывания AtMega 8
Добавлено: Пн ноя 21, 2011 13:24:31
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
petrovich1285 писал(а):
А где можно почитать об volatile? А то я об этом первый раз слышу. Перерыл не один форум, сайт и в книгах не встречал такого объявления переменных.
извините, а вы где искали и в каких книгах рылись? не в "сказках народов мира" случайно? просто ну никак не верится вашим словам! если вас в гугле не забанили, посмотрите повнимательнее
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
В одной из ссылок, автор сам пишет, что встречался с этим всего 2 раза! Я, перед открытием этой темы, перерыл форумы, смотрел готовые прошивки електронных часов... в прерываниях использовались переменные, которие там же изменяли свое значение и использовались в бругих местах и не мог понять, почему у них все работает, а у меня нет! Я так понял, что это и еще зависит и от компилятора, потому как с бодобным уже встречался при изучении прерываний внешних.
Заголовок сообщения: Re: Функция прерывания AtMega 8
Добавлено: Пн ноя 21, 2011 15:45:23
Нашел транзистор. Понюхал.
Зарегистрирован: Чт сен 16, 2010 19:47:01 Сообщений: 192 Откуда: Украина
Рейтинг сообщения:0
Вот выдержка из разела справки FAQ WinAVR (v. 20100110). Этот вопрос часто всплывает у них на форуме.
Цитата:
My program doesn't recognize a variable updated within an interrupt routine. When using the optimizer, in a loop like the following one:
Код:
uint8_t flag; ... ISR(SOME_vect) { flag = 1; } ...
while (flag == 0) { ... }
the compiler will typically access flag only once, and optimize further accesses completely away, since its code path analysis shows that nothing inside the loop could change the value of flag anyway. To tell the compiler that this variable could be changed outside the scope of its code path analysis (e. g. from within an interrupt routine), the variable needs to be declared like:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения