Как на С "приплюсовать" два символа?
Дык ё-моё... Это неправильная обработка входных сигналов...
- Реклама
Это точно.
А как же их правильно тогда обработать? Чтоб за раз только один раз проскакивал. Намекните пожалуйста, если не секрет. Делать задержку delay^ем - не вариант по моему, while - тоже не помогает. А как же еще тогда?
А как же их правильно тогда обработать? Чтоб за раз только один раз проскакивал. Намекните пожалуйста, если не секрет. Делать задержку delay^ем - не вариант по моему, while - тоже не помогает. А как же еще тогда?
Боишься? Сиди дома!
Я так не умею. Или не понимаю о чем Вы. Можно подробнее немного? Или где прочитать можно.В цикле по "ИЛИ" складывайте
Боишься? Сиди дома!
вам уже пример прислали как складывать там где программа была.
возможно у вас теперь ловит, потому что портов три, если использовать пц инт, то возникнет три прерывания.При выходе из прерывания нужно очищать флаг запроса всех трех.
Я так думаю.
Вообще было бы неплохо на ваш вариант программы посмотреть.
Вообще можно попробовать одинарным считыванием читать, посылать что получится и посмотреть какие варианты бывают.
Если датчики не подключаются в состояние выкл то это или в общем то бесполезно.
возможно у вас теперь ловит, потому что портов три, если использовать пц инт, то возникнет три прерывания.При выходе из прерывания нужно очищать флаг запроса всех трех.
Я так думаю.
Вообще было бы неплохо на ваш вариант программы посмотреть.
Вообще можно попробовать одинарным считыванием читать, посылать что получится и посмотреть какие варианты бывают.
Если датчики не подключаются в состояние выкл то это или в общем то бесполезно.
В поисках истины человек развивается.
- Реклама
Нет-нет. Я сделал пока как Alex посоветовал - просто увеличил длительность импульса на входе аппаратно.
А в программе все до неприличия просто:
И так опрашивается пин за пином и сразу отсылается символ если там 1.
Дык вот теперь из-за того что длительность импульса с датчика большая, МК успевает его засечь по 10-15 раз.
Обычно пустым циклом while(типа while(PIND.7==1){}) решал такое, а здесь, так как пьезодатчик не просто подает 1 в порт, а колеблется(т.е. 1-0-1-0-1-0) какое-то время, этим while не получается, проскакивает, сволочь.
А в программе все до неприличия просто:
Код: Выделить всё
if(PIND.7==1)
{while(!(UCSRA & (1<<UDRE))); //ждем опустошение регистра передачи
UDR = 'G';} //отправляем символДык вот теперь из-за того что длительность импульса с датчика большая, МК успевает его засечь по 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 раза.
Причина: код
Причина: код
Боишься? Сиди дома!
Главное во время подумать и уловить мысльДа, я об этом как раз и подумал
Зачёт !
Согласен с вами на все сто!Главное во время подумать и уловить мысль
Только еще очень важно чтоб кто-то указал направление.
Посему еще раз спасибо!
Боишься? Сиди дома!
А я значит в лес направил?
Как насчет аппаратно сделать так: Верхняя схема должна работать как формирователь импульсов только нужно подобрать подходящие сопротивление и конденсатор.
И еще вот как можно.
И вообще мне непонятен смысл данного устройства, если вы говорите датчики срабатывают пачками, а сами отдельно каждый датчик опрашиваете, да еще и задержку ловите на нем.
Не понимаю смысла.
Я же написал похожеDerMeister писал(а):Нет, дребезг тут не причем.
Как насчет аппаратно сделать так: Верхняя схема должна работать как формирователь импульсов только нужно подобрать подходящие сопротивление и конденсатор.
И еще вот как можно.
И вообще мне непонятен смысл данного устройства, если вы говорите датчики срабатывают пачками, а сами отдельно каждый датчик опрашиваете, да еще и задержку ловите на нем.
Не понимаю смысла.
В поисках истины человек развивается.
Когда приходят очень короткие импульсы - лучше всего их запоминать на внешнем регистре, а через определенные промежутки времени этот регистр опрашивать и сбрасывать. Если хочется, можно кодировать состояние регистра не одной буквой на вход, а комбинацией и отправлять вместе с текущим временем, которое внутри контроллера надо считать. Можно отправлять просто номер интервала оцифровки. Тогда на приемном конце USART можно восстановить ситуацию с датчиками с точностью до интервала оцифровки состояния входного регистра.
C0FFEE=12648430
Я понимаю. Я прсто Вам уточнил, что это не дребезг.Я же написал похоже
Дык я и поймаю свою пачку в чем проблема-то? Просто одно срабатывание датчика МК у меня успевал поймать по 12-15 раз. Вот поэтому и пришлось ввести задержку: раз сработал - хорошо. Я же знаю, что за время моей задержки он сработать не может больше. Так что получил, что хотел.И вообще мне непонятен смысл данного устройства
Спасибо Вам за схемки. Я знаю как сделать аппаратно. Мне хотелось именно програмно. Потому что: во-первых: мне это наиболее интересно, как начинающему контроллерщику, во-вторых: в корпусе совсем нет места для кондера и резистора, а их пришлось бы ставить по 20 штук; в-третьих: мне все-таки кажется зачем городить огород из рассыпухи есло можно решить вопрос програмно?Как насчет аппаратно сделать так
Нет конечно! Просто, как я уже писал, хотелось именно програмно это все сделать. И спасибо я сказал ВСЕМ. И Вам в том числе. Ваши советы не в коей мере не хуже или лучше чем советы других. С Вашей помощью я тоже кое-чего нового узнал - в жизни пригодится!А я значит в лес направил?
Чесно говоря, я плохо понял о чем это Вы... Я ведь еще только учусь. И это в жизни моей всего лишь третья программа...Когда приходят очень короткие импульсы - лучше всего их запоминать на внешнем регистре
Боишься? Сиди дома!
внешний регистр это микросхема такая, на ногах у нее ваши датчики, при прошествии определенного времени считываете показания ног последовательно, то есть есть режим параллельного ввода в нее и последовательного вывода из нее.
Таким образом переключив из режима ввода смена состояния ног уже никак не влияет на выходные данные.Этакие стоп кадры.Потом эти стоп кадры можно анализировать.
Если частота стоп кадров будет выше, чем частота изменения сигналов с датчиков, то вы ничего не потеряете.
Хотя в вашем случае это нереально.Такие короткие промежутки.
Таким образом переключив из режима ввода смена состояния ног уже никак не влияет на выходные данные.Этакие стоп кадры.Потом эти стоп кадры можно анализировать.
Если частота стоп кадров будет выше, чем частота изменения сигналов с датчиков, то вы ничего не потеряете.
Хотя в вашем случае это нереально.Такие короткие промежутки.
В поисках истины человек развивается.
Ааааа...! Ну конечно! Чего это я так дурканул. Я то думал, что речь об МК. Уже было полез опять с его архитектурой разбираться - чего это там за внешние регистры...внешний регистр это микросхема такая
Да это был бы выход конечно. Но, как Вы уже сказали частота немалая (хотя мне кажется можно и под такую частоту микруху подобрать если порыться в тырнете) и места нет. Потому и хотел именно програмно...
Боишься? Сиди дома!
Имелось в виду другое. Регистр - это набор триггеров. А в зависимости каких и как включенных - будет разный смысл. Я имел в виду набор RS триггеров (или чего нибудь подобного). Входы S на датчики, входы R объединить и на вывод МК для сброса. Выходы хоть через последовательный сдвиговый регистр, хоть напрямую в МК.
По такой структуре ничего не потеряется даже при низкой частоте опроса. Здесь критерий будет частота выборок, а не длина входных импульсов.
По такой структуре ничего не потеряется даже при низкой частоте опроса. Здесь критерий будет частота выборок, а не длина входных импульсов.
C0FFEE=12648430
Согласен с Вами. Тригер как защелку использовать. Просто я сразу не понял о чем речь. У меня все мысли в контроллере. Вот и загнался так сказатьРегистр - это набор триггеров
Боишься? Сиди дома!


