Обсуждаем контроллеры компании Atmel.
Ответить

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 12:22:37

Дык ё-моё... Это неправильная обработка входных сигналов...

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 14:42:25

Это точно.
А как же их правильно тогда обработать? Чтоб за раз только один раз проскакивал. Намекните пожалуйста, если не секрет. Делать задержку delay^ем - не вариант по моему, while - тоже не помогает. А как же еще тогда?

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 15:14:05

В цикле по "ИЛИ" складывайте

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 15:27:09

В цикле по "ИЛИ" складывайте

Я так не умею. Или не понимаю о чем Вы. Можно подробнее немного? Или где прочитать можно.

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 16:19:51

вам уже пример прислали как складывать там где программа была.
возможно у вас теперь ловит, потому что портов три, если использовать пц инт, то возникнет три прерывания.При выходе из прерывания нужно очищать флаг запроса всех трех.
Я так думаю.
Вообще было бы неплохо на ваш вариант программы посмотреть.

Вообще можно попробовать одинарным считыванием читать, посылать что получится и посмотреть какие варианты бывают.
Если датчики не подключаются в состояние выкл то это или в общем то бесполезно.

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 16:47:51

Нет-нет. Я сделал пока как 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 не получается, проскакивает, сволочь.

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 17:56:28

Стоп, если у вас состояние меняется раз в 10мс не думали сколько раз за секунду может меняться?
и тем более получается что цикл может пройти несколько раз пока разрядится конденсатор.Пробуйте уменьшить емкость конденсатора.

еще как вариант сохранять состояние регистров и только если есть изменения, то отправлять.

так как пьезодатчик не просто подает 1 в порт, а колеблется(т.е. 1-0-1-0-1-0) какое-то время,

то что вы описали похоже на дребезг.Как раз таки конденсатор нужного номинала помогает справиться с дребезжащими контактами.
есть вариант так же что ваш транзистор, который вы поставили для усиления поднимает уровень напряжения недостаточно и поэтому малейшее колебание наводок меняет состояние порта.Так же возможно что для увеличения помехоустойчивости потребуется подтягивающие резисторы на каждую ногу. Хотя бы внутренние.

Re: Как на С "приплюсовать" два символа?

Сб авг 11, 2012 21:41:41

Опросили ПИН, если поймали сработку датчика, то определённое время больше его не опрашиваете. Короче, как защита от дребезга на кнопке.

Re: Как на С "приплюсовать" два символа?

Пн авг 13, 2012 18:47:27

то что вы описали похоже на дребезг

Нет, дребезг тут не причем. Это физика работы пьезодатчика: чем сильнее его "ударить" единожды, тем дольше он будет вибрировать после воздействия. Вырабатывая переменное напряжение на выводах своих с убывающей амплитудой.
Короче, как защита от дребезга на кнопке.

Да, я об этом как раз и подумал, только сразу не всосал как это реализовать. Но стоило немного подумать...
Вышел из ситуации вот так:
Код:
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 раз(а).
Причина: код

Re: Как на С "приплюсовать" два символа?

Пн авг 13, 2012 19:10:29

Да, я об этом как раз и подумал
Главное во время подумать и уловить мысль :))

Зачёт ! :wink:

Re: Как на С "приплюсовать" два символа?

Пн авг 13, 2012 19:25:12

Главное во время подумать и уловить мысль

Согласен с вами на все сто!
Только еще очень важно чтоб кто-то указал направление.
Посему еще раз спасибо!

Re: Как на С "приплюсовать" два символа?

Пн авг 13, 2012 22:14:18

А я значит в лес направил?
DerMeister писал(а):Нет, дребезг тут не причем.

Я же написал похоже

Как насчет аппаратно сделать так:
Датчик пьезо.GIF
(10.41 KiB) Скачиваний: 374

Верхняя схема должна работать как формирователь импульсов только нужно подобрать подходящие сопротивление и конденсатор.

И еще вот как можно.
И вообще мне непонятен смысл данного устройства, если вы говорите датчики срабатывают пачками, а сами отдельно каждый датчик опрашиваете, да еще и задержку ловите на нем.

Не понимаю смысла. :dont_know:

Re: Как на С "приплюсовать" два символа?

Вт авг 14, 2012 02:12:10

Когда приходят очень короткие импульсы - лучше всего их запоминать на внешнем регистре, а через определенные промежутки времени этот регистр опрашивать и сбрасывать. Если хочется, можно кодировать состояние регистра не одной буквой на вход, а комбинацией и отправлять вместе с текущим временем, которое внутри контроллера надо считать. Можно отправлять просто номер интервала оцифровки. Тогда на приемном конце USART можно восстановить ситуацию с датчиками с точностью до интервала оцифровки состояния входного регистра.

Re: Как на С "приплюсовать" два символа?

Ср авг 15, 2012 16:53:11

Я же написал похоже

Я понимаю. Я прсто Вам уточнил, что это не дребезг.
И вообще мне непонятен смысл данного устройства

Дык я и поймаю свою пачку в чем проблема-то? Просто одно срабатывание датчика МК у меня успевал поймать по 12-15 раз. Вот поэтому и пришлось ввести задержку: раз сработал - хорошо. Я же знаю, что за время моей задержки он сработать не может больше. Так что получил, что хотел.
Как насчет аппаратно сделать так

Спасибо Вам за схемки. Я знаю как сделать аппаратно. Мне хотелось именно програмно. Потому что: во-первых: мне это наиболее интересно, как начинающему контроллерщику, во-вторых: в корпусе совсем нет места для кондера и резистора, а их пришлось бы ставить по 20 штук; в-третьих: мне все-таки кажется зачем городить огород из рассыпухи есло можно решить вопрос програмно?
А я значит в лес направил?

Нет конечно! Просто, как я уже писал, хотелось именно програмно это все сделать. И спасибо я сказал ВСЕМ. И Вам в том числе. Ваши советы не в коей мере не хуже или лучше чем советы других. С Вашей помощью я тоже кое-чего нового узнал - в жизни пригодится! :) Спасибо большое!
Когда приходят очень короткие импульсы - лучше всего их запоминать на внешнем регистре

Чесно говоря, я плохо понял о чем это Вы... Я ведь еще только учусь. И это в жизни моей всего лишь третья программа... :oops:

Re: Как на С "приплюсовать" два символа?

Ср авг 15, 2012 17:40:18

внешний регистр это микросхема такая, на ногах у нее ваши датчики, при прошествии определенного времени считываете показания ног последовательно, то есть есть режим параллельного ввода в нее и последовательного вывода из нее.
Таким образом переключив из режима ввода смена состояния ног уже никак не влияет на выходные данные.Этакие стоп кадры.Потом эти стоп кадры можно анализировать.
Если частота стоп кадров будет выше, чем частота изменения сигналов с датчиков, то вы ничего не потеряете.
Хотя в вашем случае это нереально.Такие короткие промежутки.

Re: Как на С "приплюсовать" два символа?

Ср авг 15, 2012 17:49:38

внешний регистр это микросхема такая

Ааааа...! Ну конечно! Чего это я так дурканул. Я то думал, что речь об МК. Уже было полез опять с его архитектурой разбираться - чего это там за внешние регистры... :))
Да это был бы выход конечно. Но, как Вы уже сказали частота немалая (хотя мне кажется можно и под такую частоту микруху подобрать если порыться в тырнете) и места нет. Потому и хотел именно програмно...

Re: Как на С "приплюсовать" два символа?

Ср авг 15, 2012 18:21:30

Имелось в виду другое. Регистр - это набор триггеров. А в зависимости каких и как включенных - будет разный смысл. Я имел в виду набор RS триггеров (или чего нибудь подобного). Входы S на датчики, входы R объединить и на вывод МК для сброса. Выходы хоть через последовательный сдвиговый регистр, хоть напрямую в МК.
По такой структуре ничего не потеряется даже при низкой частоте опроса. Здесь критерий будет частота выборок, а не длина входных импульсов.

Re: Как на С "приплюсовать" два символа?

Ср авг 15, 2012 18:28:10

Регистр - это набор триггеров

Согласен с Вами. Тригер как защелку использовать. Просто я сразу не понял о чем речь. У меня все мысли в контроллере. Вот и загнался так сказать :)
Ответить