Страница 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).
И еще, про антидребезг не забываем, если требуется...