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

 
 
 
Reply to this topicStart new topic
> avr проблемы с volatile переменной
mjpronin
сообщение Oct 5 2011, 18:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



Здравствуйте! Доброго Вам времени суток.

Помогите, пожалуйста, разобраться с проблемой. Необходимо использовать переменную, которая может быть изменена как по ходу программы, так и в прерывании. Думаю, многие уже воскликнули: просто он забыл объявить её как 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;        
}
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 5 2011, 19:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Читаем 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).

Для сброса флага кто приемный буфер опустошать будет?
Go to the top of the page
 
+Quote Post
mjpronin
сообщение Oct 5 2011, 19:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



А разве функция-обработчик прерывания не должна после своего выполнения сбрасывать этот бит?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 5 2011, 19:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Нет, не должна. Ведь в буфере может быть не один принятый байт.
Go to the top of the page
 
+Quote Post
mjpronin
сообщение Oct 5 2011, 19:20
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



Всё, умываю руки.

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

Спасибо.

Получилось.

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



Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 6 2011, 06:46
Сообщение #6


Гуру
******

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



QUOTE (mjpronin @ Oct 5 2011, 22:20) *
Думаю: помимо очистки буфера, можно насильно бит сбросить - прерывание не сработает.
Если вы считали UDR, то дополнительно ("помимо") ничего делать не нужно. Просто потому, что у AVR не существует другого способа сброса этого флага кроме чтения UDR. Если же вы его значение не используете в обработчике - зачем прерывания вообще? Анализируйте флаг прерывания прямо в программе и там же его сбрасывайте чтением UDR.


--------------------
На любой вопрос даю любой ответ
"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
Палыч
сообщение Oct 6 2011, 07:10
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Сергей Борщ @ Oct 6 2011, 10:46) *
...зачем прерывания вообще?
Судя по названию подфорума ("В помощь начинающему") и сложности программы - ТС осваивает AVR и прерывания в частности. Рolling, вероятно, он уже "прошёл" или ещё не слышал. rolleyes.gif
Go to the top of the page
 
+Quote Post
mjpronin
сообщение Oct 6 2011, 08:25
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 26-01-10
Пользователь №: 55 071



"Сложность" представленной программы обясняется тем, что я выставил суть вопроса, а не программу в целом или даже часть программы.
Ну а polling это не серьёзно. Прерывания, только прерывания. А выбор подфорума объясняется просто - вопрос плёвый, хотя иногда бывает, что в трёх соснах можно заблудиться.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Oct 6 2011, 09:07
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(mjpronin @ Oct 6 2011, 12:25) *
"Сложность" представленной программы обясняется тем, что ...

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

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

Зря Вы так - категорично! Например, в применение поллинга в приведенной Вами задаче (пусть - искусственной, но "родилась" она из другой - "настоящей", чем-то подобной) одни плюсы и ни одного минуса.
Go to the top of the page
 
+Quote Post

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

 


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


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