опрос энкодера
- goodspeedmen
- Встал на лапы
- Сообщения: 123
- Зарегистрирован: Вс дек 13, 2009 01:04:42
- Контактная информация:
опрос энкодера
Какие используют алгоритмы с работой энкодера?
Я хочу использовать прерывание в канале A по высокому увовню INT0 input и также второй энкодер INT1 input по высокому уровню, проверка на совпадение в канала В, 1 1 = inc / 1 0 = dec. И заход в цикл ожидания изменения в канале B ""ограниченный количеством циклов цикла" - на практике слишком маленькое время, даже с отсчетом 2 байт" и выход из него по изменению на 0 канала А Но вот проблема, если первый энкодер останавливается в 1 прерывание в 2-го канала A не срабатывает находясь в цикле опроса канала B в первом энкодере... Хотя по идее должно
Я хочу использовать прерывание в канале A по высокому увовню INT0 input и также второй энкодер INT1 input по высокому уровню, проверка на совпадение в канала В, 1 1 = inc / 1 0 = dec. И заход в цикл ожидания изменения в канале B ""ограниченный количеством циклов цикла" - на практике слишком маленькое время, даже с отсчетом 2 байт" и выход из него по изменению на 0 канала А Но вот проблема, если первый энкодер останавливается в 1 прерывание в 2-го канала A не срабатывает находясь в цикле опроса канала B в первом энкодере... Хотя по идее должно
Голосовой чат.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: опрос энкодера
Проблема, по всей видимости, в программе. А экстрасенсы все уехали на тНт 

- goodspeedmen
- Встал на лапы
- Сообщения: 123
- Зарегистрирован: Вс дек 13, 2009 01:04:42
- Контактная информация:
Re: опрос энкодера
Я спрашивал о алгоритмах опроса энкодера и для примера привел тот который я придумал...
Голосовой чат.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: опрос энкодера
https://www.yandex.ru/yandsearch?clid=9 ... 59445507.1Я спрашивал о алгоритмах опроса энкодера
У меня у одного поисковики работают ?

- goodspeedmen
- Встал на лапы
- Сообщения: 123
- Зарегистрирован: Вс дек 13, 2009 01:04:42
- Контактная информация:
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: опрос энкодера
Вот мой код опроса энкодера:
Действие происходит при полном щелчке энкодера. То есть 4 изменения состояния.
Действие происходит при полном щелчке энкодера. То есть 4 изменения состояния.
Код: Выделить всё
//Encoder
unsigned char Encoder_State = 0;
signed char Encoder_Summ = 0;
unsigned char Encoder_NewState = 0;
Encoder();
void Encoder(void)
{
Encoder_NewState = PIND & 0x3; // Энкодер подключать к первым двум битам порта. То есть к младшим. То есть 0b000000XX.
if(Encoder_State != Encoder_NewState)
{
switch(Encoder_State)
{
case 2:
{
if(Encoder_NewState == 3) Encoder_Summ++;
if(Encoder_NewState == 0) Encoder_Summ--;
break;
}
case 0:
{
if(Encoder_NewState == 2) Encoder_Summ++;
if(Encoder_NewState == 1) Encoder_Summ--;
break;
}
case 1:
{
if(Encoder_NewState == 0) Encoder_Summ++;
if(Encoder_NewState == 3) Encoder_Summ--;
break;
}
case 3:
{
if(Encoder_NewState == 1) Encoder_Summ++;
if(Encoder_NewState == 2) Encoder_Summ--;
break;
}
}
if (Encoder_Summ == 4) // Увеличение значения числа
{
// Действие 1
Encoder_Summ = 0;
}
if (Encoder_Summ == (-4)) // Уменьшение значения числа
{
//Действие 2
Encoder_Summ = 0;
}
Encoder_State=Encoder_NewState;
// Здесь можно написать действие, которое выполнится в любом случае.
}
}
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- goodspeedmen
- Встал на лапы
- Сообщения: 123
- Зарегистрирован: Вс дек 13, 2009 01:04:42
- Контактная информация:
Re: опрос энкодера
Такой алгоритм подойдет для опроса трех энкодеров? Два из которых будут работать относительно на не больших скоростях а вот третий на большой и разрешение его 1000 импульсов.
Голосовой чат.
Re: опрос энкодера
Мikа писал(а):Вот мой код опроса энкодера:
Что если заменить длинный switch простым массивом?
Код: Выделить всё
unsigned char EncTransIncs[4][4] = {
0, +1, -1, 0,
-1, 0, 0, +1,
+1, 0, 0, -1,
0, -1, +1, 0
};
...
Encoder_Summ += EncTransIncs[Encoder_NewState][Encoder_State];
...
}- Из овощей я больше всего люблю пельмени... © Соседский Мальчик
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: опрос энкодера
goodspeedmen, этот код написан для энкодера у которого 4 состояния и который крутится рукой. Для работы на больших частотах и разрешениях надо проводить простые расчеты, которые покажут, хватит ли частоты работы МК на обработку такой кучи данных. И про дребезг не забудь) Ну в смысле не забудь с ним разделаться 
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: опрос энкодера
INT0 и INT1 оставьте для других более важных целей
Опрос энкодера пусть крутится по таймеру (в прерывании таймера), например по переполнению TIM0_OVF
Я так делаю, например:
Опрос энкодера пусть крутится по таймеру (в прерывании таймера), например по переполнению TIM0_OVF
Я так делаю, например:
Код: Выделить всё
......
.....
....
.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20
....
....
....
.dseg ;DSEG – это сегмент данных. В нем выделяется оперативная память.
ENCODERVAR: .byte 1 ;
....
......
...
; далее запускаем таймер с частотой 400 - 500 Гц и даём команду в прерывании таймера
RCALL ENCODERKEY
;===============
ENCODERKEY:
IN TEMP4,PINB ;ЧТИТАЕМ ПОРТ B 5,4 (выводы МК куда подключен энкодер)
LSR TEMP4 ;-> 4, 3
LSR TEMP4 ;-> 3, 2
LSR TEMP4 ;-> 2, 1
LSR TEMP4 ;-> 1, 0
ANDI TEMP4,0B00000011 ;ВЫДЕЛЯЕМ 1 И 0 БИТ (сместить биты в 1 и 0 биты!)
LDS TEMP,ENCODERVAR
ANDI TEMP,0B00000011
CP TEMP,TEMP4
BREQ NEXT_T2 ;ЕСЛИ ИЗМЕНЕНИЙ НЕТ, ТО ВЫХОД
LDS TEMP,ENCODERVAR ;b7 b6 b5 b4 b3 b2 b1 b0 => TEMP
LSL TEMP ;b6 b5 b4 b3 b2 b1 b0 0 => TEMP LEFT
LSL TEMP ;b5 b4 b3 b2 b1 b0 0 0 => TEMP LEFT
OR TEMP,TEMP4 ;b5 b4 b3 b2 b1 b0 E1 E0 => TEMP
STS ENCODERVAR,TEMP ;
LDS TEMP,ENCODERVAR
ANDI TEMP,0B11111111
CPI TEMP,0B11010010 ;КОНСТАНТА (не менять)
BRNE NEXT_T1
RCALL ВЛЕВО ;LEFT <----- свою процедуру обработки события
RJMP NEXT_T2
NEXT_T1:
CPI TEMP,0B11100001 ;КОНСТАНТА (не менять)
BRNE NEXT_T2
RCALL ВПРАВО ;RIGHT <----- свою процедуру обработки события
;RJMP NEXT_T2
NEXT_T2:
RET
;----------