Bonjour à tous,

J'ai un problème au niveau de mon code. Aucun soucis avec les registres du PIC mais bien avec la progra en C.

Mon projet est de commander un moteur via un pont en H. Ce moteur commande un gouvernail à partir d'une barre (comme sur un bateau) à l'aide d'une pwm. Je récupère, via des potentiomètres, les positions de ceux-ci. J'affiche la position du gouvernail sur le portb (8 leds). Suivant l'écart entre barre et gouvernail, la pwm fonctionne plus ou moins fort.

Pour l'instant, j'arrive à faire fonctionner la pwm lors de l'appui sur le BP droite mais pas avec le BP gauche. J'ai l'impression que mes boucles ou mes conditions ne sont pas bien réalisées. Est-ce que quelqu'un pourrait jeter un oeil sur mon code pour voir où ce situe mon erreur?

J'utilise MikroC et une platine EasyPic6.

Merci d'avance.

Code:
/*Header******************************************************/
#define Gauche PORTD.F2
#define Droite PORTD.F3
unsigned int pot1, pot2;
char duc1, duc2, barre, diff1, diff2, new_duty1, new_duty2;
bit Mem1, Mem2;
/*INITIALISATION**********************************************/
void Init(){
     //OSCCON = 0b01110111;        //Fréquence interne de 8MHz
     //ANSEL = 0b00000011;         //Pins AN0 et AN1 comme entrée analogique
     //ANSELH = 0;                 //Rest of pins is configured as digital
     //C1ON_bit = 0;               // Disable comparators
     //C2ON_bit = 0;
     TRISA = 0xFF;               //Pins du PORTA en entrée
     TRISB = 0x00;               //Pins du PORTB en sortie
     TRISC = 0x00;
     TRISD = 0x00111111;
     PORTA = 0;
     PORTB = 0;
     PORTC = 0;
     PORTD = 0;
     duc1 = duc2 = 0;
     pot1 = pot2 = 0;
     Mem1 = Mem2 = 0;
     Diff1 = Diff2 = 0;
     //ADCON1 = 0b00110000;           //Justifié à gauche- (16F887)
     ADCON1 = 0b00001101;             //16F877 avec RA0/RA1=pot,RA2/RA3=Ref,RA4/RA5=BP
}
void InitPWM(){
     PR2 = 0b01111100;
     /* Mettre 124 dans PR2 pour avoir une F pwm de 1kHz :
        TC = (PR2+1)*Tcy*Prescaler = (124+1)*(1/(8M/4))*16
           = 125*0.5µs*16 = 1ms = 1000Hz     */
     T2CON   = 0b00000111;             // Prescaler à 16, pas de postscaler
     CCP1CON = 0b00111100;             // Sortie unique RC2, PWM mode
     CCP2CON = 0b00111100;             // PWM mode
     //PWM1CON = 0b11111111;             //Dead-band delay de 60µs
}
/*FONCTION****************************************************/
void affBarre(){             //Fonctionne avec la référence entre 1V et 4V
     barre = pot2/4;
     if(0<=barre && barre<=16)    PORTB = 0b00000001;
     if(17<=barre && barre<=33)   PORTB = 0b00000011;
     if(34<=barre && barre<=50)   PORTB = 0b00000010;
     if(51<=barre && barre<=67)   PORTB = 0b00000110;
     if(68<=barre && barre<=84)   PORTB = 0b00000100;
     if(85<=barre && barre<=101)  PORTB = 0b00001100;
     if(102<=barre && barre<=118) PORTB = 0b00001000;
     if(119<=barre && barre<=136) PORTB = 0b00011000;
     if(137<=barre && barre<=153) PORTB = 0b00010000;
     if(154<=barre && barre<=170) PORTB = 0b00110000;
     if(171<=barre && barre<=187) PORTB = 0b00100000;
     if(188<=barre && barre<=204) PORTB = 0b01100000;
     if(205<=barre && barre<=221) PORTB = 0b01000000;
     if(222<=barre && barre<=238) PORTB = 0b11000000;
     if(239<=barre && barre<=255) PORTB = 0b10000000;
}
/*PROGRAMME PRINCIPAL*****************************************/
void main() {
     Init();
     InitPWM();
     PWM1_Stop();
     PWM2_Stop();

     do {
          pot2 = ADC_Read(1);   //Lecture valeur AN1 et envoi vers variable
          duc2 = pot2/4;               //De 0 à 255
          //CCPR1L = duc2;             // Modification duty cycle PWM2
          pot1 = ADC_Read(0);   //Lecture valeur AN0 et envoi vers variable
          duc1 = pot1/4;               //De 0 à 255
          //CCPR2L = duc1;              //Modification duty cycle PWM1

          if(Gauche && !Droite){             //Appui sur bp gauche
               PWM1_Start();
               PWM2_Stop();
               while(duc1 < duc2){
                  pot1 = ADC_Read(0);   //Lecture valeur AN0 et envoi vers variable
                  duc1 = pot1/4;               //De 0 à 255
                  pot2 = ADC_Read(1);   //Lecture valeur AN1 et envoi vers variable
                  duc2 = pot2/4;               //De 0 à 255
                  diff1 = (duc2 - duc1);    //On fait la différence
                  if(diff1<=255 && diff1>=70) new_duty1= 255;
                  if(diff1<=69 && diff1>=55) new_duty1 = 190;
                  if(diff1<=54 && diff1>=40) new_duty1 = 80;
                  if(diff1<=39 && diff1>=25) new_duty1 = 30;
                  if(diff1<=24 && diff1>0) new_duty1 = 0;
                  CCPR1L = new_duty1;          //MAJ PWM
                  PORTD.F6 = 0;
                  PORTD.F7 = 1;
                  affBarre();
               }
               //CCPR2L = new_duty1;
               //PORTD.F7 = 1;
               //affBarre();
          }
          if(Droite && !Gauche){        //Appui sur BP Droite
               PWM1_Stop();
               PWM2_Start();
               while(duc2 < duc1){
                  pot1 = ADC_Read(0);   // Lecture valeur AN0 et envoi vers variable
                  duc1 = pot1/4;
                  pot2 = ADC_Read(1);   // Lecture valeur AN1 et envoi vers variable
                  duc2 = pot2/4;               //De 0 à 255
                  diff2 = (duc1 - duc2);    //On fait la différence
                  if(diff2<=255 && diff2>=70) new_duty2 = 255;
                  if(diff2<=69 && diff2>=55)  new_duty2 = 190;
                  if(diff2<=54 && diff2>=40)  new_duty2 = 80;
                  if(diff2<=39 && diff2>=25)  new_duty2 = 30;
                  if(diff2<=24 && diff2>0)    new_duty2 = 0;
                  CCPR2L = new_duty2;       //MAJ PWM
                  PORTD.F6 = 1;
                  PORTD.F7 = 0;
                  affBarre();
               }
               //CCPR1L = new_duty2;
               //PORTD.F6 = 1;
               //affBarre();
          }
          if((Gauche && Droite)||(!Gauche && !Droite)){    //Si aucun BP ou les 2 en même temps
               PWM1_Stop();
               PWM2_Stop();
               PORTD.F6 = 0;
               PORTD.F7 = 0;
               new_duty1 = 0;
               new_duty2 = 0;
               affBarre();
          }
     } 
     while(1);
}