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 } }
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)
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.
Kiitos kommenteista.
Taidan tehdä tuolla alemmalla tekniikalla, kun sillä saa koodista luettavampaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.