Страница 1 из 1
Функция слежения за флагом прерывания, помогите понять.
Добавлено: Вт мар 05, 2013 10:30:13
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
Как я понимаю мне говорят что я не могу поменять значение в этих регистрах, однако в даташите написано иначе.
В общем, подскажите как правильно следить за флагом прерывания, выполнять некое действие, и сбрасывать его?
Re: Функция слежения за флагом прерывания, помогите понять.
Добавлено: Вт мар 05, 2013 10:33:29
ploop
Поясните, для чего его сбрасывать принудительно? Он сбрасывается аппаратно при выходе из прерывания.
Re: Функция слежения за флагом прерывания, помогите понять.
Добавлено: Вт мар 05, 2013 10:52:23
zzontt
ploop писал(а):Поясните, для чего его сбрасывать принудительно? Он сбрасывается аппаратно при выходе из прерывания.
Аппаратно он сбрасывается при размещение кода в подпрограмме обработки прерывания.
Просто я не так давно начал изучать микроконтроллеры, и пытаюсь разобраться что и как работает.
Я знаю что есть возможность выполнить код в подпрограмме обработки прерывания, что я успешно сделал.
И так же если я не ошибаюсь есть возможность выполнить код, следя в основной программе за флагом прерывания, что я и хочу сделать, но у меня это не выходит, вот и хочется разобраться почему.
INTF0 Флаг внешнего прерывания INT0. Если в результате события
на выводе INT0 сформировался запрос на внешнее прерывание,
этот разряд устанавливается в «1». Флаг сбрасывается аппаратно
при запуске подпрограммы обработки прерывания или программно, записью в него лог. 1.
В общем это было написано в даташите, и хочу этим воспользоваться.
Re: Функция слежения за флагом прерывания, помогите понять.
Добавлено: Вт мар 05, 2013 11:06:23
Совесть
Не знаю что именно кроется в CV за
INTF0, но предполагаю что номер бита. Если это так, то сбрасывать его надо:
, а проверять
Re: Функция слежения за флагом прерывания, помогите понять.
Добавлено: Вт мар 05, 2013 11:19:48
ploop
Похоже вы попутали флаг и регистр, как сказали выше.
Аппаратно он сбрасывается при размещение кода в подпрограмме обработки прерывания
Без размещение кода тоже. Что там творит компилятор Си с векторами, если кода не будет, я не знаю.
И так же если я не ошибаюсь есть возможность выполнить код, следя в основной программе за флагом прерывания, что я и хочу сделать, но у меня это не выходит
И не выйдет, т.к. пытаетесь придумать какую-то фигню. Просто заведите свой флаг, в обработчике его выставляйте, а в программе анализируйте, и проблем не будет.
Re: Функция слежения за флагом прерывания, помогите понять.
Добавлено: Вт мар 05, 2013 11:26:23
Kavka
Как уже написали - путаница имеет место быть.

zzontt писал(а):В строке if(INTF0=1) the expression must be a modifiable lvalue
Ругается на попытку переопределения числа.
После препроцессора это будет выглядеть так if(6=1)
Как вы думаете, это имеет смысл? С учётом того, что в скобках присвоение.
Совесть, вам правильно подсказал.
А ещё в записи if ( ПЕРЕМЕННАЯ=1 )
выражение будет всегда истинно.
И компилироваться будет без ошибок, если слева стоит переменная.
Так как ПЕРЕМЕННАЯ=1 это присвоение.
Сравнение будет ПЕРЕМЕННАЯ==1
zzontt, учите Си - читайте книжки.
Re: Функция слежения за флагом прерывания, помогите понять.
Добавлено: Вт мар 05, 2013 12:50:52
zzontt
Всем спасибо, в чем дело я понял, буду разбираться.