Страница 1 из 1

Внешнее прерывание на INT0

Добавлено: Пн сен 23, 2013 13:37:33
AaNnDdRrEeYy
Добрый день.
Мне нужно обработать спадающий ( переход с лог.1 на лог.0) и нарастающий (переход с лог.0 на лог.1) фронт на ноге INT0.

выставил биты
MCUCR |=(1<<ISC00); //прерывание по любому изменению лог. уровня
GICR |= (1<<INT0); // разрешил прерывания

а вот теперь проблема, как определить по какому фронту было вызвано прерывание?
есть вариант повесить на INT0 нарастающий а на INT1 спадающий, но тогда придется ноги вместе спаять, можно ли их так спаивать вместе?

Re: Внешнее прерывание на INT0

Добавлено: Пн сен 23, 2013 14:20:24
akl
Можно и на одном входе сработать по признакам. Лапы можно спаивать, если они не сконфигурированы как оба выхода. Камень какой?

Re: Внешнее прерывание на INT0

Добавлено: Пн сен 23, 2013 14:28:40
Engineer_Keen
AaNnDdRrEeYy писал(а):а вот теперь проблема, как определить по какому фронту было вызвано прерывание?
А прерывании прочитать PINх? Если =1, нарастающий фронт, =0 - спадающий.

Re: Внешнее прерывание на INT0

Добавлено: Пн сен 23, 2013 14:32:45
AaNnDdRrEeYy
Камень ATmega8535. Если я буду читать PIND бит 2 (он же INT0) мне его отдельно надо на вход настраивать? или сразу читать с PIND.2 не трогая регистр DDRD?

Re: Внешнее прерывание на INT0

Добавлено: Пн сен 23, 2013 14:42:26
Engineer_Keen
Ну какбы если вход используется для прерывания, он изначально (т.е. при инициализации) раз и навсегда должен быть настроен именно как вход (DDRх.y=0), если это не какой-нибудь хитрый интерфейс...
Если его настроить на выход, то на прерывания он конечно сработает, но если на него подать чистый 0 или 1, а в его регистре PORTх.y будет противоположное состояние, он тупо сгорит. В лучшем случае он останется "вечным входом".

Re: Внешнее прерывание на INT0

Добавлено: Пн сен 23, 2013 14:56:07
AaNnDdRrEeYy
тогда наверно вот так надо, если что то не так подправте

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

ISR(INT0_vect)
{
   if (PIND & (1<<2) == (1<<2))
  {
      //возрастающий
  } 
  else
  {
     //убывающий
  }
}


void main()
{
DDRD |= (0<<2);
MCUCR |=(1<<ISC00); //прерывание по любому изменению лог. уровня
GICR |= (1<<INT0); // разрешил прерывания
while(1)
{}
}

Re: Внешнее прерывание на INT0

Добавлено: Пн сен 23, 2013 15:12:45
Engineer_Keen
AaNnDdRrEeYy писал(а):тогда наверно вот так надо, если что то не так подправте
Я не спец по Си, но вроде правильно, только глобального разрешения прерываний не вижу (бит I в регистре SREG).
И еще, про антидребезг не забываем, если требуется...