Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mega (48) Help !
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
GeorgyBey
Работаю с Мегой 48 - меряю, управляю, индицирую - все ОК.
Нужно приделать кнопку и по нажатию запускать подпрограмму.
Как только выставляю разрешение внешних прерываний INT1 (sbi EIMSK,1 для М48й) - где-то зависает sad.gif .


Проблема продолжает стоять ! angry.gif
При наличии общего разрешения прерываний, команда разрешения внешнего приводит к тому, что контроллер следующей командой кидается обрабатывать ЯКОБЫ имеющееся внешнее. И даже Студио это старательно симулирует.
Вопрос : где и откуда "накопилось" внешнее прерывание, если никто ничего не трогал !?
DimSun
Цитата(GeorgyBey @ Apr 28 2005, 20:54)
Работаю с Мегой 48 - меряю, управляю, индицирую - все ОК.
Нужно приделать кнопку и по нажатию запускать подпрограмму.
Как только выставляю разрешение внешних прерываний INT1 (sbi EIMSK,1 для М48й) - где-то зависает sad.gif . Студия симулирует - нормально).

Чем "вредны" внешние прерывания - по Вашему опыту?
cheers.gif
*


Я так понял кнопка на внешнем прерывании. Вообще ИМХО не очень хорошо. Вопрос как оно среагирует на дребезг?
yung
Очень похоже на дребезг. Попробуй для проверки при входе в прерывание поставить какой-нибудь свободный порт в 1, а при выходе из прерывания вернуть в 0. Тогда сможешь по крайней мере посмотреть, где находишься.
GeorgyBey
Я так понял кнопка на внешнем прерывании. Вообще ИМХО не очень хорошо. Вопрос как оно среагирует на дребезг?
*

[/quote]


Уточняю: до дребезга дело не доходит! Как только ввожу команду
"sbi EIMSK,1" (компилирую и заливаю во флэш) - нормально работающий до этого (по программе) контроллер останавливается (где-то) - АЦП не меряет (рез-т 0), управляющий вывод порта В = 0 - оптрон управления включен "навсегда", ничто не моргает - где-то стоит sad.gif
Т.е. ввод разрешения на внешнее прерывание УЖЕ чего-то портит wacko.gif
Кнопку нажмут раз в сто лет так стоит ли вводить ее опрос ?
А так - прерывание принято - по дребезгу ли, по потенциалу земли-ли - пошла программа обработки - и пусть себе дребезжит tongue.gif
Или ? ...
DimSun
Цитата(GeorgyBey @ Apr 29 2005, 11:26)
Уточняю: до дребезга дело не доходит! Как только ввожу команду
*


Ну тогда уточняй дальше. Как кнопка висит?
GeorgyBey
Цитата(DimSun @ Apr 29 2005, 16:24)
Цитата(GeorgyBey @ Apr 29 2005, 11:26)
Уточняю: до дребезга дело не доходит! Как только ввожу команду
*


Ну тогда уточняй дальше. Как кнопка висит?
*



STK-500 rolleyes.gif
Если по изменению состояния кнопки:
PCINT13 (PortC, вывод5 - как вход) проводочком к штатной кнопке,
Галочку через Хрегистр на разрешение этого прерывания и ... на кнопку не реагирует (работает как работал).
А если INT1 (sbi EIMSK,1) - до кнопок, как говорил, не доходит... laugh.gif
GeorgyBey
Чудеса с решетом cranky.gif
Сегодня ТАК себя уже не ведет.
Сегодня "съедает" установку внешнего прерывания (INT1),
зато следующим шагом после установки общего разрешения прерываний (sei)
(в любом месте программы) прерывается! (от прерывания отправляю в ловушку - выставляю светодиоды и зацикливаю).
Впечатление - считает "внешним прерыванием" любое телодвижение angry.gif
Не даром и в книжке "Применение мик-ов Атмел" про внешние прерывания ни гу-гу.
И так - очевидные (для тех кто поборол) гадости внешних прерываний - они есть ?
vvs157
Цитата(GeorgyBey @ Apr 29 2005, 17:51)
Чудеса с решетом  cranky.gif
Сегодня ТАК себя уже не ведет.
Сегодня "съедает" установку внешнего прерывания (INT1),
зато следующим шагом после установки общего разрешения прерываний (sei)
(в любом месте программы) прерывается! (от прерывания отправляю в ловушку - выставляю светодиоды и зацикливаю).
Впечатление - считает "внешним прерыванием" любое телодвижение angry.gif
Не даром и в книжке "Применение мик-ов Атмел" про внешние прерывания ни гу-гу.
И так - очевидные (для тех кто поборол) гадости внешних прерываний - они есть ?
*


Провод на кнопку длинный? Осциллографом смотрели, что происходит на этой линии?
vet
vvs157, никаких гадостей нет, прерывания включаются и работают без танцев с бубном.
Пишем обработчик, ставим соответствующий вектор прерывания,
в процедуре инициализации периферии:
- выставляем условия возникновения внешних прерываний (уровень/фронт),
- снимаем флаги сработки внешних прерываний (единичками),
- поднимаем биты разрешения внешних прерываний,
- разрешаем прерывания вообще (SEI).

По проблеме: подтягивающий резистор на входе висит/включен?
GeorgyBey
[quote=vet,Apr 29 2005, 23:41]
vvs157, никаких гадостей нет, прерывания включаются и работают без танцев с бубном.

"- снимаем флаги сработки внешних прерываний (единичками), "

Вот про Это - поподробнее, плиииииз.
А то как только разрешаю внешнее прерывание (при наличии общего), либо разрешаю общее (при установленном вненшнем) контроллер радостно срывается в обработку внешнего прерывания, хотя никто ничего не трогал!!! wacko.gif
Ни про кнопки ни про провода ПОКА и речи нет
GeorgyBey
Проблема продолжает стоять !
При включении разрешения внешнего прерывания (при наличии общего разрешения) контроллер, вместо следующей команды, отправляется обрабатывать внешнее прерывание, хотя его (прерывания) нет, а его (контроллер) - никто не просит этого делать !!!
Даже Студио это старательно симулирует sad.gif
Вопрос: ОТКУДА появляется запрос на обработку, если никто не просил !?
vet
GeorgyBey, до настройки типа внешнего прерывания вполне может установиться флаг прерывания; пример - после сброса ISCn1:0=00 (низкий уровень), на ноге - 0, флаг установился, и будет стоять после настройки, хотя, согласно ей, никакого прерывания быть не должно. После разрешения прерываний - имеем описанную Вами ситуацию. Поэтому между настройкой и разрешением прерываний не помешает сбросить флаги INTFn.
Maxim
У меня с AT90S1200 была подобная проблема. Почитал доку на нее и вот что там сказано о избавлении от дребезга с внешним прерыванием:

1. Disable the External Interrupt by clearing the INT0 flag in GIMSK.
2. Select level triggered interrupt.
3. Select desired interrupt edge.
4. Re-enable the external interrupt by setting INT0 in GIMSK.

Может и с 48-ой надо сделать тоже самое.
GeorgyBey
Спасибо "vet" и "Maxim".

Для всех, кто еще не сталкивался a14.gif :

Оказалось, что в железе все было нормально.
ДЛЯ СИМУЛЯТОРА нужно было вручную устанавливать "pin" порта в "1", иначе он (симулятор) считал "0" на ножке "наступившим событием".

Дребезг сказывается когда прерывание определяется по фронту "прерывающего" импульса.
Фронт считается имеющимся, если на момент прихода внутреннего синхроимпульса на ножке "1после0"(или наоборот, а при предыдущем НЕ было!). Если контакт дребезжит т.е. подвижный элемент контакта подпрыгивает на неподвижном, то в момент прихода фронта синхроимпульса собственно контакта может и не быть sad.gif - событие пропущено !

Всем спасибо, тему можно считать закрытой cheers.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.