Это точно. А как же их правильно тогда обработать? Чтоб за раз только один раз проскакивал. Намекните пожалуйста, если не секрет. Делать задержку delay^ем - не вариант по моему, while - тоже не помогает. А как же еще тогда?
вам уже пример прислали как складывать там где программа была. возможно у вас теперь ловит, потому что портов три, если использовать пц инт, то возникнет три прерывания.При выходе из прерывания нужно очищать флаг запроса всех трех. Я так думаю. Вообще было бы неплохо на ваш вариант программы посмотреть.
Вообще можно попробовать одинарным считыванием читать, посылать что получится и посмотреть какие варианты бывают. Если датчики не подключаются в состояние выкл то это или в общем то бесполезно.
_________________ В поисках истины человек развивается.
Нет-нет. Я сделал пока как Alex посоветовал - просто увеличил длительность импульса на входе аппаратно. А в программе все до неприличия просто:
Код:
if(PIND.7==1) {while(!(UCSRA & (1<<UDRE))); //ждем опустошение регистра передачи UDR = 'G';} //отправляем символ
И так опрашивается пин за пином и сразу отсылается символ если там 1. Дык вот теперь из-за того что длительность импульса с датчика большая, МК успевает его засечь по 10-15 раз. Обычно пустым циклом while(типа while(PIND.7==1){}) решал такое, а здесь, так как пьезодатчик не просто подает 1 в порт, а колеблется(т.е. 1-0-1-0-1-0) какое-то время, этим while не получается, проскакивает, сволочь.
Стоп, если у вас состояние меняется раз в 10мс не думали сколько раз за секунду может меняться? и тем более получается что цикл может пройти несколько раз пока разрядится конденсатор.Пробуйте уменьшить емкость конденсатора.
еще как вариант сохранять состояние регистров и только если есть изменения, то отправлять.
Цитата:
так как пьезодатчик не просто подает 1 в порт, а колеблется(т.е. 1-0-1-0-1-0) какое-то время,
то что вы описали похоже на дребезг.Как раз таки конденсатор нужного номинала помогает справиться с дребезжащими контактами. есть вариант так же что ваш транзистор, который вы поставили для усиления поднимает уровень напряжения недостаточно и поэтому малейшее колебание наводок меняет состояние порта.Так же возможно что для увеличения помехоустойчивости потребуется подтягивающие резисторы на каждую ногу. Хотя бы внутренние.
_________________ В поисках истины человек развивается.
Нет, дребезг тут не причем. Это физика работы пьезодатчика: чем сильнее его "ударить" единожды, тем дольше он будет вибрировать после воздействия. Вырабатывая переменное напряжение на выводах своих с убывающей амплитудой.
Цитата:
Короче, как защита от дребезга на кнопке.
Да, я об этом как раз и подумал, только сразу не всосал как это реализовать. Но стоило немного подумать... Вышел из ситуации вот так:
Код:
if(a==0) //если флаг проверки срабатывания не стоит {if(PIND.2==1) //проверяем, если сработал датчик {while(!(UCSRA & (1<<UDRE))); UDR = 'Q'; //шлем символ a=1;} //выставляем флаг срабатывания } else{b++;} //если флаг стоит - увеличиваем счетчик задержки if(b==zad) //если счетчик равен ..... (у меня 2000 получилось) {a=b=0;} //сбрасываем флаг, обнуляем сетчик
Вот, вроде работает. Правда не красиво как-то это получилось, через ж... Кучу переменных пришлось лепить. Ну да главное, что пашет. Вроде больше пока подводных камней не предвидится (тьфу, тьфу, тьфу...). Спасибо всем огромное, что подсказывали и направляли неуча МКшника Очень мне помогли! Спасибо!!!
_________________ Боишься? Сиди дома!
Последний раз редактировалось Аlex Пн авг 13, 2012 22:29:04, всего редактировалось 2 раз(а).
Верхняя схема должна работать как формирователь импульсов только нужно подобрать подходящие сопротивление и конденсатор.
И еще вот как можно. И вообще мне непонятен смысл данного устройства, если вы говорите датчики срабатывают пачками, а сами отдельно каждый датчик опрашиваете, да еще и задержку ловите на нем.
Не понимаю смысла.
_________________ В поисках истины человек развивается.
Когда приходят очень короткие импульсы - лучше всего их запоминать на внешнем регистре, а через определенные промежутки времени этот регистр опрашивать и сбрасывать. Если хочется, можно кодировать состояние регистра не одной буквой на вход, а комбинацией и отправлять вместе с текущим временем, которое внутри контроллера надо считать. Можно отправлять просто номер интервала оцифровки. Тогда на приемном конце USART можно восстановить ситуацию с датчиками с точностью до интервала оцифровки состояния входного регистра.
Я понимаю. Я прсто Вам уточнил, что это не дребезг.
Цитата:
И вообще мне непонятен смысл данного устройства
Дык я и поймаю свою пачку в чем проблема-то? Просто одно срабатывание датчика МК у меня успевал поймать по 12-15 раз. Вот поэтому и пришлось ввести задержку: раз сработал - хорошо. Я же знаю, что за время моей задержки он сработать не может больше. Так что получил, что хотел.
Цитата:
Как насчет аппаратно сделать так
Спасибо Вам за схемки. Я знаю как сделать аппаратно. Мне хотелось именно програмно. Потому что: во-первых: мне это наиболее интересно, как начинающему контроллерщику, во-вторых: в корпусе совсем нет места для кондера и резистора, а их пришлось бы ставить по 20 штук; в-третьих: мне все-таки кажется зачем городить огород из рассыпухи есло можно решить вопрос програмно?
Цитата:
А я значит в лес направил?
Нет конечно! Просто, как я уже писал, хотелось именно програмно это все сделать. И спасибо я сказал ВСЕМ. И Вам в том числе. Ваши советы не в коей мере не хуже или лучше чем советы других. С Вашей помощью я тоже кое-чего нового узнал - в жизни пригодится! Спасибо большое!
Цитата:
Когда приходят очень короткие импульсы - лучше всего их запоминать на внешнем регистре
Чесно говоря, я плохо понял о чем это Вы... Я ведь еще только учусь. И это в жизни моей всего лишь третья программа...
внешний регистр это микросхема такая, на ногах у нее ваши датчики, при прошествии определенного времени считываете показания ног последовательно, то есть есть режим параллельного ввода в нее и последовательного вывода из нее. Таким образом переключив из режима ввода смена состояния ног уже никак не влияет на выходные данные.Этакие стоп кадры.Потом эти стоп кадры можно анализировать. Если частота стоп кадров будет выше, чем частота изменения сигналов с датчиков, то вы ничего не потеряете. Хотя в вашем случае это нереально.Такие короткие промежутки.
_________________ В поисках истины человек развивается.
Ааааа...! Ну конечно! Чего это я так дурканул. Я то думал, что речь об МК. Уже было полез опять с его архитектурой разбираться - чего это там за внешние регистры... Да это был бы выход конечно. Но, как Вы уже сказали частота немалая (хотя мне кажется можно и под такую частоту микруху подобрать если порыться в тырнете) и места нет. Потому и хотел именно програмно...
Имелось в виду другое. Регистр - это набор триггеров. А в зависимости каких и как включенных - будет разный смысл. Я имел в виду набор RS триггеров (или чего нибудь подобного). Входы S на датчики, входы R объединить и на вывод МК для сброса. Выходы хоть через последовательный сдвиговый регистр, хоть напрямую в МК. По такой структуре ничего не потеряется даже при низкой частоте опроса. Здесь критерий будет частота выборок, а не длина входных импульсов.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения