roboforum.ru

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

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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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

Сообщение Ruslan » 03 мар 2009, 19:44

Подскажите пожалуйста (лучеш с примером кода на Си) как в программе реализовать оценку скорости вращения колеса с помощью энкодера при этом не мешая работе основной программы. Видимо сигнал энкодера должен вызвыать некоторое прерывание а его обработчик увеличивать значение счетчика. Не могу понять, как это сделать.
Пробовал поиск в.т.ч. на AVR123 но ответа не нашел.
Аватара пользователя
Ruslan
 
Сообщения: 603
Зарегистрирован: 03 июн 2007, 22:32
Откуда: Москва
ФИО: Руслан

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

Сообщение avr123.nm.ru » 03 мар 2009, 19:48

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

Вот прицепл мои исходнички - Энкодер квадратурный CVAVR PROTEUS AVRstudio
Вложения
квадратурный ATtiny13 работает.rar
(23.18 КиБ) Скачиваний: 122
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение =DeaD= » 03 мар 2009, 20:15

2RiO: Ничего не понял, а в каком месте проблема? Как прерывания обрабатывать или как в них переменную увеличивать или как ложные срабатывания отсечь? (ложные срабатывания только сдвоенными энкодерами)
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение RoboTok » 03 мар 2009, 20:29

Я шум отсёк фильтром НЧ с триггером Шмидта.
А скорость считаю, по таймеру.
Поставил 10кГц на прерывание таймера и проверяю порт, если есть изменение уровня, значит измеряю время и скорость...
Аватара пользователя
RoboTok
 
Сообщения: 1060
Зарегистрирован: 04 фев 2008, 13:18
Откуда: Москва
прог. языки: PHP

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

Сообщение =DeaD= » 03 мар 2009, 20:40

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

Жестокие у тебя технологии :) а прерывание по изменению входа обычное INT чем не устроило? Не на те ноги подвесил энкодеры?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

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

Сообщение avr123.nm.ru » 03 мар 2009, 20:54

=DeaD= писал(а):а прерывание по изменению входа обычное INT чем не устроило?
Дак через ж интересней ведь !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение RoboTok » 03 мар 2009, 21:04

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

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

Поэтому я выбрал путь не идеальных решений :good:
Аватара пользователя
RoboTok
 
Сообщения: 1060
Зарегистрирован: 04 фев 2008, 13:18
Откуда: Москва
прог. языки: PHP

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

Сообщение Ruslan » 03 мар 2009, 21:47

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


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

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

avr123, спасибо за пример, буду позже сегодня изучать.
Аватара пользователя
Ruslan
 
Сообщения: 603
Зарегистрирован: 03 июн 2007, 22:32
Откуда: Москва
ФИО: Руслан

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

Сообщение avr123.nm.ru » 03 мар 2009, 22:00

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

Пример CVAVR с кнопками на INT0 и INT1 для симуляции в VMLAB конечно же приложен к стра 3 курса - "прерывания в AVR" - http://avr123.nm.ru/03.htm
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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 меги.
http://igrybogov.com - ну о.о.очень интересно
сознание определяет бытие, улыбнись своему отражению
RealRobot
 
Сообщения: 340
Зарегистрирован: 18 окт 2007, 23:46
Откуда: Москва
прог. языки: С++ , 1С :-)
ФИО: Михаил

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

Сообщение Ruslan » 04 мар 2009, 00:23

avr123, RеalRobot, Спасибо, это как раз то, что было нужно.
Аватара пользователя
Ruslan
 
Сообщения: 603
Зарегистрирован: 03 июн 2007, 22:32
Откуда: Москва
ФИО: Руслан

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

Сообщение avr123.nm.ru » 04 мар 2009, 12:39

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

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

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

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

Как работают Прерывания в AVR - http://avr123.nm.ru/03.htm
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение Ruslan » 04 мар 2009, 19:44

Сегодня пытался разобраться с прерываниями по изменению сигнала на ногах, но не понял, как привязывать их к конкретной ноге. В моей Меге 168 за это вроде отвечают регистры PCMSK0 - PCMSK2, но в примерах я ничего похожего не нашел. При этом на схеме меги возле ножек подписаны прерывания PCINT1 - PCINT20. Как например привязать прерывание к ноге PB4 или PD6? - в моем проекте это единственные свободные ноги.
Аватара пользователя
Ruslan
 
Сообщения: 603
Зарегистрирован: 03 июн 2007, 22:32
Откуда: Москва
ФИО: Руслан

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 КиБ) Просмотров: 7230
Последний раз редактировалось avr123.nm.ru 04 мар 2009, 20:30, всего редактировалось 2 раз(а).
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение Duhas » 04 мар 2009, 20:04

ети ножки собраны в группы.. на каждую группу свое прерывание...
в нем обработаете проверку ножек нужных...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 38