roboforum.ru

Технический форум по робототехнике.

считывание энкодеров через прерывание - нужен пример на Си

считывание энкодеров через прерывание - нужен пример на Си

Ruslan » 03 мар 2009, 19:44

Подскажите пожалуйста (лучеш с примером кода на Си) как в программе реализовать оценку скорости вращения колеса с помощью энкодера при этом не мешая работе основной программы. Видимо сигнал энкодера должен вызвыать некоторое прерывание а его обработчик увеличивать значение счетчика. Не могу понять, как это сделать.
Пробовал поиск в.т.ч. на AVR123 но ответа не нашел.

Re: считывание энкодеров через прерывание - нужен пример на Си

avr123.nm.ru » 03 мар 2009, 19:48

В курсе есть прерывания но нет энкодеров, но я делал. И возможно в топике Исходники выкладывал.

Вот прицепл мои исходнички - Энкодер квадратурный CVAVR PROTEUS AVRstudio
Вложения
квадратурный ATtiny13 работает.rar
(23.18 КиБ) Скачиваний: 122

Re: считывание энкодеров через прерывание - нужен пример на Си

=DeaD= » 03 мар 2009, 20:15

2RiO: Ничего не понял, а в каком месте проблема? Как прерывания обрабатывать или как в них переменную увеличивать или как ложные срабатывания отсечь? (ложные срабатывания только сдвоенными энкодерами)

Re: считывание энкодеров через прерывание - нужен пример на Си

RoboTok » 03 мар 2009, 20:29

Я шум отсёк фильтром НЧ с триггером Шмидта.
А скорость считаю, по таймеру.
Поставил 10кГц на прерывание таймера и проверяю порт, если есть изменение уровня, значит измеряю время и скорость...

Re: считывание энкодеров через прерывание - нужен пример на Си

=DeaD= » 03 мар 2009, 20:40

RoboTok писал(а):Поставил 10кГц на прерывание таймера и проверяю порт, если есть изменение уровня, значит измеряю время и скорость...

Жестокие у тебя технологии :) а прерывание по изменению входа обычное INT чем не устроило? Не на те ноги подвесил энкодеры?

Re: считывание энкодеров через прерывание - нужен пример на Си

avr123.nm.ru » 03 мар 2009, 20:54

=DeaD= писал(а):а прерывание по изменению входа обычное INT чем не устроило?
Дак через ж интересней ведь !

Re: считывание энкодеров через прерывание - нужен пример на Си

RoboTok » 03 мар 2009, 21:04

DeaD ты угадал с первого раза :Rose:

Добавлено спустя 2 минуты 5 секунд:
Просто, если схему разрабатывать идеальную её можно и не собрать никогда...

Поэтому я выбрал путь не идеальных решений :good:

Re: считывание энкодеров через прерывание - нужен пример на Си

Ruslan » 03 мар 2009, 21:47

=DeaD= писал(а):2RiO: Ничего не понял, а в каком месте проблема? Как прерывания обрабатывать или как в них переменную увеличивать или как ложные срабатывания отсечь? (ложные срабатывания только сдвоенными энкодерами)


Проблема - как повесить прерывания на изменение сигнала на ноге (а не на таймер). Видимо это просто, но я еще не научился а пример не нашёл.

Энкодер пока сделал одинарный.

avr123, спасибо за пример, буду позже сегодня изучать.

Re: считывание энкодеров через прерывание - нужен пример на Си

avr123.nm.ru » 03 мар 2009, 22:00

RiO писал(а):Проблема - как повесить прерывания на изменение сигнала на ноге (а не на таймер). Видимо это просто, но я еще не научился а пример не нашёл.

Пример CVAVR с кнопками на INT0 и INT1 для симуляции в VMLAB конечно же приложен к стра 3 курса - "прерывания в AVR" - http://avr123.nm.ru/03.htm

Re: считывание энкодеров через прерывание - нужен пример на Си

RealRobot » 03 мар 2009, 23:27

Приминительно к AVR_128. Написано на CodeVisionAVR
Код: Выделить всёРазвернуть
// External Interrupt(s) initialization
// INT6: On
// INT7: On
EICRA=0x00;      //включение разрешение прерываний
EICRB=0xF0;
EIMSK=0xC0;
EIFR=0xC0;
//Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
ETIMSK=0x00;

//---------------------------------------------
interrupt [EXT_INT6] void ext_int6_isr(void)//прерывание по высокому фронту от энкодера левый
{//char s;int n;                            //если есть шумы по линии будет шарашить в лет.
#asm("cli")                                //сигнал должен быть чистый
  if (PING&0x04) {
    sch_l --;
  }else{
    sch_l ++;
  };
#asm("sei")
}
// External Interrupt 1 service routine
//---------------------------------------------
interrupt [EXT_INT7] void ext_int7_isr(void)  //прерывание по высокому фронту от энкодера, правый
{//char s;//,n;
#asm("cli")
//   s = PORTG & 0b00000100;
  if (PING&0x08) {// это у меня проверка в какую сторону крутится колесо
    sch_r ++;
  }else{
    sch_r --;
  };
#asm("sei")
}


если треба, могу полностью выложить исходники. Только вот оно для 128 меги.

Re: считывание энкодеров через прерывание - нужен пример на Си

Ruslan » 04 мар 2009, 00:23

avr123, RеalRobot, Спасибо, это как раз то, что было нужно.

Re: считывание энкодеров через прерывание - нужен пример на Си

avr123.nm.ru » 04 мар 2009, 12:39

RealRobot писал(а):если треба, могу полностью выложить исходники. Только вот оно для 128 меги.

Конечно ТРЕБА ! Этож нужно будет многим.

Только НЕТ смысла запрещать прерывания в прерывании ! и НЕ СТОИТ разрещать их ДО ЗАВЕРШЕНИЯ обработки прерывания !

Это код из продаваемого вами изделия ???

Как работают Прерывания в AVR - http://avr123.nm.ru/03.htm

Re: считывание энкодеров через прерывание - нужен пример на Си

Ruslan » 04 мар 2009, 19:44

Сегодня пытался разобраться с прерываниями по изменению сигнала на ногах, но не понял, как привязывать их к конкретной ноге. В моей Меге 168 за это вроде отвечают регистры PCMSK0 - PCMSK2, но в примерах я ничего похожего не нашел. При этом на схеме меги возле ножек подписаны прерывания PCINT1 - PCINT20. Как например привязать прерывание к ноге PB4 или PD6? - в моем проекте это единственные свободные ноги.

Re: считывание энкодеров через прерывание - нужен пример на Си

avr123.nm.ru » 04 мар 2009, 19:55

RiO писал(а):Сегодня пытался разобраться с прерываниями по изменению сигнала на ногах, но не понял, как привязывать их к конкретной ноге. В моей Меге 168 за это вроде отвечают регистры PCMSK0 - PCMSK2, но в примерах я ничего похожего не нашел. При этом на схеме меги возле ножек подписаны прерывания PCINT1 - PCINT20. Как например привязать прерывание к ноге PB4 или PD6? - в моем проекте это единственные свободные ноги.


Проще всего прерывания настроить мастером CVAVR - применение мастера кода CodeVisionAVR CVAVR C КАРТИНКАМИ http://avr123.nm.ru/z3.htm

Затем обязательно посмотрите в даташите что означают сделаные мастером настройки ! Там же таблица векторов прерываний есть.

Прерывания PCINTx в мастере CVAVR
Вложения
PCINTc_CVAVR.png
PCINTc_CVAVR.png (12.38 КиБ) Просмотров: 7232
Последний раз редактировалось avr123.nm.ru 04 мар 2009, 20:30, всего редактировалось 2 раз(а).

Re: считывание энкодеров через прерывание - нужен пример на Си

Duhas » 04 мар 2009, 20:04

ети ножки собраны в группы.. на каждую группу свое прерывание...
в нем обработаете проверку ножек нужных...


Rambler\'s Top100 Mail.ru counter