En continuant à chercher à approfondir mes connaissances sur le fonctionnement d'un microcontroleur et de l'IDE Arduino j'ai obtenu des résultats très surprenants.
Principe : on fait un grand nombre de fois un cycle constitué d'une écriture "état haut" suivie d'une écriture "état bas", le tout sans délai intermédiaire.
Ce cycle est répété 100 000 fois et les mesures sont en ms.
Points remarquables :
- Avec l'IDE Arduino l'écriture est 10 fois plus lente qu'avec l'utilisation directe des registres.
- Avec l'IDE Arduino TOUTES les sorties PWM présentent des résultats "perturbés" alors qu'on ne constate aucune perturbation avec l'écriture directe dans les registres.
Je m'attendais à un temps légèrement plus long avec l'IDE arduino mais quand même pas 10 fois. Par contre je ne m'attendais absolument pas à la "perturbation" sur les sorties PWM.
Ci dessous le tableau de résultats et le code utilisé.
Rappel les résultats sont en ms pour un total de 100 000 cycles de double écriture.
Numéro de pin Mesures Type de pin
Arduino Atmega Arduino AtMega
0 PD0 ND ND RX
1 PD1 ND ND RX
2 PD2 1025 107 Digitale
3 PD3 1314 107 PWM
4 PD4 1025 107 Digitale
5 PD5 1290 107 PWM
6 PD6 1277 107 PWM
7 PD7 1025 107 Digitale
8 PB0 1025 107 Digitale
9 PB1 1251 107 PWM
10 PB2 1352 107 PWM
11 PB3 1290 107 PWM
12 PB4 1025 107 Digitale
13 PB5 1025 107 Digitale
A0 PC0 1025 107 Et analogique
A1 PC1 1025 107 Et analogique
A2 PC2 1025 107 Et analogique
A3 PC3 1025 107 Et analogique
A4 PC4 1025 107 Et analogique
A5 PC5 1025 107 Et analogique
Le code :
(Pour l'utilisation des registres -> origine : Open Silicium n:2 page 69)
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <util/delay.h>
#include <avr/io.h>
#define Pin_DDR DDRD
#define Pin_PORT PORTD
// affectation de la pin en mesure avec les registres
#define Pin_reg PD7
// affectation de la pin en mesure avec la bibliothèque de l'IDE arduino
const int Pin_ardui = 7 ;
void setup()
{
Serial.begin(9600);
Serial.println("Temps d'écriture sur pin");
//Bibli arduino
pinMode(Pin_ardui, OUTPUT);
}
void loop()
{
unsigned long i;
unsigned long imax;
unsigned long temps ;
unsigned long t1;
unsigned long t2;
imax=100000;
// Utilisation Bibliothèque arduino---------------------------------------------------
t1=millis();
for(i=0; i<imax; i++)
{
digitalWrite(Pin_ardui, HIGH);
digitalWrite(Pin_ardui, LOW);
}
t2=millis();
temps= t2-t1;
Serial.print("Delta T bibli ardiuno = ");
Serial.print(temps);
Serial.print("\n");
// Utilisation des Registres------------------
t1=millis();
for(i=0; i<imax; i++)
{
Pin_PORT |= _BV(Pin_reg);
Pin_PORT &= ~_BV(Pin_reg);
}
t2=millis();
temps= t2-t1;
Serial.print("Delta T Registres= ");
Serial.print(temps);
Serial.print("\n");
}