Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

renoshnik
2017-06-10 19:23:17

1 - уже достаточно написал тут про энкодер, читайте там все элементарно....

2 - что мешает сделать вывод в монитор для отладки программы ???

goodspeedmen
2017-06-10 12:35:54
boolean compare, triger, inc_cw, nc_cww;
byte division,division_CW,division_CWW, backlash_CW, backlash_CWW, backlash;
int counter_lcd , calibre_lcd;

// настройка вннешнего прерывания INT0 и INT1.    
//INT0 PD2. Mode: Falling Edge. INT1 PD2. Mode: Rising Edge.
EICRA = (1<<ISC11) | (1<<ISC10) | (1<<ISC01) | (0<<ISC00);
EIMSK = (1<<INT1) | (1<<INT0);
EIFR = (1<<INTF1) | (1<<INTF0);
PCICR = (0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0); 
//======================================================================


if((digitalRead(10) == 0)&&(triger == 0)) //compare.
  {
   temp++;
   if(temp == 0xff)
     {
      if(counter_lcd < calibre_lcd) //motor_cww.
        {
         compare = 0; 
         PORTD |= (1<<5); //on motor cw.
         while(compare == 0)
              {

              }
         PORTD &= ~(1<<5); //off motor.
         PORTB |= (1<<4);  //on braking.
         braking = 0x3300; //13056 time braking.
         triger = 1;       //set triger.
         goto compare_end;
        }
      if(counter_lcd > calibre_lcd) //motor_cww.
        {
         compare = 0;  
         PORTD |= (1<<4);//on motor cww.  
         while(compare == 0)
              {

              } 
         PORTD &= ~(1<<4); //off motor.
         PORTB |= (1<<4);  //on braking.
         braking = 0x3300; //13056 time braking.
         triger = 1;       //set triger.
         
        }   
     }
  }
compare_end:



ISR(INT0_vect)//INT0 PD2. Mode: Falling Edge. обработка прерываний с деление и люфтом INT0 and INT1 - ON
{
cli();
if((inc_cw == 1)&&(digitalRead(3) == 0))// энкодер++.
{
 if(backlash_CW == backlash)//выбор люфта вперед.
  {
   if(division_CW == division) //деление входных импульсов.
     {
      counter_lcd++;
      if(compare == 0)
        {
         if(counter_lcd == calibre_lcd)
           {
            PORTD &= ~(1<<5);
            compare = 1;    
           }
        }
      division_CW = 0;
      goto out_int_A;
     }
   division_CW++;
   goto out_int_A;
  }
   backlash_CW++;
   backlash_CWW = 0;
   division_CWW = 0;
   goto out_int_A;
} 

if((inc_cww == 1)&&(digitalRead(3) == 1))//энкодер--.
  {
   if(backlash_CWW == backlash)//выбор люфта назад.
     {
      if(division_CWW == division)//деление входных импульсов.
        {
         counter_lcd--;
         if(compare == 0)
            {
             if(counter_lcd == calibre_lcd)
               {
                PORTD &= ~(1<<4); 
                compare = 1;
               }
            }
         division_CWW = 0;
         goto out_int_A;
        }
      division_CWW++;
      goto out_int_A;
     } 
  backlash_CWW++;
  backlash_CW = 0; 
  division_CW = 0;
}  
out_int_A:
inc_cw = 0;
inc_cww = 0;
sei();
}

//==================================================================

//ISR(INT1_vect)//INT1 PD2. Mode: Rising Edge.
{
cli();
  if(digitalRead(2) == 0){inc_cw = 1; inc_cww = 0; goto out_int_B;}//энкодер++.
  if(digitalRead(2) == 1){inc_cww = 1; inc_cw = 0; goto out_int_B;}//энкодер--.
out_int_B:
sei();
} 

//====================================================================

Вот мой код обработке энкодера, смысл в том что есть переменная calibre_lcd к значению которой крутится двигатель. В первом прерывании задаются направление энкодера в нулевом отсчёт. В коде есть выборка люфта и деление входных импульсов от энкодера.
Проблема такова, не срабатывает вот этот код, двигатель крутится постоянно. Я убирал люфт и деление, проблема остаётся значит дело не в них?

if(compare == 0)
{         
  if(counter_lcd == calibre_lcd)           
     { PORTD &= ~(1<<5);  // или PORTD &= ~(1<<4);            
        compare = 1;
      }        
}

Когда я вынес код из прерывания все заработало нормально hmm

 while(compare == 0)
              {
                if(counter_lcd == calibre_lcd)           
                  {PORTD &= ~(1<<5);  // или PORTD &= ~(1<<4);            
                    compare = 1;
                  }        
              } 

Підвал форуму