Yep!
Ce week-end, j'ai commencé à tester mes servomoteurs avec plus ou moins de réussite.
J'ai donc commencé par un classique, la modul de largeur d'impulsion (pwm) et çà marche pas mal. Mais comme j'aimerais utiliser un attiny2313 comme controlleur, il faut que je puisse utiliser tous les pins disponibles, y compris les non-pwm.
Alors, j'ai cherché sur la toile et j'ai effectivement trouvé des choses, mais en assembleur, et c'est vite devenu pour moi indigeste

J'effectue mes essais avec 2 servos et un atmega328 (duemilanove). J'utilise pour contrôler mes servos le timer 1 en mode CTC afin de simuler les 50hz indispensables.
Le problème est que le second servo ne réagit pas du tout comme il faudrait (ne tourne que dans un sens avec des ratés de temps à autre, alors que le premier servo est ok) et j'ai l'impression qu'entre la commande (séquentielle) et la pulsation, j'ai un léger décalage temporel qui me fait sauter les pulsations suivantes.
Je pense être dans la bonne direction mais là je sèche sur la méthode pour résoudre ce problème. Un peu d'aide ferait du bien

The code :
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define Wait(T) _delay_ms(T)
volatile unsigned int servo[9] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, 6000};
//----------------------------------------------------------------
ISR(TIMER1_COMPA_vect)
{
static byte servo_num;
PORTB = (1 << servo_num);
OCR1A = servo[servo_num];
servo_num++;
if(servo_num > 7) servo_num = 0;
}
ISR(TIMER1_OVF_vect)
{
}
void setup()
{
_init_();
}
void loop()
{
servo[0] = 1000; // servos 0 et 1 gauche
servo[1] = 1000;
Wait(2000); // marche pas
servo[0] = 1500; // servos 0 et 1 centre
servo[1] = 1500;
Wait(2000); // marche pas
servo[0] = 2000; // servos 0 et 1 droite
servo[1] = 2000;
Wait(2000); // marche pas
}
void _init_()
{
//cli();
TCCR1A = 0;
TCCR1B = 0;
DDRB |= B00000011; // PB0 et PB1
__asm__("nop\n\t");
//TCCR1B |= (1 << WGM12) | (1 << CS11);
TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); // CTC mode 14, prescaler de 8
TIMSK1 |= (1<<OCIE1A) | (1 << TOIE1); // Overflow et comparateur interrupt
TCNT1 = 0;
ICR1 = 20000; // 20000 µS = 20 ms = 50 hz
sei();
}
EDIT 1 : 2 précisions, en 1, ce sont des servos 360°, en deux, la fonction
_delay_ms ne semble pas fonctionner.
Merci.
@+
Zoroastre.