Функция слежения за флагом прерывания, помогите понять.

Обсуждаем контроллеры компании Atmel.
Ответить
zzontt
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург
Контактная информация:

Функция слежения за флагом прерывания, помогите понять.

Сообщение zzontt »

Дело вот в чем, есть кнопка висящая на INT0, хочу написать функцию, которая будет следить за флагом прерывания INTF0, и при установки его в 1, выполнять некое действие, после чего опускать его записью в него 1 (в этом тоже вопрос, если при возникновении прерывания он устанавливается 1, то как его сбросить снова установив его в 1????), однако это не получается и выскакивает ошибка, не могу не как понять почему она выскакивает.
Собственно код:

Код: Выделить всё

void int0(void)
{
    if(INTF0=1)
    {
    PORTA.0=0;
    PORTD.7=0;
    PORTD.7=1;
    delay_ms(500);
    PORTD.7=0;
    delay_ms(20);
    INTF0=1;
    };
}

И вот ошибки
В строке if(INTF0=1) the expression must be a modifiable lvalue
В строке INTF0=0; the expression must be a modifiable lvalue

Как я понимаю мне говорят что я не могу поменять значение в этих регистрах, однако в даташите написано иначе.

В общем, подскажите как правильно следить за флагом прерывания, выполнять некое действие, и сбрасывать его?
Не бейте за глупости, я только учусь)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Функция слежения за флагом прерывания, помогите понять.

Сообщение ploop »

Поясните, для чего его сбрасывать принудительно? Он сбрасывается аппаратно при выходе из прерывания.
zzontt
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург
Контактная информация:

Re: Функция слежения за флагом прерывания, помогите понять.

Сообщение zzontt »

ploop писал(а):Поясните, для чего его сбрасывать принудительно? Он сбрасывается аппаратно при выходе из прерывания.

Аппаратно он сбрасывается при размещение кода в подпрограмме обработки прерывания.
Просто я не так давно начал изучать микроконтроллеры, и пытаюсь разобраться что и как работает.
Я знаю что есть возможность выполнить код в подпрограмме обработки прерывания, что я успешно сделал.
И так же если я не ошибаюсь есть возможность выполнить код, следя в основной программе за флагом прерывания, что я и хочу сделать, но у меня это не выходит, вот и хочется разобраться почему.

INTF0 Флаг внешнего прерывания INT0. Если в результате события
на выводе INT0 сформировался запрос на внешнее прерывание,
этот разряд устанавливается в «1». Флаг сбрасывается аппаратно
при запуске подпрограммы обработки прерывания или программно, записью в него лог. 1.


В общем это было написано в даташите, и хочу этим воспользоваться.
Не бейте за глупости, я только учусь)
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: Функция слежения за флагом прерывания, помогите понять.

Сообщение Совесть »

Не знаю что именно кроется в CV за INTF0, но предполагаю что номер бита. Если это так, то сбрасывать его надо:

Код: Выделить всё

регистр = (1 << INTF0);
, а проверять

Код: Выделить всё

регистр & (1 << INTF0)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Функция слежения за флагом прерывания, помогите понять.

Сообщение ploop »

Похоже вы попутали флаг и регистр, как сказали выше.

Аппаратно он сбрасывается при размещение кода в подпрограмме обработки прерывания

Без размещение кода тоже. Что там творит компилятор Си с векторами, если кода не будет, я не знаю.

И так же если я не ошибаюсь есть возможность выполнить код, следя в основной программе за флагом прерывания, что я и хочу сделать, но у меня это не выходит

И не выйдет, т.к. пытаетесь придумать какую-то фигню. Просто заведите свой флаг, в обработчике его выставляйте, а в программе анализируйте, и проблем не будет.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Функция слежения за флагом прерывания, помогите понять.

Сообщение Kavka »

Как уже написали - путаница имеет место быть. :)

zzontt писал(а):В строке if(INTF0=1) the expression must be a modifiable lvalue

Ругается на попытку переопределения числа.
После препроцессора это будет выглядеть так if(6=1)
Как вы думаете, это имеет смысл? С учётом того, что в скобках присвоение.

Совесть, вам правильно подсказал.

А ещё в записи if ( ПЕРЕМЕННАЯ=1 )
выражение будет всегда истинно.
И компилироваться будет без ошибок, если слева стоит переменная.
Так как ПЕРЕМЕННАЯ=1 это присвоение.
Сравнение будет ПЕРЕМЕННАЯ==1

zzontt, учите Си - читайте книжки.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
zzontt
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург
Контактная информация:

Re: Функция слежения за флагом прерывания, помогите понять.

Сообщение zzontt »

Всем спасибо, в чем дело я понял, буду разбираться.
Не бейте за глупости, я только учусь)
Ответить

Вернуться в «AVR»