цикл опроса энкодера

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 123
Зарегистрирован: Вс дек 13, 2009 01:04:42

Сообщение goodspeedmen »

Собственно проблема у меня в том, что и заходе в цикл опроса энкодера (по условию больше, меньше до равенства значений) иногда выходит из цикла да сравнения значений. Как с этим бороться??? :cry:

Код: Выделить всё

  
 if(counter_lcd < calibre_lcd)                       // Если положение меньше калибра.
   { 	
     lock();
     triger = 1;                                              // флаг блокировки кода.
     AL_config();
     temp_calibre = (calibre_lcd - AL_correct_temp);
     timer_COMPA_ON();                                // подпрограмма включения канала А таймера 1, обновления экрана.
     compare = 1;
    direction_motor = 1;
    nterrupt_on();                                          // включение прерывания.
    PORTB |= (1<<4);                                    // включение мотора на разведение cw.
    while(compare == 1)
            {
            }
    PORTB &= ~(1<<4);                                  // выключение мотора на разведение.
    PORTB |= (1<<2);                                     // Включаем динамическое тормажение.  
   dinam_on = 1;                                           // флаг выключения динамическое тормажения.
   timer_COMPB_ON();
Этот код находится в прерывании в прерывании.

Код: Выделить всё

....
  if(compare == 1)   // так написано потому что этот цикл используется и для "ручного" управления и проверять равенство в этом режиме нет необходимости.
    {
      if(counter_lcd >= temp_calibre)     //calibre_lcd
        { 
          compare = 0; 
         }
     }
поскольку энкодер не инкрементный уместно ли использоваться таким кодом в прерывании?

Код: Выделить всё

ISR(INT0_vect)
{
 cli();
 uint8_t int_temp = 0x02;   
 while(1) 
       {
         if((PIND & (1<<2)) == 0)
	   {
             int_temp++;
             if(int_temp == 0x05)
               {
                 if(diretion == 1)
                    енкодер++;
                 else
                    енкодер--;
               }
           {
        else
          {
	    int_temp--;
            if(int_temp == 0)
	     {
	      goto out_int;
	     }
          }	 
      }
out_int:
 sei();
}
Голосовой чат.
Контактная информация:
Реклама
Ответить

Вернуться в «AVR»