Страница 1 из 2
Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 15:17:34
-==MAXCELERON==-
Ребят, какие соображения будут по поводу прерывания именно по изменению уровня на выводе INT0 или INT1 (не важно). Во многих AVR (ну например mega8, tiny2313 и т.д.) эта фича не поддерживается, там при нуле, по спаду либо при подъеме только!?

Добавлено: Пт авг 28, 2009 15:36:02
sachok
Мягко говоря, я ничего не понял!!! Вопрос задайте нормально тогда будем отвечать

Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 15:39:31
Meteor
-==MAXCELERON==- писал(а):какие соображения будут по поводу прерывания именно по изменению уровня на выводе INT0 или INT1.Во многих AVR эта фича не поддерживается, там при нуле, по спаду либо при подъеме только!?

Если мне необходимо обработать подобные перепады и есть только один сигнал, то решением (простым) может явиться настройка скажем INT0 на передний фронт, а INT1 на задний фронт. Еще можно воспользоваться захватом таймера 1 (ICP). Если надо каждый отдельно, то лучше снаружи наваять схему выделения фронтов (на лп5 например) и будет все в ажуре.
PS Глянул DS на тиньку2313, зря Вы на нее наговариваете. Есть возможность сработать по любому изменению...(стр 62-63)
Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 16:01:29
-==MAXCELERON==-
Meteor писал(а):
Если надо каждый отдельно, то лучше снаружи наваять схему выделения фронтов (на лп5 например) и будет все в ажуре.
Хорошая идея, так и сделаю. Но все же хотелось бы минимум внешних деталей. Вы упомянули про захват таймера 1 (ICP), можно пожалуйстапоподробнее

Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 16:40:28
Meteor
-==MAXCELERON==- писал(а):...хотелось бы минимум внешних деталей. Вы упомянули про захват таймера 1 (ICP), можно пожалуйстапоподробнее

Можно, пожалуйста. Во вложении схема без обвязок и прочей "нечести", т.е. только идея. В обоих вариантах один из входов настраивается на срабатывание по переднему фронту (пусть INT0), второй-на задний. Дальше зависит от задачи, н-р надо найти ширину импульса. Тогда по переднему фронту записываем значения таймера и ставим флаг (можно и не ставить), по заднему фронту проводим вторую часть (новое время в этом случае и сброс флага). Далее только найти разницу. Такую задачу всегда лучше решать с захватом, т.к. фиксируется значение в регистрах таймера на момент срабатывания, для внешних прерываний надо будет поправить значение на время срабатывания. Если что-то другое, не время, то соответственно вписывать свою логику. Хитрого тут нет ничего.
Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 16:48:05
-==MAXCELERON==-
Meteor, ок, спасибо, идя понятна, буду пробовать.

Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 16:55:37
Meteor
-==MAXCELERON==- писал(а):... буду пробовать.

Дерзайте

Успехов!!!
На параллельной ветке схожие проблемы
http://radiokot.ru/forum/viewtopic.php?t=19002
Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 17:35:29
-==MAXCELERON==-
Нашел там гениальную идею
char y = 1;
ISR(INT0_vect){ //Обработчик прерывания
if (y == 1){
y = 0;
MCUCR = 0x02; // Следующее прерывание по спаду
PORTC = 0xff;
}
else {
y = 1;
PORTC = 0x00;
MCUCR = 0x03; // Опять по повышению
}
} // Конец прерывания

Добавлено: Пт авг 28, 2009 18:46:46
ARV
смотрите только, как бы в момент изменения MCUCR у вас не установился флаг прерывания... я бы на всякий случай перез завершением обработчика сбросил бы флажок INTFx
Добавлено: Пт авг 28, 2009 18:48:07
-==MAXCELERON==-
ARV писал(а):смотрите только, как бы в момент изменения MCUCR у вас не установился флаг прерывания... я бы на всякий случай перез завершением обработчика сбросил бы флажок INTFx
Не изменяется - проверил

Добавлено: Пт авг 28, 2009 19:08:34
Meteor
-==MAXCELERON==- писал(а):
Не изменяется - проверил

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

или требует дополнительных изворотов.
И все же УСПЕХОВ!!!
Добавлено: Пт авг 28, 2009 19:11:05
-==MAXCELERON==-
Meteor писал(а):
Лично меня не привлекает идея менять настройки прерывания в обработке этого же прерывания, как раз потому что имеет место меняться в самый ненужный момент

или требует дополнительных изворотов.
И все же УСПЕХОВ!!!
Протестирую, на девайсе - декодере rc5, время покажет...
Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 19:21:47
Meteor
-==MAXCELERON==- писал(а):
Нашел там гениальную идею
...
PORTC = 0xff;
else {
...
PORTC = 0x00;
...
А зачем смена порта?

Меняйте только MCUCR. Своим заворотом PORTC=0x00 Вы только переводите его в третье состояние.. Заодно на командах сэкономите...

Re: Прерывание по изменению уровня на INT0
Добавлено: Пт авг 28, 2009 19:25:23
-==MAXCELERON==-
Meteor писал(а):
А зачем смена порта?

Меняйте только MCUCR. Своим заворотом PORTC=0x00 Вы только переводите вход в третье состояние.. Заодно на командах сэкономите...

Да нет Вы не так поняли. включение выключение порта - это чисто для проверки, вообще конечно там будет требуемый код ( если делать только MCUCR, то для какой цели вообще прерывание делать??

)
Добавлено: Пт авг 28, 2009 19:29:26
Meteor
Ах да простите, не разобрался - бывает:) Гоняйте ентих единиц с нуликами, гоняйте. А то сопсем разленились, понимашь...

PS. Разленились 0-и с 1-ми у МК, не Вы.
Добавлено: Пт авг 28, 2009 20:33:26
sachok
Я канешно извиняюсь но режим Any change возможно подойдет. Будет происходить прерывание при каждом изменении уровня на INTx. Вот только не все (не на всех портах INT) это свойство доступно.
Добавлено: Пт авг 28, 2009 21:32:40
Meteor
sachok писал(а):Я канешно извиняюсь но режим Any change возможно подойдет. Будет происходить прерывание при каждом изменении уровня на INTx. Вот только не все (не на всех портах INT) это свойство доступно.
Ну да это обработка по любой смене сигнала на входе. У топикстартера еще и "на резерв" вопросик получился, для случаев когда нету ентого ани ченжа:))
Добавлено: Сб авг 29, 2009 05:38:20
-==MAXCELERON==-
sachok писал(а):Я канешно извиняюсь но режим Any change возможно подойдет. Будет происходить прерывание при каждом изменении уровня на INTx. Вот только не все (не на всех портах INT) это свойство доступно.
Если бы был такой режим на моей mega8, то и вопроса бы не было.

Добавлено: Сб авг 29, 2009 11:05:05
sachok
Что то я заплутался) Сначала в даташите пишет что только возрастающий,спадающий фронты и "0", а потом:

Добавлено: Сб авг 29, 2009 11:20:03
-==MAXCELERON==-
sachok писал(а): Сначала в даташите пишут что только возрастающий,спадающий фронты и "0", а потом:
По всей видимости этот даташит не от одного контроллера, а общий
