Подскажите пожалуйста (лучеш с примером кода на Си) как в программе реализовать оценку скорости вращения колеса с помощью энкодера при этом не мешая работе основной программы. Видимо сигнал энкодера должен вызвыать некоторое прерывание а его обработчик увеличивать значение счетчика. Не могу понять, как это сделать. Пробовал поиск в.т.ч. на AVR123 но ответа не нашел.
2RiO: Ничего не понял, а в каком месте проблема? Как прерывания обрабатывать или как в них переменную увеличивать или как ложные срабатывания отсечь? (ложные срабатывания только сдвоенными энкодерами)
Я шум отсёк фильтром НЧ с триггером Шмидта. А скорость считаю, по таймеру. Поставил 10кГц на прерывание таймера и проверяю порт, если есть изменение уровня, значит измеряю время и скорость...
=DeaD= писал(а):2RiO: Ничего не понял, а в каком месте проблема? Как прерывания обрабатывать или как в них переменную увеличивать или как ложные срабатывания отсечь? (ложные срабатывания только сдвоенными энкодерами)
Проблема - как повесить прерывания на изменение сигнала на ноге (а не на таймер). Видимо это просто, но я еще не научился а пример не нашёл.
Энкодер пока сделал одинарный.
avr123, спасибо за пример, буду позже сегодня изучать.
RiO писал(а):Проблема - как повесить прерывания на изменение сигнала на ноге (а не на таймер). Видимо это просто, но я еще не научился а пример не нашёл.
Пример CVAVR с кнопками на INT0 и INT1 для симуляции в VMLAB конечно же приложен к стра 3 курса - "прерывания в AVR" - http://avr123.nm.ru/03.htm
// 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 меги.
Сегодня пытался разобраться с прерываниями по изменению сигнала на ногах, но не понял, как привязывать их к конкретной ноге. В моей Меге 168 за это вроде отвечают регистры PCMSK0 - PCMSK2, но в примерах я ничего похожего не нашел. При этом на схеме меги возле ножек подписаны прерывания PCINT1 - PCINT20. Как например привязать прерывание к ноге PB4 или PD6? - в моем проекте это единственные свободные ноги.
RiO писал(а):Сегодня пытался разобраться с прерываниями по изменению сигнала на ногах, но не понял, как привязывать их к конкретной ноге. В моей Меге 168 за это вроде отвечают регистры PCMSK0 - PCMSK2, но в примерах я ничего похожего не нашел. При этом на схеме меги возле ножек подписаны прерывания PCINT1 - PCINT20. Как например привязать прерывание к ноге PB4 или PD6? - в моем проекте это единственные свободные ноги.
Проще всего прерывания настроить мастером CVAVR - применение мастера кода CodeVisionAVR CVAVR C КАРТИНКАМИ http://avr123.nm.ru/z3.htm
Затем обязательно посмотрите в даташите что означают сделаные мастером настройки ! Там же таблица векторов прерываний есть.
Прерывания PCINTx в мастере CVAVR
Вложения
PCINTc_CVAVR.png (12.38 КиБ) Просмотров: 7232
Последний раз редактировалось avr123.nm.ru 04 мар 2009, 20:30, всего редактировалось 2 раз(а).