Bonjour,
J'ai programmé il y a quelques jours plusieurs projets MikroC pour PIC 18F452, un programme d'interruption pour un servo, et un programme de PWM pour un moteur (ainsi qu'un programme regroupant les deux mais celui là ne posera pas de problème une fois que les deux premiers fonctionneront).
Afin d'utiliser le moins de place possible et d'économiser en masse (le programme un aéroglisseur), mon professeur d'électronique m'a conseillé d'utiliser un PIC 16F648A.
Problème : celui-ci dispose de moins de ports, et de registres différents.
Voici mon premier programme pour le servo :
Je n'arrive plus à modifier la valeur de la variable servo qui permet de varier l'angle du servo.Code:#define SERVO_MAX 33 /*31 = gauche 90°*/ #define SERVO_MIN 9 #define SERVO_INIT 21 #define PAS_SERVO 5 unsigned long cnt=0; //cnt=1 pour éviter changement d'état au début 38 init à prescal = 0 unsigned int servo = SERVO_INIT; // Interrupt Handler void interrupt() { // Timer2 Interrupt- Freq = 1000000.00 Hz - Period = 0.000001 seconds if (PIR1.TMR2IF == 1) // timer 2 interrupt flag { if(cnt == servo || cnt == 0) PORTA.F0 = ~PORTA.F0; // Toggle PORTD cnt++; if(cnt == 200) //15ms cnt = 0; PIR1.TMR2IF = 0; // clears TMR2IF bit 1 TMR2IF: TMR2 to PR2 Match Interrupt Flag bit } } // code starts here... void main() { // setup portb to show the interrupts by blibking LEDs TRISB = 0; PORTB = 0; TRISA = 0b11111110; // ADCON1= PORTA = 0; //Timer2 Registers Prescaler= 1 - TMR2 PostScaler = 1 - PR2 = 2 - Freq = 1000000.00 Hz - Period = 0.000001 seconds T2CON |= 0; // bits 6-3 Post scaler 1:1 thru 1:16 T2CON.TMR2ON = 1; // bit 2 turn timer2 on; T2CON.T2CKPS1 = 1; // bits 1-0 Prescaler Rate Select bits T2CON.T2CKPS0 = 1; //prescaler à 4 T2CON.TOUTPS1 = 1; PR2 = 2; // PR2 (Timer2 Match value) // Interrupt Registers INTCON = 0; // clear the interrpt control register PIR1.TMR2IF = 0; // clear timer1 interupt flag TMR1IF PIE1.TMR2IE = 1; // enable Timer2 interrupts INTCON.T0IF = 0; INTCON.T0IE = 0; INTCON.GIE = 1; // bit7 global interrupt enable INTCON.PEIE = 1; // bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral interrupts while(1) //endless loop { if(PORTA.F3) { servo = SERVO_INIT; delay_ms(100); } if(PORTA.F2 == 1 && servo < SERVO_MAX-PAS_SERVO) { servo+=PAS_SERVO; delay_ms(100); } if(PORTA.F1 == 1 && servo > SERVO_MIN+PAS_SERVO) { servo-=PAS_SERVO; delay_ms(100); } PORTB = servo; //pour vérifier si la variable est modifié } }
Voici le programme de mon moteur arrière :
Là encore l'action des boutons n'a aucun effet, et comme la vitesse de base est à 0, il ne se passe rien du tout.Code:#define TURBINE 55 /*attribution des code IF de chaque actions*/ #define ACCELERER 2 #define RALENTIR 8 #define V_TURBINE 0x00 #define PAS_SERVO 200 #define SERVO_D 4 //tourner à gauche !! #define SERVO_G 6 #define SERVO_INIT 5 /*bouton*/ void init() // Procédure d'initialisation du PIC { PORTA=0; PORTB=0; TRISA=0xFF; //entree TRISB=0; //sortie CCP1CON = 0b00001111; PWM_Init(5000); // fréquence PWM = 5KHz PWM_Start(); } void main() { short tableau_vitesse[] = {0,30,80,120,200,255}; short vitesse = 0; init(); // Appeler Procédure d'initialisation while (1) // Faire indéfiniment { if(PORTA.F0==1) //accélerer { if(vitesse < 5) //vitesse maximal vitesse+= 1; //incrémente la vitesse du moteur PWM_Change_Duty(tableau_vitesse[vitesse]); delay_ms(100); } if(PORTA.F1==1) // ralentir { if(vitesse > 0) vitesse-= 1; //incrémente la vitesse du moteur PWM_Change_Duty(tableau_vitesse[vitesse]); delay_ms(100); } } }
Merci d'avance pour vos réponses,
P.S : Veuillez m'excuser pour le manque de propreté du code mais je ne suis qu'un élève de Terminale S
-----