Problème programmation PIC16F877a - MikroC
alzec
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
-
alzec Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
alzec Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Problème programmation PIC16F877a - MikroC
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation vb - Télécharger - Langages
- Programmation binaire - Guide
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
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...
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...
alzec
Messages postés
2
Date d'inscription
Statut
Membre
Dernière intervention
Ok merci, mais je viens de remarquer une erreur justement, donc je corrige et fais quelques tests avant de reposter tout ça. ;)