Форум РадиоКот https://radiokot.ru/forum/ |
|
помогите опросить энкодер https://radiokot.ru/forum/viewtopic.php?f=20&t=27204 |
Страница 2 из 3 |
Автор: | stas00n [ Ср мар 10, 2010 00:09:31 ] |
Заголовок сообщения: | |
ooogo писал(а): я сколько не мучался, пока кондюки по 0,1 мкФ не припоял к контактам энкодера, дребезг никак побороть не мог, но конечно при быстром вращении пропускает. Наверное самый хороший вариант - это валкодер из шаговика!
0,1 мкФ - дофига, у меня 0,01 мкФ и все работает. Конечно, неплохо бы знать, какой у тебя энкодер, у меня, например, 24 импульса на оборот. Скорость вращения прикинул - максимум 2 оборота в секунду буду крутить => tи > 5-10 мс. дребезг навскидку длится меньше миллисекунды. Надо постоянную времени выбрать больше времени дребезга, и хотя бы втрое меньше длительности импульса при макс. скорости вращения. У меги внутренняя подтяжка около 50 кОм, с кондерами 0,01 мкФ получается постоянная времени 0,5 мс - пока нормально работает. И еще - если у тебя энкодер старый, снятый с убитого музцентра или микроволновки, наверняка контакты окислились, в этом случае у него не то что дребезг, там просто голимый неконтакт будет, который никакими программными ухищрениями не проймешь. Старый энкодер надо разобрать, протереть контакты ватной палочкой со спиртом и смазать WD-40, - будет как новый. Еще лучше смазать консистентной смазкой, но я к сожалению не знаю, какая подойдет для контактов, потому мажу вэдэшкой, с ней конечно износ несколько ускоряется |
Автор: | ooogo [ Ср мар 10, 2010 08:23:19 ] |
Заголовок сообщения: | |
у меня энкодер новый, но совсем китайский купил за 50 руб. для экспериментов. Цитата: 0,1 мкФ - дофига, у меня 0,01 мкФ и все работает. пробовал 0,01 визуально ориентируясь на ЖКИ чуть чуть хуже работает появляются глюки, при 0,1 мкФ глюков не видно, но видно пропуски при быстром вращении, наверное надо что-то среднее подбирать.
|
Автор: | vovik15 [ Сб янв 22, 2011 09:52:28 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
сделал опрос по перрыванию на RB6 (я пики програмирую) void interrupt enc (void){ //прерывание по RB5-RB7 if ( RBIF ==1 ) { RBIF = 0; if (RB1 == 1) enc_data++; else {enc_data--; } }} // конец обработки прерываний так вот : этот код очень криво работает,то в + считает,то в - считает пропускает некоторые щелчки энкодера подскажите пожалуйсто,как его можно оптимизировать? дребезг у меня подавляеться аппаратно,на выводах энкодера висят конденсаторы по 0,1мкф спасибо |
Автор: | ooogo [ Сб янв 22, 2011 10:31:11 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
vovik15 писал(а): сделал опрос по перрыванию на RB6 (я пики програмирую) А прерывание по какому событию? должно быть на смену уровней вот эта строчка что делает? Код: if ( RBIF ==1 ) { RBIF = 0;
|
Автор: | uldemir [ Сб янв 22, 2011 10:41:12 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
Судя по всему сбрасывает флаг прерывания. Но вот посмотрел код... vovik15, пожалуйста, почитайте внимательно первую страницу этой темы. |
Автор: | vovik15 [ Сб янв 22, 2011 14:17:06 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
ooogo писал(а): vovik15 писал(а): сделал опрос по перрыванию на RB6 (я пики програмирую) А прерывание по какому событию? должно быть на смену уровней вот эта строчка что делает? Код: if ( RBIF ==1 ) { RBIF = 0; эта строчка сбрасавает флаг по прерыванию RB6 |
Автор: | stas00n [ Сб янв 22, 2011 15:00:35 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
vovik15, сделайте примерно так (пример для энкодера подключенного к RB6,RB7): Код: void interrupt isr (void){ //... if ( RBIF && RBIE ) { //прерывание по RB4-RB7 if (!RB6){ enc_data++; } if (!RB7){ enc_data--; } RBIE = 0; //Запрет прерываний от энкодера RBIF = 0; } //... } void main (void){ //... while (!(RB7 && RB6)){} //Ожидание установки энкодера в "нейтраль" __delay_ms(5); RBIF = 0; RBIE = 1; //Разрешение прерываний от энкодера //... } Прерывание должно быть настроено на отрицательный фронт. В общем случае в прерывании всегда нужно проверять не только флаг прерывания, но и бит разрешения! Иначе, если у Вас используется более одного источника прерываний, и какое-то из них запрещено, оно все равно будет обработано, если возникнет прерывание от другого источника. Обычно в пиках для прерываний делают такую конструкцию: Код: void interrupt isr (void){
if ( RBIF && RBIE ){ Rb_Handler(); //Обработчик RB4:RB7 return; } if ( T0IF && T0IE ){ Tmr0_Handler(); //Обработчик TMR0 return; } //... и т.д. } |
Автор: | DX168B [ Сб янв 22, 2011 15:22:55 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
Самый простой пример опроса - это вешаем первый выход энкодера на внешнее прерывание. А второй выход на проверяемый пин. (к примеру PA6) В обработчике прерывания сразу же проверяем вторую ногу и принимаем решение. Если на второй ноге есть ток, то значит выполняем одно действие (крутится в одну сторону), а если на ней тока нет, то принимаем другое действие (крутится в другую сторону) Код: INT_0: in r16, SREG push r16 sbic PinA, 6 rjmp DECREMENT inc r17 pop r16 out SREG, r16 reti DECREMENT: dec r17 pop r16 out SREG, r16 reti Только вот дребезг надо будет кондёрами устранить. |
Автор: | ooogo [ Сб янв 22, 2011 16:20:53 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
vovik15 писал(а): ooogo писал(а): vovik15 писал(а): сделал опрос по перрыванию на RB6 (я пики програмирую) А прерывание по какому событию? должно быть на смену уровней вот эта строчка что делает? Код: if ( RBIF ==1 ) { RBIF = 0; эта строчка сбрасавает флаг по прерыванию RB6 разве в пиках флаг прерывания аппаратно не сбрасывается? Ваш код тоже будет работать только настройте правильно событие вызывающее прерывание, оно должно быть по спадающему фронту. |
Автор: | stas00n [ Сб янв 22, 2011 17:02:23 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
ooogo писал(а): разве в пиках флаг прерывания аппаратно не сбрасывается? Нет, не сбрасывается, т.к. вектор прерывания всего один, поэтому источник, вызвавший прерывание определяется программно, следовательно флаг прерывания тоже сбрасывать надо "вручную". |
Автор: | vovik15 [ Сб янв 22, 2011 17:47:00 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
stas00n писал(а): vovik15, сделайте примерно так (пример для энкодера подключенного к RB6,RB7): Код: void interrupt isr (void){ //... if ( RBIF && RBIE ) { //прерывание по RB4-RB7 if (!RB6){ enc_data++; } if (!RB7){ enc_data--; } RBIE = 0; //Запрет прерываний от энкодера RBIF = 0; } //... } void main (void){ //... while (!(RB7 && RB6)){} //Ожидание установки энкодера в "нейтраль" __delay_ms(5); RBIF = 0; RBIE = 1; //Разрешение прерываний от энкодера //... } Прерывание должно быть настроено на отрицательный фронт. В общем случае в прерывании всегда нужно проверять не только флаг прерывания, но и бит разрешения! Иначе, если у Вас используется более одного источника прерываний, и какое-то из них запрещено, оно все равно будет обработано, если возникнет прерывание от другого источника. Обычно в пиках для прерываний делают такую конструкцию: Код: void interrupt isr (void){ if ( RBIF && RBIE ){ Rb_Handler(); //Обработчик RB4:RB7 return; } if ( T0IF && T0IE ){ Tmr0_Handler(); //Обработчик TMR0 return; } //... и т.д. } ЭТОТ КОД К СОЖАЛЕНИЮ НЕ РАБОТАЕТ ХОТЯ И ЕОМПИЛИРУЕТЬСЯ только что пи прошивал,проверял |
Автор: | stas00n [ Сб янв 22, 2011 17:52:26 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
прикрепите сюда вложением, посмотрим. И схему. |
Автор: | vovik15 [ Сб янв 22, 2011 21:11:53 ] | ||
Заголовок сообщения: | Re: помогите опросить энкодер | ||
привожу исходный код и схему индикация вызываеться из майна,и работает отлично,поэтому я не стал указывать ее на схеме, и убрал ее из кода
|
Автор: | vovik15 [ Сб янв 22, 2011 23:14:35 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
как в этом проекте http://labkit.ru/html/tembrobloki?id=88 опрашивается ЧЕТЫРЕ энкодера. К сожалению исходников нет (( |
Автор: | ut1wpr [ Вт янв 25, 2011 10:31:15 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
stas00n писал(а): ooogo писал(а): разве в пиках флаг прерывания аппаратно не сбрасывается? Нет, не сбрасывается, т.к. вектор прерывания всего один, поэтому источник, вызвавший прерывание определяется программно, следовательно флаг прерывания тоже сбрасывать надо "вручную". |
Автор: | stas00n [ Чт янв 27, 2011 04:10:54 ] | |||
Заголовок сообщения: | Re: помогите опросить энкодер | |||
vovik15, по идее должно работать, все правильно. У меня работает и в MPLAB SIM, и в протеусе. Проверь в реальном железе.
|
Автор: | cahek80 [ Чт янв 27, 2011 06:08:52 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
у себя сделал так в главном цикле проверяется, если один из выводов энкодера сработал,ждем 1мс, приращиваем счетчик, при переполнении счетчика устанавиваем флаг нажатости ноги энкодера и наоборот, задержка при отпускании. может конечно много кода зато без дребезга. вот только очень быструю прокрутку конечно не обрабатывает |
Автор: | vovik15 [ Чт янв 27, 2011 15:55:53 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
огромное вам спаибо ище вопрос: я слышал что для пик есть библиотека задержек скажите пожалуйсто где ее взять,и как с ней работать? |
Автор: | stas00n [ Чт янв 27, 2011 16:25:17 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
Какой компилятор у Вас? Смотрите примеры и мануал. обычно бывает что-то вроде delay.h, delay.c. Нужно подключить эти модули. В PICC все нужные модули подключаются через htc.h: Код: #include <htc.h>
#define _XTAL_FREQ 4000000 //... __delay_ms(10); // Задержка 10 мс __delay_us(250); // Задержка 250 мкс |
Автор: | vovik15 [ Чт янв 27, 2011 16:36:49 ] |
Заголовок сообщения: | Re: помогите опросить энкодер |
у меня компилятор hi tech 9.70 |
Страница 2 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |