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 :
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é
  }
}
Je n'arrive plus à modifier la valeur de la variable servo qui permet de varier l'angle du servo.

Voici le programme de mon moteur arrière :
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);
		}
	}
}
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.

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