Problème programmation PIC16F877a - MikroC

Fermé
alzec Messages postés 2 Date d'inscription vendredi 23 janvier 2015 Statut Membre Dernière intervention 23 janvier 2015 - 23 janv. 2015 à 09:48
alzec Messages postés 2 Date d'inscription vendredi 23 janvier 2015 Statut Membre Dernière intervention 23 janvier 2015 - 23 janv. 2015 à 10:04
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, je n'arrive pas à faire fonctionner la pwm lors d'un appui sur l'un ou l'autre BP (gauche ou droite). 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.


/*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;
CCPR2L = 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;
CCPR1L = 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);
}
A voir également:

1 réponse

Bonjour alzec,
Je te conseille d'exposer ton soucis sur le forum Arduino.
Les cadors locaux vont te le régler en deux coups de cuillère à pot, et tu y apprendra plein de bonnes choses.
C'est un forum international, il faut que tu sélectionne le forum français.
Bonne prog...
0
alzec Messages postés 2 Date d'inscription vendredi 23 janvier 2015 Statut Membre Dernière intervention 23 janvier 2015
23 janv. 2015 à 10:04
Ok merci, mais je viens de remarquer une erreur justement, donc je corrige et fais quelques tests avant de reposter tout ça. ;)
0