![]()  | 
			
					roboforum.ruТехнический форум по робототехнике.  | 
			
				
					 | 
		

/*
   таймер запущен на переполнение 0,05 мс (50 мкс)
*/
   // считаем скоко прошло 1 мс = 20 * ms (20 позиций сервы)
   // стартуем текущую серву
   if(ms_servo == 0) 
      output_high(port_servo[cur_servo]); 
   ms_servo++; //сколько времени она проработала
   if(ms_servo == 20 + pos_servo[cur_servo]) // если 1 мс (20 раз таймер сработал) + позиция выключаем
      output_low(port_servo[cur_servo]); 
   if(ms_servo == INTERVAL) // ждем до ms * 0.05 = 2 мс (2000 мкс) и переключаемся на след серву
   {
      output_low(port_servo[cur_servo]);  //выключаем, вдур раньне невыключилась
      cur_servo ++;
      ms_servo = 0;
      if(cur_servo > 9) // 10 серв раз должно прокрутится NUM_SERV -1
         cur_servo = 0;
   }
   // считаем скоко прошло 1 мс = 20 * ms (20 позиций сервы)
   // стартуем текущую серву
   if(ms_servo1 == 0) 
      output_high(port_servo[cur_servo1]); 
   ms_servo1++; //сколько времени она проработала
   if(ms_servo1 == 20 + pos_servo[cur_servo1]) // если 1 мс (20 раз таймер сработал) + позиция выключаем
      output_low(port_servo[cur_servo1]); 
   if(ms_servo1 == INTERVAL) // ждем до ms * 0.05 = 2 мс (2000 мкс) и переключаемся на след серву
   {
      output_low(port_servo[cur_servo1]);  //выключаем, вдур раньне невыключилась
      cur_servo1 ++;
      ms_servo1 = 0;
      if(cur_servo1 > 19) // 10 серв раз должно прокрутится NUM_SERV -1
      cur_servo1 = 10;
   }
 
 ...#int_timer2
void isr_timer2(void)
{
   // вырубаем по прошествию нужного времени (0 - 1мс + 1мс = от 1 до 2 мс) 
   output_low(port_servo[prev_serv]); 
   disable_interrupts(INT_TIMER2);
   prev_serv = cur_servo;
   cur_servo ++;                           // следующая серва 2 1
   if(cur_servo > NUM_SERV-1)
      cur_servo = 0;
}
// общее время сервы, настроено на 1 мс
#int_timer0
void isr_timer0(void)
{
   set_timer0(START_TIMER0);
   //стартуем новую серву раз в 1 мс  1
   output_high(port_servo[cur_servo]);
   // когда наступила следующая серва надо запустить остановку предыдущей во втором таймере
   // во втором таймере отключаем по позиции
   clear_interrupt(INT_TIMER2);
   setup_timer_2(T2_DIV_BY_4, pos_servo[prev_serv], 5);
   set_timer2(0);
   enable_interrupts(INT_TIMER2);
}T1OVF  
{
  if(++cnt>100)  // точность - 100 положений
  {
    cnt=0;
    перестраиваем таймер на медленный счет (большой делитель) и устанавливаем подходящее TCNT чтобы он сработал через 18мс
  }
  else
  {
  перестраиваем таймер на быстрый счет (цикл вызова 2мс/100 положений = 20 мкс)
  if(cnt=1)  // точность - 100 положений
    {
    cnt=0;
    Srv1=1;  // подаем сигнал на сервы
    Srv2=1;
...
    SrvN=1;
    }
  if(Srv1Pos<cnt) Srv1=0;
  if(Srv2Pos<cnt) Srv2=0;
...
  if(SrvNPos<cnt) SrvN=0;
  }
}

.
 я и так удивился что под wine заработало mplab, да proteus. Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0