Программная обработка Энкодера на AVR

Обсуждаем контроллеры компании Atmel.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Программная обработка Энкодера на AVR

Сообщение Artos »

Добрый день уважаемые форумчане!

Стала предо мной задача обработки двух энкодеров, обработки фотоприемника для ДУ, постоянное обновление данных регистров 74HC595 5шт. включенных последовательно, и переодический (по таймеру) выброс данных в еепром типа 24Схх

SPI и I2C программный.

Планирую применить ATmega16 . Но у нее всего 2 прерывания INT0 and INT1. Не хватает еще одного прерывания для второго энкодера...
Как можно решить эту проблему? Чтоб система работала надежно без сбоев?

Посетила идея настроить таймер на прерывание по переполнению и в нем опрашивать входы энкодеров. Но не будет ли искажений сигналов при передаче данных по SPI и I2С ?

С ув. Артем
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Программная обработка Энкодера на AVR

Сообщение ploop »

Посетила идея настроить таймер на прерывание по переполнению и в нем опрашивать входы энкодеров.

Да, именно так.
о не будет ли искажений сигналов при передаче данных по SPI и I2С ?

Нет, они же работают аппаратно.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

Artos писал(а):
SPI и I2C программный.
.........

Но не будет ли искажений сигналов при передаче данных по SPI и I2С ?

С ув. Артем


Нет, интерфейсы программные...
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Программная обработка Энкодера на AVR

Сообщение ploop »

А, вон оно что.
Тогда сложнее. Я бы советовал сделать опрос энкодеров в основном цикле, когда не работают прерывания. Частота там большая не нужна, говорят 500Гц достаточно. Да и если пропустить опрос - не страшно, всё равно не заметишь.
Сам, правда, не пробовал, энкодеры только приехали, на днях поковыряю, как с ними лучше обращаться.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение pyzhman »

Artos писал(а):Нет, интерфейсы программные...

Причина неиспользования аппаратных?
Docendo discimus
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

Для легкой переносимости на другую платформу + не понятно как инициализировать аппаратные SPI и I2C и использовать.

Работаю в CVAVR

Думаю что в момент попадания в прерывание по таймеру можно прижимать SCL к земле. А при выходе освобождать.


А еще лучше "синхронизировать" работу дэвайса .

ловим энкодеры по таймеру .

если поймали > обрабатываем данные запрещаем прерывания и вываливаем на индикацию HC595

если нет > возвращаемся на начало.

По таймеру если было зафиксировано срабатывание энкодеров > сохраняем в еепром 24Схх
Вчера пробовал скорость работы программного I2C с памятью 24С08. В принципе скорость меня устраивает.

Еще: Что если применить 93Схх ? тогда не надо I2C городить?
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

А как обрабатывать дребезг контактов при использовании таймера?
Просто запрещать прерывания на "N" время если было зафиксировано срабатывание энкодера что и послужит антидребезгом?
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Программная обработка Энкодера на AVR

Сообщение BOB51 »

а поставь аппаратный антидребезг на "рассыпухе" :)
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

На конденсаторе чтоль? :)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15546
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Программная обработка Энкодера на AVR

Сообщение BOB51 »

на триггерах
r-s, d и прочее 8)
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

Зачем увеличивать габариты ПП и сложность схемы если есть МК ?
При сдаче в производство главная цель стоит "Максимально минимальные" габариты ПП . Поэтому отпадает такая идея :)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Программная обработка Энкодера на AVR

Сообщение ploop »

Да дребезг программно нормально отсекается. Если сами не придумаете, вот алгоритм Леонида Ивановича, раскомментирован до нельзя...
Спойлер

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

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

//Модуль поддержки энкодера

//Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2).
//Для подавления дребезга используется анализ двух последовательных
//состояний. Это позволяет обойтись без временных задержек.
//Функция Encoder_Init() должна вызываться один раз в начале программы.
//Функция Encoder_Exe() должна вызываться в основном цикле.
//При повороте энкодера на шаг вправо или влево вызываются функции
//To_Do_Step_Up() и To_Do_Step_Dn() соответственно.

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

#include "Main.h"
#include "Encoder.h"

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

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

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

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

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

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

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

void Encoder_Init(void)
{
  DDRC  &= ~(ENC_F1 | ENC_F2); //настройка портов на ввод
  PORTC |= ENC_F1 | ENC_F2;    //включение подтягивающих резисторов
  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,
        To_Do_Step_Up();            //шаг вверх
      else                          //иначе
        To_Do_Step_Dn();            //шаг вниз
    }
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }
}

//----------
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

Интересный код! Спасибо Вам! Надо попробовать его.

Но как то сложно все реализовано... Куча переменных, зачем?
Я год назад проводил тесты с энкодером.
И написал кусок кода (сейчас попробую по памяти написать)

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


if (enc==0 && flags_enc==0)
{
   if (enc1==1 && flags_enc1==0)
   {
             comand_left(); // команда влево

        flags_enc = flags_enc1 = 1;
    }

}

if (enc1==0 && flags_enc_==0)
{
   if (enc==1 && flags_enc1_==0)
   {
             comand_right (); // команда вправо

        flags_enc_ = flags_enc1_ = 1;
    }

}

if ((enc1==0 && enc==0) || (enc1 && enc))
{
   flags_enc_ = flags_enc1_ =  flags_enc = flags_enc1 = 0;  // собственно сбрасываем флаги
}

delay_func(); // отсечка дребезга


Код реально работал в основном цикле программы. в качестве проверки выводил в порт меги8 "бегущий лог.1" подключив светодиоды к порту я видел как "бежит" светящийся светодиодик :)

Ну еще enc и enc1 не забыть продэфайнить в начале.

И еще можно будет убрать три переменных а использовать всего лишь 4 бита из одного байта. Тогда код вообще будет оптимальным.
Так мне кажется лучше смотрится :)
Последний раз редактировалось Artos Вт сен 04, 2012 14:17:26, всего редактировалось 1 раз.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25149
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Программная обработка Энкодера на AVR

Сообщение КРАМ »

Уже приводил эту ссылку по энкодеру(с защитой от дребезга):
http://www.microchip.su/showpost.php?p= ... stcount=32
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Программная обработка Энкодера на AVR

Сообщение ploop »

О, я не видел! Интересно сделано.
Спасибо, утащил в закладки.
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

Если это в мой адрес, то:

Не за что :)
Помню день сидел и думал как максимально просто написать процедуру обработки энкодера :)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Программная обработка Энкодера на AVR

Сообщение ploop »

Я КРАМу, если что :wink:
Ваш тоже утащил, но не разбирал. Скоро все проверю :)
Аватара пользователя
s_black
Мучитель микросхем
Сообщения: 411
Зарегистрирован: Вс авг 10, 2008 19:35:49
Откуда: Евпатория
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение s_black »

Здесь ещё гляньте
Artos
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт мар 04, 2011 13:06:42
Откуда: Украина, Ахтырка
Контактная информация:

Re: Программная обработка Энкодера на AVR

Сообщение Artos »

А никто не пробовал проводить испытания.

На какой частоте может работать порт в AVR контроллера?
буду брать 4мгц тактовую.
Нужно быстро рулить сдвиговым регистром но не постоянно, в момент изменения данных.
(статическая индикация три разряда) + вывод двоичного кода в 2х8бит в еще два регистра.
И того получается 5шт. сдвиговых регистров включенных в цепочку.

На какой частоте реально можно затактировать программный SPI?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Программная обработка Энкодера на AVR

Сообщение ploop »

А какая разница?
У меня 595е цепочкой 14 штук, тактовая - 20МГц, никаких задержек, выплёвываю данные когда надо и всё. В любом случае логика на порядок быстрее вашего МК отработает.
То есть обычный цикл, никаких таймеров и прочего. Это ведь синхронный интерфейс получается.
Ответить

Вернуться в «AVR»