2016-02-12 54 views
-1

我想通過直接切換輸出來嘗試使用av​​r和timer1來控制大約20個伺服(對於機器人)。 這是我一直能夠到現在。但是當我嘗試添加最後兩個伺服器時,所有的伺服器都會失敗。我認爲這是一個時間問題。但我不知道如何解決這個問題。我在網上搜索,但找不到任何具體的答案。使用avr控制多個伺服

如果任何一個可以指向這裏只講控制多個舵機的良好來源這將是非常有益的

int main(void) 
{ 
    DDRB = 0xFF; 
    DDRA = 0xFF; 

    TCCR1A |= 1<<WGM11; 
    TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10; 
    TIMSK |= 1 << OCIE1A; 

    ICR1 = 19999; // Clear on reaching this point. 
    uint16_t count = MIN_VAL; 
    uint16_t count2 = 2000; 
    uint16_t c_rp = MIN_VAL; 
    uint16_t c_rp2 = 1000; 
    uint16_t c_rp3 = MIN_VAL; 



    sei(); 
    while(1) 
    { 
     // Control PORT B PINS 
     // TCNT1 counts upwards and on reaching count 
     // an then the pin goes low 
     // SERVO 1 
     if(( PORTB & (1<<PIN)) && TCNT1 >= count) 
     { 
      PORTB &= ~(1<<PIN); 
      if (count < MAX_VAL) 
       count += INC_VAL; // CHANGING SERVO POSITION 
      else 
       count = MIN_VAL; 

     } 

     // SERVO 2 
     if(( PORTB & (1<<PIN2)) && TCNT1 >= count2) 
     { 
      PORTB &= ~(1<<PIN2); // CONSTANT SERVO POSITION 

     } 


     // Control PORT A PINS 
     // SERVO 3 
     if(( PORTA & (1<<RP)) && TCNT1 >= c_rp) 
     { 
      PORTA &= ~(1<<RP); 
      if (c_rp < MAX_VAL) 
       c_rp += INC_VAL; 
      else 
       c_rp = MIN_VAL; 

     } 

      // SERVO 4 
     if(( PORTA & (1<<RP2)) && TCNT1 >= c_rp2) 
     { 
      PORTA &= ~(1<<RP2); 

     } 

} 


ISR (TIMER1_COMPA_vect) // ISR called when TCNT1 equals ICR1 
{ 
    PORTB |= (1<< PIN) | (1<< PIN2) ; 
    PORTA |= (1 << RP) | (1 << RP2) | (1<< RP3); 
} 
+1

從你已經發布的代碼,你試圖實現什麼,也沒有什麼不按你期望的方式工作是不明確的。 – Ross

回答