volatile uint16_t dutyCycle = 50;  // Pourcentage de niveau haut (50% par défaut)

void setupTimer1();
void setDutyCycle(uint16_t duty);


int main(){
  DDRB |= (1<<PB1); //Pin 9
  setupTimer1();

  while(1){
    setDutyCycle(dutyCycle);
  }
}

void setupTimer1() {
  // Initialiser le Timer1
  TCCR1A = 0;
  TCCR1B = 0;

  // Configuration du Timer1 pour le mode PWM rapide, 16 bits
  // WGM13 = 1, WGM12 = 1 WGM11 = 1
  TCCR1A |= (1 << WGM11);  
  TCCR1B |= (1 << WGM12) | (1 << WGM13);

  // Prescaler à 8
  TCCR1B |= (1 << CS11); // CS10 = 0, CS11 = 1, CS12 = 0

  // Configurer la sortie PWM sur la broche 9 (OC1A)
  TCCR1A |= (1 << COM1A1);

  // Pour une fréquence de 50 Hz, la valeur maximale du compteur est à 19999 
  ICR1 = 19999;
  
  // Initialiser le rapport cyclique
  setDutyCycle(dutyCycle);
}

void setDutyCycle(uint16_t duty) {
  // Vérification de la valeur du rapport cyclique entre 0 et 100
  if (duty > 100) {
    duty = 100;
  } 

  // Calcul du comparateur OCR1A en fonction du rapport cyclique
  OCR1A = (duty * (ICR1 + 1)) / 100;
}