char value = 0x01;                            //valore per variare il pwm
unsigned int Corrente, Tensione;              //valori convertito
unsigned long PotenzaT1, PotenzaT0;           //Valori Potenza
bit check;

void main() {

  TRISC.F2 = 0;                 //uscita pwm portc 2

  PR2 = 0x3F;                   //valore per garantire una frequenza di 31KHZ del pwm con quarzo da 8MHz
  T2CON = 0b00000100;           //setting tmr2: postascaler 1:1, tmr2 on, prescaler 1:1
  CCP1CON = 0b00001100;         //utilizza pwm e setta il valore di comparazione con i due lsb = 11
  CCPR1L = value;               //valore DC
  ADC_Init();                   //inizializza l'ADC
  check = 1;                    //Inizializzo le variabili a 0
  PotenzaT1 = 0;
  PotenzaT0 = 0;
  delay_ms(500);                //Delay assestamento

  while(1){
  
    Tensione = ADC_Get_Sample(0);                 //Leggi il valore di tensione
    Corrente = ADC_Get_Sample(1);                 //Leggi il valore di corrente
    PotenzaT1 = Tensione * Corrente;              //Ottieni valore potenza

    if (check){                                   //Se è stato effettuauo il primo controllo
      if (PotenzaT1 > PotenzaT0)                  //Se la potenza attuale è maggiore della precedente
        if(value < 0x3D) value ++;                //Incrementa valore

      else{                                       //Se invece la potenza è minore
        check = 0;                                //cambia ciclo controllo
        if(value > 0x03) value --;                //riduci il duty cycle
      }
    }
    else{                                         //ciclo di controllo inverso
      if (PotenzaT1 > PotenzaT0){                 //Se la potenza è maggiore
        if(value > 0x03) value --;                //Riduci il duty cycle
      else{                                       //Se la potenza è minore
        check = 1;                                //cambia ciclo di controllo
        if(value < 0x3D) value ++;                //incrementa valore DC
      }
      }
    }

    PotenzaT0 = PotenzaT1;                       //Salva valore di potenza
    CCPR1L = value;                              //Aggiorna DC
    delay_ms(100);                               //Delay di assestamento
 }
}