Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: датчик+мега8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Terapefft
Доброго времени суток господа! smile.gif
Помогите пожалуста разобратся с такой проблемой. Есть оборудование, управляется мегой8, цикл начинается после того как размыкается индуктивный датчик, путем опускания ручки. Проблема заключается в том что, при первом размыкании все нормально срабатывает и цикл запускается, но потом когда ручку возвращаешь в исходное положение цикл опять запускается, что не есть гуд. Как сделать чтобы он после того как в исходное положение возвращаеш ручку не запускался?
Wild007
Цитата
Помогите пожалуста разобратся с такой проблемой.

Как всегда -- кусок схемы и программы в студию!!! smile.gif smile.gif smile.gif
Terapefft
датчик к контролеру я подключаю через резистор и диод, я так и раньше подключал такой же датчик, все нормально работает. В програме при инициализации разрешаю внешнее прерывание по int1
CLR RIN
LDI rin,1<<ISC10
OUT MCUCR,RIN
в п/п просто перехожу на метку М2:
cnt_int1:

push rin
in rin,sreg ; çàïîìíèòü ðåãèñòð ñîñòîÿíèÿ
push rin


rjmp M2
С этой метки у меня начинается рабочий цикл.

В конце цикла ухожу на метку start, где вновь разрешаю прерывание
start:
clr radr
sbr radr,1<<int1
out gicr,radr


ser ind ;
cbr reg_flgs,0b00010000 ;
stt2:
sbrs reg_flgs,4 ;
rjmp stt2 ;

ldi radr,dvig_0 ; îòêëþ÷èòü äâèãàòåëü
rcall Decod ;

rcall pnev_off ; Îòêëþ÷èì âñå ìåõàíèçìû
sei ;
stt1:
sbrs ind,PROG ; åñëè íàæàòà "ÏÐÎÃ"
rcall Obrab_key

пробовал в конце рабочего цикла запретить прерывание по int1, все равно срабатывает при втором замыкании
TriD
Вам нужно настроить прерывание либо по переднему, либо по заднему фронту управляющего импульса (см.стр.64 мануала). Сейчас у вас прерывание возникает и по переднему и по заднему фронту.
Wild007
Цитата(TriD @ Feb 5 2007, 10:05) *
Вам нужно настроить прерывание либо по переднему, либо по заднему фронту управляющего импульса (см.стр.64 мануала). Сейчас у вас прерывание возникает и по переднему и по заднему фронту.

А (ИМХО) лучше прерывание настроить по 0. Тогда прерывания не будет возникать по фронтам, т.к. тебя интересует открыта или закрыта дверца(ручка).
arttab
так оно все время будет возникать при определенном положении рычага. лучше уж по фронтам (если помех нет)
Wild007
Цитата(arttab @ Feb 5 2007, 10:14) *
так оно все время будет возникать при определенном положении рычага. лучше уж по фронтам (если помех нет)

Ну для управления такими ситуациями есть програмные "штучки", как запрет прерываний и т.д. smile.gif
Terapefft
сделал я по нарастающему фронту и все нормально заработало smile.gif)) (правда пока тока на стенде), пойду после обеда с оборудованием развлекатсяsmile.gif
SasaVitebsk
Цитата(Terapefft @ Feb 5 2007, 12:31) *
сделал я по нарастающему фронту и все нормально заработало smile.gif)) (правда пока тока на стенде), пойду после обеда с оборудованием развлекатсяsmile.gif


Если вы станете осциллографом, то увидите выбросы. Как после переднего, так и после заднего фронта. Это может приводить к повторному "взводу" флага запроса на прерывание и, соответственно к обработке его. Я с таким столкнулся. Размер выбросов будет зависить от качества катушки, зазора скорости прошождения и т.д. Всегда будет вероятность возникновения в новой партии.
Чтобы этого избежать, можно уменьшить резистор подпорки, поставить небольшую емкостишку, ну и главное, - немного задержаться в процедуре обработки прерывания (время определить по осциллографу) и перед выходом из прерывания сбросить флаг фальшивого прерывания. Я таким образом добился стопроцентной работы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.