Bonjour à tous !

Je viens depuis un moment sur ce forum, car étant passionné d'électronique je me pose souvent des questions sur divers montages, et qui dis question dis forcement des réponses et c'est justement là qu'intervient Futura-Sciences

Je n'avais encore jamais posté de messages auparavant mais cette fois je ne trouve pas de réponses qui me convienne sur le forum donc j'ouvre un sujet en espérant que vous puissiez me venir en aide.

Donc voilà j'ai décidé de me lancer dans un domaine de l'électronique que je ne connais pas du tout : la robotique.
J'ai donc chercher sur internet une base pour construire un robot et je suis finalement arrivé sur le site du projet IRBOT. Ce projet date un peu apparemment donc j'ai du un peu mettre au gout du jour certains des composants... enfin ma question n'est pas là.

Pour contrôler les 2 roues du robot j'utilise 2 servomoteurs contrôlé par l'intermédiaire d'un PIC 16F877A. J'ai réalisé sur plaque d'essai le câblage d'un servomoteur au PIC mais le fonctionnement du servomoteur est assez aléatoire... Un coup le programme fonctionne très bien, puis le coup suivant le programme fonctionne à moitié.

Par exemple mon programme doit faire avancer le servomoteur dans un sens A puis STOP puis dans un sens B. Le premier coup que je vais essayer ça va fonctionner parfaitement puis le second coup il ne va tourner que dans le sens A...

Je programme :
- IDE : MPLAB IDE
- Matériel : PICkit2
- Langage : C
- Compilateur : CCS
- Programmation en mode Debug

Voici mon programme :

Code:
#include "C:\Users\TuxFFy\Documents\Robot\Robot.h"

//Déclaration de variables 
int16 COMPTEUR1=0;
int COMPTEUR2=0, SENS=0;
int1 SIGNAL=0;

//Timer0 configuré afin de générer une interruption lors de son overflow
#int_TIMER0 
TIMER0_isr() 
{
	set_timer0(4);
	++COMPTEUR1;
	if (COMPTEUR1 == 360)//Le COMPTEUR1 permet d'attendre 18ms entre chaque impulsion envoyé au servomoteur (interruption toutes les 50us, 360*50us=18ms)
	{
		COMPTEUR1=0;
		COMPTEUR2=0;
		SIGNAL=1;
		output_high(PIN_D1);//Met au niveau logique 1 la broche connecté au servomoteur
	}
	else 
	{
		if (SIGNAL==1) 
		{
			++COMPTEUR2;
			if (COMPTEUR2 == SENS)//Le COMPTEUR2 permet d'envoyer une impulsion d'une certaine durée au servomoteur (la durée dépend de la valeur de SENS)
			{
				SIGNAL=0;
				output_low(PIN_D1);//Met au niveau logique 0 la broche connecté au servomoteur
			}
		}
	}
}

void main()
{
	//Différentes configurations du PIC
	setup_adc_ports(NO_ANALOGS);
	setup_adc(ADC_OFF);
	setup_psp(PSP_DISABLED);
	setup_spi(FALSE);
	setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
	setup_timer_1(T1_DISABLED);
	setup_timer_2(T2_DISABLED,0,1);
	setup_comparator(NC_NC_NC_NC);
	setup_vref(FALSE);
	enable_interrupts(INT_TIMER0);
	enable_interrupts(GLOBAL);
  
	set_timer0(4); //Fixe la valeur initiale de TIMER0 à 4
	
	SENS=40; //Indique une marche avant
	delay_ms(3000);//Durée de la marche avant

	SENS=30;//Indique que le moteur doit s'arrêter
	delay_ms(2000);//Durée de l'arrêt du moteur

	SENS=20;//Indique une marche arrière
	delay_ms(3000);//Durée de la marche arrière

	SENS=30;//Indique que le moteur doit s'arrêter
	delay_ms(2000);//Durée de l'arrêt du moteur	

}
Je pense qu'il est possible qu'il y ai un problème au niveau de synchronisation entre le programme d'interruption et la valeur de la variable SENS dans le programme principale... Je cherche depuis un moment mais je n'arrive pas à savoir où ça coince.

Et bien sur pas d'oscilloscope donc impossible de visualiser le signal transmis au servomoteur.

J'utilise des servomoteurs à rotation continue du type HITEC HSR-1425CR.

Je met en caché les indications que donne la personne qui à fait le programme au départ (avant que je le modifie légèrement, mais le principe de monde programme reste le même) : Suivre ce lien

Mon message est un peu long et je sais que ce n'est pas facile de plonger dans le programme d'un autre mais là je ne comprends pas pourquoi ça fonctionne aléatoirement, je me tourne donc vers vous en espérant trouver de l'aide. Mercii =)