//test de vitesse sur un uno 
//59jag
//info.txt donne le resultat reel sur un uno
//sur la simulation j ai pas mis de resistances mais en reel faut en mettre a chaque sortie
//macro qui fait comme digitalWrite sauf que c est un peu plus de 25x plus rapide
#include "fonction.h"
 #define compteur_cycles TCNT1
 #define mydigitalRead(pin)  (pin>13 ? bitRead(PINC,pin-14):\
                              pin>7 ? bitRead(PINB,pin-8) :\
                              bitRead(PIND,pin))   
 #define mydigitalWrite(pin,level) (pin>13 ? bitWrite(PORTC,pin-14,level):\
                             pin>7 ? bitWrite(PORTB,pin-8,level) :\ 
                             bitWrite(PORTD,pin,level))
  #define Led 13

 uint16_t temps;
 uint16_t temps1;
 byte temps2;
 int val;

void setup(){//********************************SETUP********************
  Serial.begin(9600);
 // TCCR1A = 0;        // Le Timer 1 est configuré en simple compteur.
 // TCCR1B = 1;        //config le timer1 a 16mhz donc 1 cycle correspond a 62.5ns
  cycles_ini();
  
  for(int pin=2 ;pin<20; pin++){   //pin 0 et 1 reserve pour tx rx
      Serial.print("pin: ");
      Serial.println(pin);
      mydigitalWrite(pin,1);
      delay(100); 
      mydigitalWrite(pin,0);
       delay(50); 
  }

}


void loop() {
  Serial.println ("***************temps d executions des pins digitale****************");
  compteur_cycles=0;     //TCNT1=0;
  temps=compteur_cycles;// temps=TCNT1;
  affiche(" temps de mesure: ",temps);
  
  compteur_cycles=0;
  PORTB ^= (1 << PORTB5);                //correspond a digitalWrite(13,1)
  temps1=compteur_cycles;
  affiche(" temps de PORTB ^= (1 << PORTB5): ",temps1-temps);
  
  compteur_cycles=0;
  PORTB &= ~(1 << PORTB5);               //correspond a digitalWrite(13,0)
  temps1=compteur_cycles;
  affiche(" temps de PORTB &= ~(1 << PORTB5): ",temps1-temps);
  
  compteur_cycles=0;
  bitSet(PORTB,5);                       //correspond a digitalWrite(13,1). PORTB PB5 correspond a pin13 (led) 
  temps1=compteur_cycles;
  affiche(" temps de bitSet: ",temps1-temps);

  compteur_cycles=0;
  bitClear(PORTB,5);                     //correspond a digitalWrite(13,0)
  temps1=compteur_cycles;
  affiche(" temps de bitClear: ",temps1-temps);

  compteur_cycles=0;
  bitRead(PINB,5);                      //correspond a digitalRead(13)
  temps1=compteur_cycles;
  affiche(" temps de bitRead: ",temps1-temps);

  compteur_cycles=0;
  bitWrite(PORTB,5,0);                  //correspond a digitalWrite(13,0)
  temps1=compteur_cycles;
  affiche(" temps de bitWrite a 0: ",temps1-temps);

  compteur_cycles=0;
  bitWrite(PORTB,5,1);                  //correspond a digitalWrite(13,1)
  temps1=compteur_cycles;
  affiche(" temps de bitWrite 0 1: ",temps1-temps);

  compteur_cycles=0;
  digitalWrite(13,1);
  temps1=compteur_cycles;
  affiche(" temps de digitalWrite(13,1): ",temps1-temps);

  compteur_cycles=0;
  digitalWrite(13,0);
  temps1=compteur_cycles;
  affiche(" temps de digitalWrite(13,0): ",temps1-temps);
  
  compteur_cycles=0;
  mydigitalWrite(13,0);                   //correspond a digitalWrite(13,0)
  temps1=compteur_cycles;
  affiche(" temps de mydigitalWrite(13,0): ",temps1-temps);  
  
  compteur_cycles=0;
  mydigitalWrite(13,1);                    //correspond a digitalWrite(13,1)
  temps1=compteur_cycles;
  affiche(" temps de mydigitalWrite(13,1): ",temps1-temps);  
  
  compteur_cycles=0;
  digitalRead(13);
  temps1=compteur_cycles;
  affiche(" temps de digitalRead(13): ",temps1-temps);  

  compteur_cycles=0;
  mydigitalRead(13);
  temps1=compteur_cycles;
  affiche(" temps de mydigitalRead(13): ",temps1-temps);  


//***********************************************************************
  Serial.println ("***************temps d executions des pins analogique****************");
  
  compteur_cycles=0;
  temps = TCNT1L;                                // Ci-dessous une première lecture fait passer TCNT1H dans le TAMPON.
  temps = TCNT1;                                 // Lecture des 16 bits dans la variable COMPTEUR.
  Serial.print(" temps de mesure: ");
  Serial.print(temps);
  Serial.print(" cycles soit "); 
  Serial.print((temps)*62.5);
  Serial.println("ns") ;

  val=analogRead(A0);
  bitWrite(ADCSRA, ADPS2,1);                         //configure l ADC a 125Khz normalemnt valeur par defaut
  bitWrite(ADCSRA, ADPS1,1);
  bitWrite(ADCSRA, ADPS0,1);
  compteur_cycles=0;
  val=analogRead(A0);
  //temps1 = TCNT1L;                                // Ci-dessous une première lecture fait passer TCNT1H dans le TAMPON.
  temps1 = TCNT1;
  Serial.print(" temps de analogRead(A0)=");
  Serial.print(val);
  Serial.print(" a 125Khz: ");
  Serial.print(temps1-temps);
  Serial.print(" cycles soit "); 
  Serial.print((temps1-temps)*62.5/1000);
  Serial.println("us") ;

  bitWrite(ADCSRA, ADPS2,1);                         //configure l ADC a 250Khz
  bitWrite(ADCSRA, ADPS1,1);
  bitWrite(ADCSRA, ADPS0,0);
  compteur_cycles=0;
  val=analogRead(A0);
  temps1 = TCNT1L;                                // Ci-dessous une première lecture fait passer TCNT1H dans le TAMPON.
  temps1 = TCNT1;
  Serial.print(" temps de analogRead(A0)=");
  Serial.print(val);
  Serial.print(" a 250Khz: ");
  Serial.print(temps1-temps);
  Serial.print(" cycles soit "); 
  Serial.print((temps1-temps)*62.5/1000);
  Serial.println("us") ;

  bitWrite(ADCSRA, ADPS2,1);                         //configure l ADC a 500Khz
  bitWrite(ADCSRA, ADPS1,0);
  bitWrite(ADCSRA, ADPS0,1);
  compteur_cycles=0;
  val=analogRead(A0);
  temps1 = TCNT1L;                                // Ci-dessous une première lecture fait passer TCNT1H dans le TAMPON.
  temps1 = TCNT1;
  Serial.print(" temps de analogRead(A0)=");
  Serial.print(val);
  Serial.print(" a 500Khz: ");
  Serial.print(temps1-temps);
  Serial.print(" cycles soit "); 
  Serial.print((temps1-temps)*62.5/1000);
  Serial.println("us") ;

  bitWrite(ADCSRA, ADPS2,1);                         //configure l ADC a 1Mhz
  bitWrite(ADCSRA, ADPS1,0);
  bitWrite(ADCSRA, ADPS0,0);
  compteur_cycles=0;
  val=analogRead(A0);
  temps1 = TCNT1L;                                // Ci-dessous une première lecture fait passer TCNT1H dans le TAMPON.
  temps1 = TCNT1;
  Serial.print(" temps de analogRead(A0)=");
  Serial.print(val);
  Serial.print(" a 1Mhz: ");
  Serial.print(temps1-temps);
  Serial.print(" cycles soit "); 
  Serial.print((temps1-temps)*62.5/1000);
  Serial.println("us") ;

  bitWrite(ADCSRA, ADPS2,0);                         //configure l ADC a 1Mhz
  bitWrite(ADCSRA, ADPS1,1);
  bitWrite(ADCSRA, ADPS0,1);
  TCNT1=0;
  val=analogRead(A0);
  temps1 = TCNT1L;                                // Ci-dessous une première lecture fait passer TCNT1H dans le TAMPON.
  temps1 = TCNT1;
  Serial.print(" temps de analogRead(A0)=");
  Serial.print(val);
  Serial.print(" a 2Mhz: ");
  Serial.print(temps1-temps);
  Serial.print(" cycles soit "); 
  Serial.print((temps1-temps)*62.5/1000);
  Serial.println("us") ;
 
  delay(10000);
}
 void affiche(char* message, int valeur){
     char formattedMessage[35];                                               
     snprintf(formattedMessage, sizeof(formattedMessage), "%-34s", message);  // Formate le message pour qu'il fasse exactement 34 caractères, complété par des espace
     Serial.print(formattedMessage);
     Serial.print("\t");
     Serial.print(valeur);
     Serial.print(" cycles \t soit \t ") ;
     Serial.print((valeur)*62.5);
     Serial.println("\t ns") ;
 }