roboforum.ru

Технический форум по робототехнике.
Текущее время: 27 ноя 2024, 06:21

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




Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 19:44 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 19:48 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
В курсе есть прерывания но нет энкодеров, но я делал. И возможно в топике Исходники выкладывал.

Вот прицепл мои исходнички - Энкодер квадратурный CVAVR PROTEUS AVRstudio


Вложения:
квадратурный ATtiny13 работает.rar [23.18 КиБ]
Скачиваний: 122
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 20:15 
Не в сети
Аватара пользователя

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

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 20:29 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 20:40 
Не в сети
Аватара пользователя

Зарегистрирован: 06 окт 2004, 18:01
Сообщения: 24218
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов
RoboTok писал(а):
Поставил 10кГц на прерывание таймера и проверяю порт, если есть изменение уровня, значит измеряю время и скорость...

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

_________________
Проект [[Open Robotics]] - Универсальные модули для построения роботов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 20:54 
Не в сети
отсылающий читать курс
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 21:04 
Не в сети
Аватара пользователя

Зарегистрирован: 04 фев 2008, 13:18
Сообщения: 1060
Откуда: Москва
прог. языки: PHP
DeaD ты угадал с первого раза :Rose:

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 21:47 
Не в сети
Аватара пользователя

Зарегистрирован: 03 июн 2007, 22:32
Сообщения: 603
Откуда: Москва
ФИО: Руслан
=DeaD= писал(а):
2RiO: Ничего не понял, а в каком месте проблема? Как прерывания обрабатывать или как в них переменную увеличивать или как ложные срабатывания отсечь? (ложные срабатывания только сдвоенными энкодерами)


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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 22:00 
Не в сети
отсылающий читать курс
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 03 мар 2009, 23:27 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 04 мар 2009, 00:23 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 04 мар 2009, 12:39 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
RealRobot писал(а):
если треба, могу полностью выложить исходники. Только вот оно для 128 меги.

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 04 мар 2009, 19:44 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 04 мар 2009, 19:55 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
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 КиБ | Просмотров: 7234 ]


Последний раз редактировалось avr123.nm.ru 04 мар 2009, 20:30, всего редактировалось 2 раз(а).
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: считывание энкодеров через прерывание - нужен пример на Си
СообщениеДобавлено: 04 мар 2009, 20:04 
Не в сети
Аватара пользователя

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

_________________
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 35 ]  На страницу 1, 2, 3  След.

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


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

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


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO