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

Программирование микроконтроллеров AVR. Программы, библиотеки, документация, средства разработки, отладки и прочее...

Модератор: KopylovSergey

Ответить
rasel
Сообщения: 1
Зарегистрирован: 30 янв 2018, 15:19

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

Сообщение rasel » 30 янв 2018, 15:38

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

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

  
 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)
               {
                 енкодер++;
               }
           {
       else
         {
	   int_temp--;
           if(int_temp == 0)
	    {
	     goto out_int;
	    }
          }	 
      }
out_int:
 sei();
}

Ответить