Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Kumpi on viksumpi tapa?

pielinen [20.01.2009 20:13:00]

#

Elikkä pitäisi ohjata Avr piirillä useampaa servoa, niin sai aikaiseksi tämmöisen koodin. Kumpi tapa on viksumpi koodatessa? Vai onko järkevämpiä tekniikkoja toteuttaa servojen ohjaus.

ISR(TIM0_COMPA_vect)   // Pyörii 100Khz taajuudella
{
   if(Tick >= 2000)   // Vertaa onko servo jakso tullut täyteen
      {
         Tick = 0;
      }

   Tick = Tick + 1;
   if(Tick <= servo1)   // Tarkistaa onko servo pulssi jo ylitetty
   {
      PORTB |= (1<<PB0);   // Servo singnaali ylös
   }
   else
   {
      PORTB &= ~(1<<PB0);   // Servo singnaali alas
   }
   if(Tick <= servo1)   // Tarkistaa onko servo pulssi jo ylitetty
   {
      PORTB |= (1<<PB1);   // Servo singnaali ylös
   }
   else
   {
      PORTB &= ~(1<<PB1);   // Servo singnaali alas
   }
   if(Tick <= servo1)   // Tarkistaa onko servo pulssi jo ylitetty
   {
      PORTB |= (1<<PB2);   // Servo singnaali ylös
   }
   else
   {
      PORTB &= ~(1<<PB2);   // Servo singnaali alas
   }
   if(Tick <= servo4)   // Tarkistaa onko servo pulssi jo ylitetty
   {
      PORTB |= (1<<PB3);   // Servo singnaali ylös
   }
   else
   {
      PORTB &= ~(1<<PB3);   // Servo singnaali alas
   }
}

Vai

ISR(TIM0_COMPA_vect)   // Pyörii 100Khz taajuudella
{
   if(Tick >= 2000)   // Vertaa onko servo jakso tullut täyteen
      {
         Tick = 0;
      }

   Tick = Tick + 1;
   servo_p(1,servo1,Tick); //Päivittää servon n.1
   servo_p(2,servo2,Tick); //Päivittää servon n.2
   servo_p(3,servo3,Tick); //Päivittää servon n.3
   servo_p(4,servo4,Tick); //Päivittää servon n.4
}


void servo_p(uint8_t servo, uint16_t arvo, uint8_t Tick) //viive funktio
{
if(Tick <= arvo)   // Tarkistaa onko servo pulssi jo ylitetty
   {
      PORTB |= (1<<servo);   // Servo singnaali ylös
   }
   else
   {
      PORTB &= ~(1<<servo);   // Servo singnaali alas
   }
}

User137 [21.01.2009 01:06:12]

#

Tehokkuuden kannalta noissa tuskin on käytännössä eroa vaikka ylempi siinä hitusen voittaa. Koodin luettavuuden kannalta alempi ehkä parempi ja laajennettavampi.

(ja jätit typoja ylempään, vertailet servoja 1,1,1,4)

Metabolix [21.01.2009 11:10:28]

#

Hyvä kääntäjä osaa optimoida nuo yhtä hyvin ainakin, jos vielä jälkimmäisessä lisää jonkin vinkin (static, inline) servo_p-funktion määrittelyyn. Tietenkin silloin pitää käyttää optimointiasetuksia käännöksessä. Aina kannattaa tehdä asioista mahdollisimman selkeitä eli sijoittaa selkeät kokonaisuudet omiin funktioihinsa. Toisaalta moni vierastaa noin lyhyitä funktioita.

pielinen [22.01.2009 18:11:00]

#

Kiitos kommenteista.

Taidan tehdä tuolla alemmalla tekniikalla, kun sillä saa koodista luettavampaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta