Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: avr проблемы с volatile переменной
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
mjpronin
Здравствуйте! Доброго Вам времени суток.

Помогите, пожалуйста, разобраться с проблемой. Необходимо использовать переменную, которая может быть изменена как по ходу программы, так и в прерывании. Думаю, многие уже воскликнули: просто он забыл объявить её как volatile, вот и мучается. Нет, не забыл, но почему-то всё происходит, как будто контроллер не замечает её изменения.

Я думаю, должно быть так: сначала «b» пока нет прирывания, потом один раз «а» и опять «b» пока опять не будет прерывание. А получается сначала «b», после прерывания «а» «b». Думаю, я что-то напутал.

Код
#define WORK 1
#define SEND 2
volatile char answer = WORK;

int main ()
{
    sei();    

    while (1)
        {
                   
            printf("b\n");

            if(answer == SEND)
                                       {
        
                                         printf("a\n");
                                         answer = WORK;        
        
                                        }
                        
        };
    
    return 0;
}

ISR(USART_RXC_vect)
{
              answer = SEND;        
}
Палыч
Читаем DS:
Цитата
RXC: USART Receive Complete
This flag bit is set when there are unread data in the receive buffer and cleared when the receive
buffer is empty (i.e., does not contain any unread data).

Для сброса флага кто приемный буфер опустошать будет?
mjpronin
А разве функция-обработчик прерывания не должна после своего выполнения сбрасывать этот бит?
Палыч
Нет, не должна. Ведь в буфере может быть не один принятый байт.
mjpronin
Всё, умываю руки.

Низкий поклон.

Спасибо.

Получилось.

Понятно: постоянное срабатывание прерывания из-за неочищенного буфера, неснятого бита. Думаю: помимо очистки буфера, можно насильно бит сбросить - прерывание не сработает.



Сергей Борщ
QUOTE (mjpronin @ Oct 5 2011, 22:20) *
Думаю: помимо очистки буфера, можно насильно бит сбросить - прерывание не сработает.
Если вы считали UDR, то дополнительно ("помимо") ничего делать не нужно. Просто потому, что у AVR не существует другого способа сброса этого флага кроме чтения UDR. Если же вы его значение не используете в обработчике - зачем прерывания вообще? Анализируйте флаг прерывания прямо в программе и там же его сбрасывайте чтением UDR.
Палыч
Цитата(Сергей Борщ @ Oct 6 2011, 10:46) *
...зачем прерывания вообще?
Судя по названию подфорума ("В помощь начинающему") и сложности программы - ТС осваивает AVR и прерывания в частности. Рolling, вероятно, он уже "прошёл" или ещё не слышал. rolleyes.gif
mjpronin
"Сложность" представленной программы обясняется тем, что я выставил суть вопроса, а не программу в целом или даже часть программы.
Ну а polling это не серьёзно. Прерывания, только прерывания. А выбор подфорума объясняется просто - вопрос плёвый, хотя иногда бывает, что в трёх соснах можно заблудиться.
Палыч
Цитата(mjpronin @ Oct 6 2011, 12:25) *
"Сложность" представленной программы обясняется тем, что ...

Извините, если ненароком обидел.

Цитата(mjpronin @ Oct 6 2011, 12:25) *
Ну а polling это не серьёзно. Прерывания, только прерывания.

Зря Вы так - категорично! Например, в применение поллинга в приведенной Вами задаче (пусть - искусственной, но "родилась" она из другой - "настоящей", чем-то подобной) одни плюсы и ни одного минуса.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.