Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Народ , подскажите плз по енкодеру (+)

Отправлено smartleds 17 апреля 2009, г. 16:03


Проблема , что хреново работает , проявляется это в следующем: когда кручу , например, по часовой стрелке , то иногда считывается значения если бы я крутил против часовой стрелке. В общем направление он определяет, но моменты неправильного определения сильно портят картину. Это хорошо заметно если подсоединить светодиод, например при вращении по часовой стрелке яркость увеличиваю, против часовой уменьшаю, и вот когда яркость равна нулю и я продолжаю крутить против часовой , видно как светодиод начинает помаргивать. Также это видно при печати по UART на комп. Как с эти бороться?
Программа у меня простая писал для Atmega16.
Две ноги от енкодера на INT0 и PC3 , средняя на землю
Прерывание по падающему фронту , при возникновении прерывания считываю ногу PC3 , если 1, то вращение по часовой , если 0 - то против. Соответственно увеличиваю или уменьшаю значение яркости светодиода , переменная curlevel
Вот сама программа

Прерывание INT0 устанавливает только флажок говорящий о том что оно произожло
#pragma vector=0x04
__interrupt void INT0handler (void)
{
intoccursint0=1;
}
Конфигурация портов
//===- Configuration interrupt INT0 -------------

clearbit(GICR,INT0);//Disable INT0
clearbit(MCUCR,ISC00);
setbit(MCUCR,ISC01); // falling edge
setbit(GICR,INT0);//Enable INT0
clearbit(DDRD,PD2); //configuration pin INT0 on input
setbit(PORTD,PD2); //setup pull-up resistor


//--------------------------- Config PC3 as input ------------
clearbit(DDRC,PC3);
setbit(PORTC,PC3);
__enable_interrupt();

//----------- PWM config ---------------------
TCCR0 = 2;
setbit(DDRB,PB3);
setbit(TCCR0,WGM01);
setbit(TCCR0,WGM00); //fast PWM
setbit(TCCR0,COM01);
setbit(TCCR0,COM00);

Основная программа , если флажок установлен , проверяет пин PC3 если он больше 0 , увеличиваем яркость если равен 0 , то уменьшаем.

while(1)
{//0

if (intoccursint0==1)
{//1
intoccursint0=0;
if (checkbit(PINC,PC3)>0)
{//2
putchar(53);
if (curlevel>=254) curlevel=255;
else
{
curlevel=curlevel+2;
}

OCR0=curlevel;
}//2
else
{//2
putchar(54);
if (curlevel<2) curlevel=0;
else
{
curlevel=curlevel-2;
}
OCR0=curlevel;
}//2
}//1
}//0 end while
Хотелось бы спросить что я неправильно делаю?


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
сложите три и три:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru