//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") ;
}