|
MEGA+энкодер |
|
|
|
 |
Ответов
|
Dec 6 2006, 13:28
|
Участник

Группа: Участник
Сообщений: 31
Регистрация: 25-07-06
Пользователь №: 19 070

|
Перечитал эту ветку и хочу предложить свой алгоритм подавления дребезга. Обкатал его на макете с двумя разными энкодерами (оптический из старой мышки) и механический ALPS - работает четко. Исходные даные - один выход энкодера заводим на вход INT0 (PIND_Bit2), второй выход на другую ногу (в данном случае PIND_Bit3). Настраиваем прерывание INT0 по любому фронту. Есть глобальная переменная "Volume", которая изменяет свое значение при вращении энкодера. Обработчик прерывания: Код #pragma vector=INT0_vect __interrupt void handler_int0(void) { static char flag;
if (flag == PIND_Bit2 ) return;
flag=PIND_Bit2;
if ((PIND_Bit3 == PIND_Bit2) && (volume <255)) volume++; if ((PIND_Bit3 != PIND_Bit2) && (volume > 0)) volume--; } И не используется никаких конденсаторов, таймеров или задержек, при этом все работает как должно. Что я упустил?
|
|
|
|
|
Jun 17 2008, 11:06
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 13-06-08
Из: KYIV
Пользователь №: 38 269

|
Цитата(676038 @ Dec 6 2006, 16:28)  Перечитал эту ветку и хочу предложить свой алгоритм подавления дребезга. Обкатал его на макете с двумя разными энкодерами (оптический из старой мышки) и механический ALPS - работает четко.
Исходные даные - один выход энкодера заводим на вход INT0 (PIND_Bit2), второй выход на другую ногу (в данном случае PIND_Bit3). Настраиваем прерывание INT0 по любому фронту. Есть глобальная переменная "Volume", которая изменяет свое значение при вращении энкодера.
... взял за основу, прерьівание по спаду volume - вьівожу на дисплейчик сделал так: Код interrupt [EXT_INT0] void ext_int0_isr(void) { GICR = 0x00; delay_ms(3); if (!PIND.2) { if ((PIND.1==0) && (volume <255)) volume++; if ((PIND.1==1) && (volume > 0)) volume--; } GICR = 0x40; } получил интересную картину, на один щелчок енкодера проходит 2 значения т.е. на дисплейчике видньі только четньіе или нечетньіе числа что я не так делаю? или советуете обрабатьівать в основном цикле как у Леонид Иванович
|
|
|
|
|
Jun 17 2008, 14:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(wired @ Jun 17 2008, 14:06)  взял за основу, прерьівание по спаду volume - вьівожу на дисплейчик ....... получил интересную картину, на один щелчок енкодера проходит 2 значения т.е. на дисплейчике видньі только четньіе или нечетньіе числа что я не так делаю? или советуете обрабатьівать в основном цикле как у Леонид Иванович Достался мне как-то "в наследство" проект, в котором обработывался энкодер... "Дядя" его обработку сделал - как и Вы: прерывание по одному выходу энкодера; направление вращения - анализ состояния другого выхода. Получалось - примерно тоже, что и у Вас: то изменение значения на 1 за щелчок, то на 2... Пришёл к следующему заключению: выход энкодера, заведённый на прерывание - он тоже, конечно, "дребезжит", поэтому после изменения этого выхода -> взводится соответствующий флаг -> происходит прерывание -> флаг сбрасывается, но "дребезг" приводит к повторной установке флага во время обрабоки прерывания -> после выхода из прерывания имеем ещё одно прерывание на тот же щелчок энкодера. Иногда повторного прерывания не происходит, тогда - приращение на 1. В результате - переделал обработку энкодера - получил, что-то аналогичное обработке от Леонида Ивановича. Рекомендую и Вам сделать что-то такое же.
|
|
|
|
|
Jun 17 2008, 15:01
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 13-06-08
Из: KYIV
Пользователь №: 38 269

|
Цитата(Палыч @ Jun 17 2008, 17:51)  Достался мне как-то "в наследство" проект, в котором обработывался энкодер... "Дядя" его обработку сделал - как и Вы: прерывание по одному выходу энкодера; направление вращения - анализ состояния другого выхода. Получалось - примерно тоже, что и у Вас: то изменение значения на 1 за щелчок, то на 2... Пришёл к следующему заключению: выход энкодера, заведённый на прерывание - он тоже, конечно, "дребезжит", поэтому после изменения этого выхода -> взводится соответствующий флаг -> происходит прерывание -> флаг сбрасывается, но "дребезг" приводит к повторной установке флага во время обрабоки прерывания -> после выхода из прерывания имеем ещё одно прерывание на тот же щелчок энкодера. Иногда повторного прерывания не происходит, тогда - приращение на 1. В результате - переделал обработку энкодера - получил, что-то аналогичное обработке от Леонида Ивановича. Рекомендую и Вам сделать что-то такое же. но на время обработки я прерьівание то запрещаю... жду... странно. собсно ничего не мешает устроить обработчик в основном цикле
|
|
|
|
|
Jun 18 2008, 07:54
|

Участник

Группа: Участник
Сообщений: 28
Регистрация: 13-06-08
Из: KYIV
Пользователь №: 38 269

|
Цитата(Палыч @ Jun 17 2008, 18:09)  Чего их (прерывания) запрещать? Они при входе в процедуру прерывания и так - запрещены. Дело в том, что при прерывании сбрасывается флаг, который это прерывание порадил, но поскольку уровень сигнала некоторое время скачет ("дребезг"), то за время выполнения процедуры прерывания флаг взводится повторно! После того как будет произведен выход из прерывания - оно (прерывание) повторится. Как вариант - очистка флага перед выходом из прерывания. УПС...  вот про єто я не знал, что прерьівания во время входа в обработчик запрещеньі. а про флаг спасибо, буду сбрасьівать. Цитата(676038 @ Jun 17 2008, 18:12)  Может стоит добавить, сейчас обрабатываю энкодер так: Код if (((tmp >> 1) & 0x01) == (tmp & 0x01)) Execute(0x11); //если поворот первого энкодера я правильно понял? в Execute(0x11) тьі вьізьіваешь внешний обработчик?
|
|
|
|
Сообщений в этой теме
vetbaston MEGA+энкодер Sep 19 2006, 05:17 XsanyaX Один из сигналов (А или В ) я заводил на внешнее ... Sep 19 2006, 07:47 Леонид Иванович Обработка энкодера по прерываниям неудобна, так ка... Sep 19 2006, 08:25  Kovrov Цитата(Леонид Иванович @ Sep 19 2006, 12... Sep 21 2006, 07:18   Леонид Иванович А какой физический смысл несет переменная "чу... Sep 21 2006, 09:07    Kovrov Цитата(Леонид Иванович @ Sep 21 2006, 13... Sep 21 2006, 15:46   Shurmas Цитата(Kovrov @ Sep 21 2006, 11:18) пробл... Sep 21 2006, 09:17 psw Цитата(vetbaston @ Sep 19 2006, 10:17) Ес... Sep 19 2006, 08:52 Maik-vs Цитата(psw @ Sep 19 2006, 12:52) здесь ку... Sep 14 2007, 11:50  qqqqqq Цитата(Maik-vs @ Sep 14 2007, 17:50)... Sep 14 2007, 15:17   gte Цитата(qqqqqq @ Sep 14 2007, 19:17) Да. Б... May 16 2008, 17:29    777777 Цитата(gte @ May 16 2008, 21:29) Благо, н... May 17 2008, 14:19     gte Ну так порекомендуйте ортронный по сносной цене. May 17 2008, 19:45     _Pasha Цитата(777777 @ May 17 2008, 17:19) Так о... May 18 2008, 06:17     rx3apf Цитата(777777 @ May 17 2008, 18:19) Ну вы... May 18 2008, 10:52      777777 Цитата(rx3apf @ May 18 2008, 14:52) Видел... May 18 2008, 17:04       rx3apf Цитата(777777 @ May 18 2008, 21:04) И что... May 18 2008, 18:03        777777 Цитата(rx3apf @ May 18 2008, 22:03) Основ... May 19 2008, 09:09         rx3apf Цитата(777777 @ May 19 2008, 13:09) Так в... May 19 2008, 18:51          777777 Цитата(rx3apf @ May 19 2008, 22:51) Но ес... May 20 2008, 07:27           gte Цитата(777777 @ May 20 2008, 11:27) Ты пр... May 20 2008, 09:06 vetbaston Спасибо всем! Буду пробовать! Sep 19 2006, 11:12 Nikola Kirov Не невозможно сделат на 2 перервания.
Вот я делал.... Sep 19 2006, 11:16 Shurmas советую апноут микрочип AN696 - там схемотехника и... Sep 19 2006, 11:37 xemul Для устранения дребезга по нескольким входам с оди... Sep 21 2006, 09:42 Vladimir_T Еще есть такое решение:
По тику таймерного прерыва... Sep 21 2006, 11:31 Леонид Иванович Если частота опроса 20 Гц, то получится страшно то... Sep 21 2006, 12:09  Vladimir_T Цитата(Леонид Иванович @ Sep 21 2006, 15... Sep 22 2006, 04:48   qqqqqq Цитата(Vladimir_T @ Sep 22 2006, 10:48) Э... Sep 13 2007, 12:08  sitafern Цитата(Леонид Иванович @ Sep 21 2006, 15... May 18 2008, 11:23   Леонид Иванович Цитата(sitafern @ May 18 2008, 14:23) Про... May 20 2008, 09:03 Kovrov Цитата(Vladimir_T @ Sep 21 2006, 15:31) Е... Sep 22 2006, 07:10  Леонид Иванович С чувствительностью энкодера понятно. Я обычно дел... Sep 22 2006, 08:30   Kovrov Цитата(Леонид Иванович @ Sep 22 2006, 12... Sep 22 2006, 11:57    Леонид Иванович Цитата(Kovrov @ Sep 22 2006, 14:57) Могу ... Sep 22 2006, 21:23     Kovrov конечно же спорить не о чем, да мы и не спорим - о... Sep 23 2006, 04:00      Stas633 Хочу поделиться результатами опытов с энкодером...... Nov 6 2006, 12:20 _artem_ Наверно загадочность заключается в том что :
- при... Sep 21 2006, 17:34 _artem_ Если нужно несколько таймеров а возиться неохота ... Sep 22 2006, 09:25 Kovrov 0.15 это очень много...
попробуйте использовать ин... Nov 7 2006, 07:13  676038 Цитата(wired @ Jun 17 2008, 17:06) взял з... Jun 17 2008, 13:45   wired Цитата(676038 @ Jun 17 2008, 16:45) Я счи... Jun 17 2008, 14:11    676038 Цитата(wired @ Jun 17 2008, 21:01) но на ... Jun 17 2008, 15:09     676038 Цитата(676038 @ Jun 17 2008, 21:09) Добав... Jun 17 2008, 15:12      Палыч Цитата(676038 @ Jun 17 2008, 18:12) Может... Jun 17 2008, 15:32 Kovrov ничего не упустилию
просто процессор лишний раз па... Dec 6 2006, 19:58 aforestman Посмотрите на "хвостатый экодер". Может ... Dec 8 2006, 13:39 OlegIvanov Нарисуйте на бумажке работу энкодера и сгенерируйт... Dec 13 2006, 05:15 _Pasha Ниасилил выделенный участок осциллограммы. Что это... May 17 2008, 05:04 gte Вероятнее всего моя рука дрогнула. Т.е. в этом мес... May 17 2008, 06:34  _Pasha Цитата(gte @ May 17 2008, 09:34) На один ... May 17 2008, 07:21 gte Смотрел на одном. Но исходя из вида плоскости конт... May 17 2008, 07:51 gte Ради справедливости. Оптические есть с фиксацией и... May 19 2008, 05:15 676038 В своем последнем варианте - по изменению состояни... Jun 17 2008, 15:48 Maik-vs Цитата(676038 @ Jun 17 2008, 19:48) Прост... Jun 18 2008, 09:41  wired Цитата(Maik-vs @ Jun 18 2008, 12:41)... Jun 18 2008, 11:36   Maik-vs Цитата(wired @ Jun 18 2008, 15:36) какое ... Jun 18 2008, 14:33    wired Цитата(Maik-vs @ Jun 18 2008, 17:33)... Jun 18 2008, 15:01    wired Цитата(Maik-vs @ Jun 18 2008, 17:33)... Jun 23 2008, 06:39     Maik-vs Цитата(wired @ Jun 23 2008, 10:39) я прав... Jun 26 2008, 12:46      wired Цитата(Maik-vs @ Jun 26 2008, 15:46)... Jun 26 2008, 14:48 Палыч Цитата(676038 @ Jun 17 2008, 18:48) Прост... Jun 18 2008, 12:47  gte Цитата(Палыч @ Jun 18 2008, 16:47) грамоз... Jun 18 2008, 12:58   Палыч Цитата(gte @ Jun 18 2008, 15:58) При испо... Jun 18 2008, 13:10 gte Именно такой. Я смотрел анализатором переключая по... Jun 18 2008, 13:19 Палыч Посмотрел DS. В нём есть рисунок "Quadrature ... Jun 18 2008, 14:25  gte Цитата(Палыч @ Jun 18 2008, 18:25) Посмот... Jun 18 2008, 15:14 ozzy Цитата(wired @ Jun 18 2008, 14:36) ...
и... Jun 20 2008, 20:37 haker_fox Использую датчики от мышки для управления двигател... Jun 24 2008, 03:33 tremor Читать всю тему влом, поэтому просто приведу свой ... Jun 24 2008, 18:08 haker_fox Цитата(tremor @ Jun 25 2008, 03:08) PEC16... Jun 25 2008, 01:44 tremor ЦитатаТолько вряд ли он выдержит вращения на высок... Jun 25 2008, 01:54 haker_fox Цитата(tremor @ Jun 25 2008, 10:54) В ДШ ... Jun 25 2008, 04:27 sansnotfor мой вариант. энкодер опрашиваю в прерывании таймер... Nov 12 2008, 09:51 Genadi Zawidowski Ух ты... А тема ещй жива... Попробую предложиьть и... Nov 13 2008, 16:41 Andrew O. Shadoura Добавлю немного в копилку. Знаю, не самый лучший в... Nov 15 2008, 12:41 Павлик Приложу свою первую подпрограмку для работы с Энк... Nov 15 2008, 14:14 sansnotfor оооо... заметил, что мой код можно сократить в это... Nov 21 2008, 06:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|