Например TDA7294

Форум РадиоКот • Просмотр темы - Энкодер + atmega8 + CodeVisionAVR
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт апр 25, 2024 04:23:30

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 12:02:35 
Родился

Зарегистрирован: Вс окт 14, 2012 22:31:20
Сообщений: 3
Рейтинг сообщения: 0
Прошу помощи так как пока сам не могу разобраться.

Есть конечная задача сделать USB мультимедиа клавиатуру для Кар ПС. Состоять она будет из двух энкодеров и 4 кнопок.
Один энкодер должен регулировать громкость, второй - переключать треки. Ну а кнопки пока еще не определился.

Сам пытаюсь разобраться в CodeVisionAVR, но вот готовых примеров не нашел по обработке сигналов с энкодера, а написанные на чистом С не хотят работать у меня.

Помогите пожалуйста.
Энкодер подключаю к PB0 PB1 c подтяжкой через резисторы к +5в.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 12:27:15 
Друг Кота
Аватар пользователя

Карма: 82
Рейтинг сообщений: 1027
Зарегистрирован: Сб апр 02, 2011 12:40:46
Сообщений: 4779
Откуда: Минск
Рейтинг сообщения: 0
Вот как пример:

Спойлер
Код:
//----------

//Модуль поддержки энкодера.
//Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2).
//Функция Enc_Scan() вызывается в основном цикле.
//Результат обработки энкодера передается в основную программу
//через функцию OnEncoder().

//---------- Константы: ----------

#define ENC_F2   (1 << PC1) //фаза энкодера F2
#define ENC_F1   (1 << PC2) //фаза энкодера F1

#define Pin_ENC_F2     (PINC & ENC_F2)
#define Pin_ENC_F1     (PINC & ENC_F1)

enum { State0, StateA, StateB, StateAB }; //состояния энкодера

enum { ENC_UP, ENC_DN }; //код шага вверх и шага вниз.

//---------- Переменные: ----------

static char EncPrev;      //предыдущее состояние энкодера
static char EncPrevPrev;  //пред-предыдущее состояние энкодера

//---------- Инициализация энкодера: ----------

void Encoder_Init(void)
{
  EncPrev = State0;       //инициализация предыдущего состояния
  EncPrevPrev = State0;   //инициализация пред-предыдущего состояния
}

//---------- Обработка энкодера: ----------

void Encoder_Exe(void)
{
  char EncCur = 0;
  if(!Pin_ENC_F1) EncCur  = StateA; //опрос фазы 1 энкодера
  if(!Pin_ENC_F2) EncCur |= StateB; //опрос фазы 2 энкодера
  if(EncCur != EncPrev)             //если состояние изменилось,
  {
    if(EncPrev == StateAB &&        //если предыдущее состояние StateAB
       EncCur != EncPrevPrev )      //и текущее и пред-предыдущее не равны,
    {
      if(EncCur == StateB)          //если текущее состояние StateB,
        OnEncoder(ENC_UP);   //шаг вверх
      else                          //иначе
        OnEncoder(ENC_DN);   //шаг вниз
    }
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }
}

//----------


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 17:42:22 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 6
Зарегистрирован: Вт май 08, 2012 23:15:45
Сообщений: 81
Откуда: Санкт - Петербург
Рейтинг сообщения: 0
Код:
static uint_fast8_t old_val;

void spool_encinterrupt(void)
{
   const uint_fast8_t new_val = hardware_get_encoder_bits();   /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */

   // dimensions are:
   // old_bits new_bits
   static const int_fast8_t graydecoder [4][4] =
   {
      {
         +0,      /* 00 -> 00 stopped            */
         -1,      /* 00 -> 01 rotate left         */
         +1,      /* 00 -> 10 rotate right      */
         +0,      /* 00 -> 11 invalid combination */      
      },
      {
         +1,      /* 01 -> 00 rotate right      */
         +0,      /* 01 -> 01 stopped            */
         +0,      /* 01 -> 10 invalid combination */
         -1,      /* 01 -> 11 rotate left         */
      },
      {
         -1,      /* 10 -> 00 rotate left         */
         +0,      /* 10 -> 01 invalid combination */
         +0,      /* 10 -> 10 stopped            */
         +1,      /* 10 -> 11 rotate right      */
      },
      {
         +0,      /* 11 -> 00 invalid combination */
         +1,      /* 11 -> 01 rotate right      */
         -1,      /* 11 -> 10 rotate left         */
         +0,      /* 11 -> 11 stopped            */
      },
   };


#if ENCODER_REVERSE
   position1 -= graydecoder [old_val][new_val];
#else
   position1 += graydecoder [old_val][new_val];
#endif
   old_val = new_val;
}


/* вызывается при запрещенных прерываниях */
void encoder_initialize(void)
{
   //rotate = backup_rotate = 0;
   //enchistindex = 0;
   //tichist [enchistindex] = 0;
   //enchist [enchistindex] = 0;
   //hardware_encoder_initialize(); // moved to main


   old_val = hardware_get_encoder_bits();   /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */
}



spool_encinterrupt вызывается по изменению уровня на выводах PD2 & PD3 (int0 и int1). Разрешить соответствующие прерывания по любому изменению уровня.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 20:19:40 
Родился

Зарегистрирован: Вс окт 14, 2012 22:31:20
Сообщений: 3
Рейтинг сообщения: 0
Хорошо когда понимаешь, что написал.

Вообщем нашел модуль с таким кодом.
Цитата:
#ifndef _ENCODER_
#define _ENCODER_ 1
/*********************************************************************
Модуль программной поддержки контактного квадратурного энкодера
типа РЕС16 и аналогичных (без использования прерываний)

Copyright 2008 © ARV Research.

Внимание! Вы можете использовать данный модуль по своему усмотрению
в любых проектах. При любой публикации ваших проектов, использующих
этот модуль, следует указать ссылку на сайт http://arv.radioliga.com

Требуется компилятор WinAVR
**********************************************************************/

#define ENC_MAX_SPEED 100 /* максимальная "скорость" вращения энкодера */
#define ENC_BIG_STEP 98 /* "большой" шаг при быстром вращении */
#define ENC_FAST_ROTATE 90 /* константа "быстрого" вращения */

#define ENC_A_PIN 3 /* номер линии порта для сигнала А энкодера */
#define ENC_B_PIN 6 /* номер линии порта для сигнала B энкодера */
#define ENC_A_PORT PIND /* порт, к которому подключен сигнал А энкодера */
#define ENC_B_PORT PINB /* порт, к которому подключен сигнал B энкодера */

#define ENC_A_UP (ENC_A_PORT & (1<<ENC_A_PIN))
#define ENC_B_UP (ENC_B_PORT & (1<<ENC_B_PIN))
#define ENC_A_DN (!ENC_A_UP)
#define ENC_B_DN (!ENC_B_UP)

#define rotate_fast(x) (x > ENC_FAST_ROTATE)
#define DDR(x) (*(&x + 1))
#define PORT(x) (*(&x + 2))
/*
Использование модуля элементарно: в начале программы следует вызвать
функцию enc_init(), которая настроит нужные порты ввода-вывода.
Затем в основном цикле в нужном месте можно обратиться либо к
функции enc_rotate(), которая вернет значение, соответствующее направлению
вращения энкодера, либо функцию enc_delta(), которая кроме направления
возвратит и условную величину скорости вращения.
enc_rotate() позволяет использовать энкодер, как 2 кнопки "+1" и "-1"
enc_delta() уже может заменить 4 кнопки "+1", "+100", "-1" и "-100".
Функция способна отличать "рывки туда-сюда" от простого вращения в
одном направлении.

Нажатие встроенной кнопки энкодера НЕ ОБРАБАТЫВАЕТСЯ
*/


// инициализирует порты, к которым подключен энкодер
void enc_init(void);

/* возвращает направление и скорость вращения энкодера
параметр speed - указатель на переменную, в которую возвращается
условная скорость вращения (число от 0 до 100)

возвращает:
-1 - вращение влево (против часовой стрелки)
0 - нет вращения
1 - вращение вправо (по часовой стрелке)

ВНИМАНИЕ! функция выполняется достаточно длительное время:
максимально (при остановленном энкодере) ENC_MAX_SPEED миллисекунд,
при вращении возвращает управление раньше
*/
signed char enc_rotate(unsigned char * speed);

/* возвращает приращение энкодера:
1 или -1 при медленном вращении,
0 - при остановленном
ENC_BIG_STEP или -ENC_BIG_STEP при быстром вращении

ВНИМАНИЕ!!! Функция выполняется долго!!!
при быстром вращении возвращает управление только ПОСЛЕ ОСТАНОВКИ энкодера!
остановкой считается, если в течение 2*ENC_MAX_SPEED миллисекунд не было импульсов
с энкодера.
*/
signed char enc_delta(void);

#endif


Пытаюсь вызвать его в основном коде, а при компилировании ругается на функцию enc_init().

Помогите как этот модуль заставить работать в моей программе.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 21:39:00 
Нашел транзистор. Понюхал.

Карма: 1
Рейтинг сообщений: 7
Зарегистрирован: Пн янв 14, 2013 15:06:57
Сообщений: 181
Откуда: Д.Вс.
Рейтинг сообщения: -2
Объяви в основном цикле enc_init();
А вообще код от ARV, как всегда гавно..


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 21:45:09 
Родился

Зарегистрирован: Вс окт 14, 2012 22:31:20
Сообщений: 3
Рейтинг сообщения: 0
Так и делаю, но ошибка вылазит. В скобочках надо что нибудь указывать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 22:01:46 
Мудрый кот
Аватар пользователя

Карма: 7
Рейтинг сообщений: 93
Зарегистрирован: Ср сен 07, 2011 21:40:30
Сообщений: 1797
Рейтинг сообщения: 0
Вот странно-вылизанный код ЛИ даже не смотрится, а ищется какой-то говянный код...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Пн апр 21, 2014 22:19:57 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 2
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
takei писал(а):
А вообще код от ARV, как всегда гавно..

потрудитесь объясниться :twisted:

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Вт апр 22, 2014 18:11:05 
Собутыльник Кота
Аватар пользователя

Карма: 11
Рейтинг сообщений: 47
Зарегистрирован: Пн апр 06, 2009 19:33:29
Сообщений: 2512
Откуда: Молдова, Кишинев
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
takei писал(а):
Объяви в основном цикле enc_init();
А вообще код от ARV, как всегда гавно..

особенно, если учесть что приведен какой-то вообще шмат кода, очень разумно об этом судить.
ТС, там где-то в другом файле есть эти функции, найди их, и будет работать :))))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Вт дек 20, 2016 18:24:01 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36
Сообщений: 256
Откуда: Волгоград
Рейтинг сообщения: 0
Не программировал больше 2 лет, все напрочь забыл (((. Помогите, пжл, перевести код этого птичьего языка на читаемый. Мне надо его вставить в CodeVisionAVR. Энкодер висит на PINC.3 и PINC.2 c подтяжкой.
Код понравился этот: http://www.leniwiec.org/en/2014/04/28/r ... 2-168-328/ начитается с Gray’s code method

ОРИГИНАЛ
uint8_t read_gray_code_from_encoder(void )
{
uint8_t val=0;

if(!bit_is_clear(PIND, PD2))
val |= (1<<1);

if(!bit_is_clear(PIND, PD3))
val |= (1<<0);

return val;
}

ПЫТАЮСЬ ПЕРЕПИСАТЬ НА CodeVisionAVR
unsigned char read_gray_code_from_encoder (void)
{
unsigned char val=0;

if(!bit_is_clear(PINC.2)) val |= (1<<1); - РАСШИФРУЙТЕ ЭТО ПЖЛ, НА МОИ ПОРТЫ!

if(!bit_is_clear(PINC.3)) val |= (1<<0);

return val;
}

Дальше код из статьи вроде понятен.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Вт дек 20, 2016 18:39:56 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Код:
if(!bit_is_clear(PINC, 2))
    val |= (1<<1);

if(!bit_is_clear(PINC, 3))
    val |= (1<<0);

bit_is_clear скорее всего, задефайнен как-нибудь так :
Код:
#define bit_is_clear(var, bit)       (((var)&(1<<bit))==0)


Либо, для CV-синтаксиса :
Код:
if(PINC.2)
    val |= (1<<1);

if(PINC.3)
    val |= (1<<0);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Вт дек 20, 2016 18:46:23 
Грызет канифоль
Аватар пользователя

Карма: 2
Рейтинг сообщений: 6
Зарегистрирован: Вт мар 11, 2008 06:22:36
Сообщений: 256
Откуда: Волгоград
Рейтинг сообщения: 0
Да, спасибо. Запустил энкодер, крутит отлично. Но только вот на быстрое вращение не очень реагирует. Буду дальше разбираться.
Еще вопрос: val |= (1<<1) - можно это переписать в человеческий синтаксис? А то через пару месяцев опять буду смотреть как на китайскую грамоту )))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Энкодер + atmega8 + CodeVisionAVR
СообщениеДобавлено: Вт дек 20, 2016 21:40:47 
Сверлит текстолит когтями
Аватар пользователя

Карма: 25
Рейтинг сообщений: 168
Зарегистрирован: Ср янв 29, 2014 08:41:31
Сообщений: 1231
Откуда: Баку
Рейтинг сообщения: 1
VNN84 писал(а):
Еще вопрос: val |= (1<<1) - можно это переписать в человеческий синтаксис? А то через пару месяцев опять буду смотреть как на китайскую грамоту )))

Выставить бит 1 в val. Иначе говоря, val |= 0b00000010 или val = val | 2.

_________________
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y