помогите опросить энкодер

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Сообщение stas00n »

ooogo писал(а):я сколько не мучался, пока кондюки по 0,1 мкФ не припоял к контактам энкодера, дребезг никак побороть не мог, но конечно при быстром вращении пропускает. Наверное самый хороший вариант - это валкодер из шаговика! :)

0,1 мкФ - дофига, у меня 0,01 мкФ и все работает. Конечно, неплохо бы знать, какой у тебя энкодер, у меня, например, 24 импульса на оборот. Скорость вращения прикинул - максимум 2 оборота в секунду буду крутить => tи > 5-10 мс. дребезг навскидку длится меньше миллисекунды. Надо постоянную времени выбрать больше времени дребезга, и хотя бы втрое меньше длительности импульса при макс. скорости вращения. У меги внутренняя подтяжка около 50 кОм, с кондерами 0,01 мкФ получается постоянная времени 0,5 мс - пока нормально работает.
И еще - если у тебя энкодер старый, снятый с убитого музцентра или микроволновки, наверняка контакты окислились, в этом случае у него не то что дребезг, там просто голимый неконтакт будет, который никакими программными ухищрениями не проймешь. Старый энкодер надо разобрать, протереть контакты ватной палочкой со спиртом и смазать WD-40, - будет как новый. Еще лучше смазать консистентной смазкой, но я к сожалению не знаю, какая подойдет для контактов, потому мажу вэдэшкой, с ней конечно износ несколько ускоряется :(
Реклама
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

у меня энкодер новый, но совсем китайский :) купил за 50 руб. для экспериментов.
0,1 мкФ - дофига, у меня 0,01 мкФ и все работает.
пробовал 0,01 визуально ориентируясь на ЖКИ чуть чуть хуже работает появляются глюки, при 0,1 мкФ глюков не видно, но видно пропуски при быстром вращении, наверное надо что-то среднее подбирать.
Реклама
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите опросить энкодер

Сообщение vovik15 »

сделал опрос по перрыванию на RB6 (я пики програмирую)

void interrupt enc (void){

//прерывание по RB5-RB7
if ( RBIF ==1 ) { RBIF = 0;

if (RB1 == 1) enc_data++;
else {enc_data--; }

}} // конец обработки прерываний

так вот : этот код очень криво работает,то в + считает,то в - считает
пропускает некоторые щелчки энкодера
подскажите пожалуйсто,как его можно оптимизировать?
дребезг у меня подавляеться аппаратно,на выводах энкодера висят конденсаторы по 0,1мкф
спасибо :)
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Re: помогите опросить энкодер

Сообщение ooogo »

vovik15 писал(а):сделал опрос по перрыванию на RB6 (я пики програмирую)

А прерывание по какому событию? должно быть на смену уровней
вот эта строчка что делает?

Код: Выделить всё

if ( RBIF ==1 ) { RBIF = 0;
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: помогите опросить энкодер

Сообщение uldemir »

Судя по всему сбрасывает флаг прерывания. Но вот посмотрел код... vovik15, пожалуйста, почитайте внимательно первую страницу этой темы.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите опросить энкодер

Сообщение vovik15 »

ooogo писал(а):
vovik15 писал(а):сделал опрос по перрыванию на RB6 (я пики програмирую)

А прерывание по какому событию? должно быть на смену уровней
вот эта строчка что делает?

Код: Выделить всё

if ( RBIF ==1 ) { RBIF = 0;

эта строчка сбрасавает флаг по прерыванию RB6
Реклама
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

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;
}
//... и т.д.
}
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: помогите опросить энкодер

Сообщение DX168B »

Самый простой пример опроса - это вешаем первый выход энкодера на внешнее прерывание.
А второй выход на проверяемый пин. (к примеру 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

Только вот дребезг надо будет кондёрами устранить.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Re: помогите опросить энкодер

Сообщение ooogo »

vovik15 писал(а):
ooogo писал(а):
vovik15 писал(а):сделал опрос по перрыванию на RB6 (я пики програмирую)

А прерывание по какому событию? должно быть на смену уровней
вот эта строчка что делает?

Код: Выделить всё

if ( RBIF ==1 ) { RBIF = 0;

эта строчка сбрасавает флаг по прерыванию RB6

разве в пиках флаг прерывания аппаратно не сбрасывается?
Ваш код тоже будет работать только настройте правильно событие вызывающее прерывание, оно должно быть по спадающему фронту.
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: помогите опросить энкодер

Сообщение stas00n »

ooogo писал(а):разве в пиках флаг прерывания аппаратно не сбрасывается?

Нет, не сбрасывается, т.к. вектор прерывания всего один, поэтому источник, вызвавший прерывание определяется программно, следовательно флаг прерывания тоже сбрасывать надо "вручную".
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите опросить энкодер

Сообщение vovik15 »

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
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: помогите опросить энкодер

Сообщение stas00n »

прикрепите сюда вложением, посмотрим. И схему.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите опросить энкодер

Сообщение vovik15 »

привожу исходный код и схему
индикация вызываеться из майна,и работает отлично,поэтому я не стал указывать ее на схеме, и убрал ее из кода
Вложения
схема и прошивка.rar
(42.25 КБ) 1055 скачиваний
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите опросить энкодер

Сообщение vovik15 »

как в этом проекте http://labkit.ru/html/tembrobloki?id=88 опрашивается ЧЕТЫРЕ энкодера. К сожалению исходников нет ((
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: помогите опросить энкодер

Сообщение ut1wpr »

stas00n писал(а):
ooogo писал(а):разве в пиках флаг прерывания аппаратно не сбрасывается?

Нет, не сбрасывается, т.к. вектор прерывания всего один, поэтому источник, вызвавший прерывание определяется программно, следовательно флаг прерывания тоже сбрасывать надо "вручную".
Не во всех PIC-ах.
С уважением,
Виктор.
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: помогите опросить энкодер

Сообщение stas00n »

vovik15, по идее должно работать, все правильно. У меня работает и в MPLAB SIM, и в протеусе. Проверь в реальном железе.
Вложения
encod.zip
(12.11 КБ) 999 скачиваний
main.c
(1.03 КБ) 1263 скачивания
cahek80
Держит паяльник хвостом
Сообщения: 903
Зарегистрирован: Сб сен 11, 2010 17:32:42

Re: помогите опросить энкодер

Сообщение cahek80 »

у себя сделал так
в главном цикле проверяется, если один из выводов энкодера сработал,ждем 1мс, приращиваем счетчик, при переполнении счетчика устанавиваем флаг нажатости ноги энкодера и наоборот, задержка при отпускании. может конечно много кода зато без дребезга. вот только очень быструю прокрутку конечно не обрабатывает :(
Не нужно дергать спящего тигра за усы! Не высыпается 3-ий день!
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите опросить энкодер

Сообщение vovik15 »

огромное вам спаибо
ище вопрос: я слышал что для пик есть библиотека задержек
скажите пожалуйсто где ее взять,и как с ней работать?
stas00n
Вымогатель припоя
Сообщения: 557
Зарегистрирован: Пн мар 23, 2009 04:03:45

Re: помогите опросить энкодер

Сообщение stas00n »

Какой компилятор у Вас? Смотрите примеры и мануал. обычно бывает что-то вроде delay.h, delay.c. Нужно подключить эти модули. В PICC все нужные модули подключаются через htc.h:

Код: Выделить всё

#include <htc.h>
#define _XTAL_FREQ            4000000
//...
__delay_ms(10);    // Задержка 10 мс
__delay_us(250);   // Задержка 250 мкс
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: помогите опросить энкодер

Сообщение vovik15 »

у меня компилятор hi tech 9.70
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»