Прерывание по изменению уровня на INT0
Ребят, какие соображения будут по поводу прерывания именно по изменению уровня на выводе INT0 или INT1 (не важно). Во многих AVR (ну например mega8, tiny2313 и т.д.) эта фича не поддерживается, там при нуле, по спаду либо при подъеме только!? 
- Реклама
Мягко говоря, я ничего не понял!!! Вопрос задайте нормально тогда будем отвечать 
Я не Сашок!!!
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Если мне необходимо обработать подобные перепады и есть только один сигнал, то решением (простым) может явиться настройка скажем INT0 на передний фронт, а INT1 на задний фронт. Еще можно воспользоваться захватом таймера 1 (ICP). Если надо каждый отдельно, то лучше снаружи наваять схему выделения фронтов (на лп5 например) и будет все в ажуре.-==MAXCELERON==- писал(а):какие соображения будут по поводу прерывания именно по изменению уровня на выводе INT0 или INT1.Во многих AVR эта фича не поддерживается, там при нуле, по спаду либо при подъеме только!?
PS Глянул DS на тиньку2313, зря Вы на нее наговариваете. Есть возможность сработать по любому изменению...(стр 62-63)
Хорошая идея, так и сделаю. Но все же хотелось бы минимум внешних деталей. Вы упомянули про захват таймера 1 (ICP), можно пожалуйстапоподробнееMeteor писал(а): Если надо каждый отдельно, то лучше снаружи наваять схему выделения фронтов (на лп5 например) и будет все в ажуре.
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Можно, пожалуйста. Во вложении схема без обвязок и прочей "нечести", т.е. только идея. В обоих вариантах один из входов настраивается на срабатывание по переднему фронту (пусть INT0), второй-на задний. Дальше зависит от задачи, н-р надо найти ширину импульса. Тогда по переднему фронту записываем значения таймера и ставим флаг (можно и не ставить), по заднему фронту проводим вторую часть (новое время в этом случае и сброс флага). Далее только найти разницу. Такую задачу всегда лучше решать с захватом, т.к. фиксируется значение в регистрах таймера на момент срабатывания, для внешних прерываний надо будет поправить значение на время срабатывания. Если что-то другое, не время, то соответственно вписывать свою логику. Хитрого тут нет ничего.-==MAXCELERON==- писал(а):...хотелось бы минимум внешних деталей. Вы упомянули про захват таймера 1 (ICP), можно пожалуйстапоподробнее
- Вложения
-
- Interrupts.rar
- Вставляйте рисунком в ворд или еще куда нибудь.
- (3.02 КБ) 217 скачиваний
- Реклама
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Дерзайте-==MAXCELERON==- писал(а):... буду пробовать.
На параллельной ветке схожие проблемы http://radiokot.ru/forum/viewtopic.php?t=19002
Нашел там гениальную идеюMeteor писал(а): На параллельной ветке схожие проблемы http://radiokot.ru/forum/viewtopic.php?t=19002
char y = 1;
ISR(INT0_vect){ //Обработчик прерывания
if (y == 1){
y = 0;
MCUCR = 0x02; // Следующее прерывание по спаду
PORTC = 0xff;
}
else {
y = 1;
PORTC = 0x00;
MCUCR = 0x03; // Опять по повышению
}
} // Конец прерывания
смотрите только, как бы в момент изменения MCUCR у вас не установился флаг прерывания... я бы на всякий случай перез завершением обработчика сбросил бы флажок INTFx
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Лично меня не привлекает идея менять настройки прерывания в обработке этого же прерывания, как раз потому что имеет место меняться в самый ненужный момент-==MAXCELERON==- писал(а): Не изменяется - проверил
И все же УСПЕХОВ!!!
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
А зачем смена порта?-==MAXCELERON==- писал(а):
Нашел там гениальную идею![]()
...
PORTC = 0xff;
else {
...
PORTC = 0x00;
...
Да нет Вы не так поняли. включение выключение порта - это чисто для проверки, вообще конечно там будет требуемый код ( если делать только MCUCR, то для какой цели вообще прерывание делать??Meteor писал(а): А зачем смена порта?Меняйте только MCUCR. Своим заворотом PORTC=0x00 Вы только переводите вход в третье состояние.. Заодно на командах сэкономите...
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Ах да простите, не разобрался - бывает:) Гоняйте ентих единиц с нуликами, гоняйте. А то сопсем разленились, понимашь... 
PS. Разленились 0-и с 1-ми у МК, не Вы.
PS. Разленились 0-и с 1-ми у МК, не Вы.
Я канешно извиняюсь но режим Any change возможно подойдет. Будет происходить прерывание при каждом изменении уровня на INTx. Вот только не все (не на всех портах INT) это свойство доступно.
Я не Сашок!!!
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Ну да это обработка по любой смене сигнала на входе. У топикстартера еще и "на резерв" вопросик получился, для случаев когда нету ентого ани ченжа:))sachok писал(а):Я канешно извиняюсь но режим Any change возможно подойдет. Будет происходить прерывание при каждом изменении уровня на INTx. Вот только не все (не на всех портах INT) это свойство доступно.
Что то я заплутался) Сначала в даташите пишет что только возрастающий,спадающий фронты и "0", а потом:


Я не Сашок!!!


