Например TDA7294

Форум РадиоКот • Просмотр темы - Функция прерывания AtMega 8
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб окт 04, 2025 14:53:40

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Функция прерывания AtMega 8
СообщениеДобавлено: Пн ноя 21, 2011 01:36:05 
Родился

Зарегистрирован: Пн ноя 21, 2011 01:10:55
Сообщений: 3
Рейтинг сообщения: 0
Здравствуйте.
Недавно начал осваивать прерывания микроконтроллера. Освоение двигалось нормально, но вот когда дошол до внутренних прерываний - прерывание по совпадению, то тут столкнулся с проблемкой.
В функции прерывания нужно увеличивать переменную на единицу и в фуннкции main выводить значение на 7-ми сегментном индикаторе (что-то похожее на часы - подсчет количества временных интервалов). Но значение переменной (time) не увеличивается, не пойму почему.
Может кто-то подскажет в чем проблема. Заранее благодарен.

P.S. испытания проводил на макетной плате

#include <avr/io.h>
#include <avr/interrupt.h>

int time=0;

ISR (TIMER1_COMPA_vect)
{
TCNT1H=0x00;
TCNT1L=0x00;
time++;

}

int main (void)
{
TCCR1A=1<<6;
TCCR1B=5;
TIMSK=1<<4;
OCR1AH=0x1F;
OCR1AL=0x40;
sei();

while (1)
{
//код программы индикации

}
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Функция прерывания AtMega 8
СообщениеДобавлено: Пн ноя 21, 2011 03:03:47 
Нашел транзистор. Понюхал.

Зарегистрирован: Чт сен 16, 2010 19:47:01
Сообщений: 192
Откуда: Украина
Рейтинг сообщения: 0
Может быть заработает
Код:
volatile int time = 0;

если в регистрах настройка правильная. Это особенности компилятора.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Функция прерывания AtMega 8
СообщениеДобавлено: Пн ноя 21, 2011 06:11:57 
Мучитель микросхем

Зарегистрирован: Вт июл 22, 2008 08:10:54
Сообщений: 492
Рейтинг сообщения: 0
Ошибка в том, что вместо установки СТС режима, вы настроили управление портом.
Код:
TCCR1A = 0;
TIMSK = (1 << OCIE1A);
OCR1AH = 0x1F;
OCR1AL = 0x40;
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10);

В прерывании обнулять регистр TCNT1 не надо, лишняя трата времени.
+ как выше написано, для переменных изменяемых в прерывании привыкайте использовать volatile.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Функция прерывания AtMega 8
СообщениеДобавлено: Пн ноя 21, 2011 12:12:42 
Родился

Зарегистрирован: Пн ноя 21, 2011 01:10:55
Сообщений: 3
Рейтинг сообщения: 0
Код:
volatile int time = 0;

Урааа!!! заработало!!!
Большое спасибо! А где можно почитать об volatile? А то я об этом первый раз слышу. Перерыл не один форум, сайт и в книгах не встречал такого объявления переменных.

А управление портом мне как раз и надо. К ШИМ режимам я еще не дошол... практически, только теорию почитал.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Функция прерывания AtMega 8
СообщениеДобавлено: Пн ноя 21, 2011 13:15:50 
Собутыльник Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 47
Зарегистрирован: Пн апр 06, 2009 19:33:29
Сообщений: 2512
Откуда: Молдова, Кишинев
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
А че тут читать) 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? А то я об этом первый раз слышу. Перерыл не один форум, сайт и в книгах не встречал такого объявления переменных.
извините, а вы где искали и в каких книгах рылись? не в "сказках народов мира" случайно? просто ну никак не верится вашим словам! если вас в гугле не забанили, посмотрите повнимательнее

_________________
битва с дураками проиграна, победители торжествуют. слава победителям!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Функция прерывания AtMega 8
СообщениеДобавлено: Пн ноя 21, 2011 13:44:34 
Родился

Зарегистрирован: Пн ноя 21, 2011 01:10:55
Сообщений: 3
Рейтинг сообщения: 0
В одной из ссылок, автор сам пишет, что встречался с этим всего 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:
Код:
volatile uint8_t flag;


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y