Если непонятно - пиши, поясню на примере. Все получается не очень компактно(из-за таблицы), но очень быстро и просто и без условных переходв.
Цитата:
Тогда таблицу придётся делать для всех возможных комбинаций, т.е. 2^4 = 16 байт для хранения, по сути, всего двух бит (0 или ±1). Как-то нерационально, а бешеная скорость мне не нужна: по даташиту максимальная скорость вращения энкодера 100 об/мин.
Да. 16 байт. Но не только для хранения 2 бит. Таблица дает возможность исключить всевозможные проверки и условные переходы, а это тоже место. А 16 байт - это 8 команд(всего лишь). Попробуй, напиши с таблицей и без, тогда поговорим о длине кода и затем о рациональности.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб апр 16, 2011 08:21:57
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
eufs писал(а):
Да. 16 байт. Но не только для хранения 2 бит. Таблица дает возможность исключить всевозможные проверки и условные переходы, а это тоже место. А 16 байт - это 8 команд(всего лишь). Попробуй, напиши с таблицей и без, тогда поговорим о длине кода и затем о рациональности.
Ну, я не говорил, что совсем отказываюсь от таблицы К тому же, у меня есть подозрение что с таблицей будет проще организовать обработку двух энкодеров.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 17, 2011 13:15:09
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
DX168B писал(а):
Подскажите, как можно разделить 8-битное число на 2? Сдвигом вправо?
ДА По кр. мере, положительное.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 17, 2011 13:19:56
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Знаковое или нет, там не играет роли. Мне нужно было поделить число пополам, отвечающее за частоту ШИМ, чтобы его вставить в регистр сравнения. TINY26L, TIMER1 OCR1C - число n+1 (частота ШИМ) OCR1A - число n\2 (длинна периода) Разрабатываю кодер\декодер сигнатур для радиосвязи. Спасибо
_________________ I am DX168B and this is my favourite forum on internet!
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 19, 2011 11:17:01
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:0
Gudd-Head писал(а):
Как с помощью МК определить направление вращения энкодера, покрасивее и покомпактнее? Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую. Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
Можно с помощью аппаратного прерывания по положительному фронту. Подаете первую ногу энкодера, например, на INT0. В обработчике считываете вторую ногу. Если 0 - то одно направление, если 1 - другое. Можно замутить внешний детектор на одном D-триггере. Полет фантазии безграничен
_________________ Все будет только лучше, в крайнем случае - хуже.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 19, 2011 11:22:49
Друг Кота
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
coredumped писал(а):
Можно с помощью аппаратного прерывания по положительному фронту. Подаете первую ногу энкодера, например, на INT0. В обработчике считываете вторую ногу. Если 0 - то одно направление, если 1 - другое. Можно замутить внешний детектор на одном D-триггере. Полет фантазии безграничен
Во-первых, не хочется делать это в прерывании. Во-вторых, такой алгоритм даст всего одно прерывание на 4 изменения положения энкодера. Ну и в-третьих, только внешнего D-триггера мне и не хватало, когда есть МК.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 19, 2011 18:11:41
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:0
moza-mult писал(а):
Период импульса Т 1100 машинных циклов (305 мкс*) Длительность импульса t 340 машинных циклов (94 мкс*) Источники прерывания Запрос на прерывание от внешнего источника INT0 Запрос на прерывание от внутреннего источника INT1 исходник добавил... но не могу понять как он работает... и работает ли... проверить на анализаторе его временно не могу... поэтому если есть возможность ответьте плиз
Не хочу читать нотаций, просто в паузах, пока компилится проект на ARM (минут 10) скучно... А тут какраз плата с 16й мегой валялась
Как с помощью МК определить направление вращения энкодера, покрасивее и покомпактнее? Энкодер двухбитный в коде Грея, т.е. последовательность 00-10-11-01 в одну сторону и 00-01-11-10 в другую. Пока в голову не приходит ничего лучше, чем сравнивать прошлые 2 бита и новые 2 бита с константами (CPI с последующим BREQ на каждую константу) "0010", "1011", "1101" и "0100" в случае инкремента (условно); "0001", "0111", "1110" и "1000" в случае декремента.
Можно с помощью аппаратного прерывания по положительному фронту. Подаете первую ногу энкодера, например, на INT0. В обработчике считываете вторую ногу. Если 0 - то одно направление, если 1 - другое. Можно замутить внешний детектор на одном D-триггере. Полет фантазии безграничен
Чуть изношеный энкодер дает дребезг по фронтам, поэтому так делать нельзя. С аппаратным триггером на входе-это получится, но нужен еще один корпус. Так что для полетов не так и много места.
Добрый день ребята ! Я к вам за помощью и советами-вот с утра вожусь со SPI интерфейсом на MEGA16 ,никак не хочет нормально работать зараза. Собственно идея в том,чтобы передать сигналы 'A' и 'B' с одного МК на другой и переключать соответствующие светодиоды на ведомом МК-зеленый и желтый,т.е. нажимаешь одну кнопку-горит соответствующий светодиод,а другой светодиод выключается,нажимаещь другую-наоборот. где я ошибаюсь-не понимаю. Прикрепляю исходные коды и схему в ПРОТЕУСЕ. Заранее благодарю!
И как тогда контроллер сообразит что кнопка нажата, если кнопки подключены тоже к +? Так что кнопки сажаем на землю и меняем sbic на sbis. Ну и еще про антидребезг не забываем...
И как тогда контроллер сообразит что кнопка нажата, если кнопки подключены тоже к +? Так что кнопки сажаем на землю и меняем sbic на sbis. Ну и еще про антидребезг не забываем...
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб апр 23, 2011 23:07:12
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:0
teist писал(а):
подскажите пожалуйста насчет антидребезга, я так понял что бороться с ним надо задержкой. а какую лучше выбрать. Например 0,1с подойдет?
методов много, я использую следующий - читаем порт с задержкой 3 раза, если все 3 раза прочиталось одно и тоже, значит считаем, что событие произошло (нажатие кнопки или чего-то там еще дребезжащего). Задержку нужно выбирать в зависимости от кнопки. Обычно достаточно 10-50мкс. А Вы хотите в 10000 раз больше - это слишком "эстонское" устройство может получиться Поставьте 10 мкс, если будут ложные срабатывания, увеличьте.
_________________ Все будет только лучше, в крайнем случае - хуже.
Время подавления дребезга контактов умные дядьки рекомендуют делать некратным длительности периода сети и не менее 100мс. То есть ближайшее значение 110мс, затем 130, 150,170. А вот более 200 мс рекомендуют делать для узлов управления с повышенными внешними помехами. Например в автомобилях. Я, как правило, делаю 150 мс. Если в течении этого времени активный уровень от контакта стабильный - контакт замкнутый.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн апр 25, 2011 18:31:37
Встал на лапы
Зарегистрирован: Вс фев 27, 2011 01:01:11 Сообщений: 86 Откуда: Республика Крым
Рейтинг сообщения:0
eufs писал(а):
Время подавления дребезга контактов умные дядьки рекомендуют делать некратным длительности периода сети и не менее 100мс. То есть ближайшее значение 110мс, затем 130, 150,170. А вот более 200 мс рекомендуют делать для узлов управления с повышенными внешними помехами. Например в автомобилях. Я, как правило, делаю 150 мс. Если в течении этого времени активный уровень от контакта стабильный - контакт замкнутый.
дребезг контактов - это время, за которое при нажатии на кнопку установится стабильное соединение (разъединение) контактов. Все зависит от самой кнопки, Например, подпружиненные срабатывают немного быстрее обычных. Как правило 20 мс хватает для всех случаев. 100-150 мс, как на мой взгляд, долговато. Здесь уже можно успеть нажать и отпустить кнопку, успешно приняв сигнал за дребезг... Борьба с помехами-это несколько другая ситуация, и тут надо смотреть в каждом случае отдельно...
_________________ Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн апр 25, 2011 19:25:27
Опытный кот
Карма: 3
Рейтинг сообщений: 43
Зарегистрирован: Вт апр 12, 2011 18:38:19 Сообщений: 838 Откуда: с Земли
Рейтинг сообщения:0
eufs писал(а):
Время подавления дребезга контактов умные дядьки рекомендуют делать некратным длительности периода сети и не менее 100мс. То есть ближайшее значение 110мс, затем 130, 150,170. А вот более 200 мс рекомендуют делать для узлов
Это кто рекомендует? Умные дядьки что курят? Че за бред? За секунду кнопку 10 раз нажать можно, ну ладно, любой и каждый 5 раз нажмет, а это 5 нажатий и 5 отпусканий. С таким подходом Ваш контроллер посчитает это дребезгом. Или Вы спутали милисекунды и микросекунды? Включите здравый смысл
_________________ Все будет только лучше, в крайнем случае - хуже.
дребезг контактов - это время, за которое при нажатии на кнопку установится стабильное соединение (разъединение) контактов. Все зависит от самой кнопки, Например, подпружиненные срабатывают немного быстрее обычных. Как правило 20 мс хватает для всех случаев. 100-150 мс, как на мой взгляд, долговато. Здесь уже можно успеть нажать и отпустить кнопку, успешно приняв сигнал за дребезг... Борьба с помехами-это несколько другая ситуация, и тут надо смотреть в каждом случае отдельно...
20 мс, это очень мало. Да и не к чему. 50 раз в секунду никто кнопки нажимать не будет, а помехоустойчивость выше. Это я в руководстве по программированию МК лет 10 назад еще читал (еще для 51,но суть дела не меняет). Там очень тесно связывалась моторика и физиология человека с подобными вещами. Приводились выкладки зачем и почему выбираются те или иные интервалы.
Для Вас специально привожу пример, который запомнился оттуда же. Подготовленная реакция человека на событие (зажигается например светодиод и этого человек пристально ждет) лежит в диапазоне 100-150мс, а неподготовленная, то есть та, которая происходит внезапно - 300-500мс, а если пьяный, то до 2 сек доходит. Можете проверить это каким либо образом на себе. я убежден, что цифры правильные. А теперь скажите, зачем делать подавление дребезга 20мс, если все равно никаких действий, чаще чем 10 раз в секунду (100мс) Вы все равно пальцами сделать не сможете, а даже если у вас это получится - все равно отреагировать на каждое нажатие неполучится. Проще и грамотнее делать автоповтор нажатия на кнопку. По поводу нажал-отпустил за 100мс - аргумент еще проще - нафига было нажимать. Мы же заботимся об эргономике и помехоподавлении, а не об играх с кнопками.
Время подавления дребезга контактов умные дядьки рекомендуют делать некратным длительности периода сети и не менее 100мс. То есть ближайшее значение 110мс, затем 130, 150,170. А вот более 200 мс рекомендуют делать для узлов
Это кто рекомендует? Умные дядьки что курят? Че за бред? За секунду кнопку 10 раз нажать можно, ну ладно, любой и каждый 5 раз нажмет, а это 5 нажатий и 5 отпусканий. С таким подходом Ваш контроллер посчитает это дребезгом. Или Вы спутали милисекунды и микросекунды? Включите здравый смысл
С таким подходом к школьному курсу физики Ваш контроллер вообще ничего не посчитает...Сколько в секунде миллисекунд?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения