L'ATMÉGA 328




GÉNÉRALITÉS
Nous allons nous intéresser au microcontrôleur utilisé dans l'arduino uno : L'ATméga 328

Le microcontrôleur ATméga 328 par rapport à un microprocesseur est un composant complet. En effet dans un même composant on trouve :
• Une unité arithmétique et logique (ALU) pour les calculs,
• Une mémoire SRAM de 2Ko pour le stockage des variables du programme, c'est une mémoire volatile,
• Une mémoire FLASH de 32Ko pour le stockage du programme elle est effaçable et réinscriptible et non volatile,
• Une mémoire EEPROM de 1Ko pour stocker des valeurs, c'est une mémoire non volatile,
• Des ports d'entrées ou sorties :
    • Plusieurs broches peuvent avoir des fonctions différentes. L'utilisation d'une fonction ou d'une autre est définie par le programmeur. 
• Des sorties SDA et SCL pour le bus I2C,
• Un convertisseur analogique/numérique de résolution 10 bits :
    • Le convertisseur est multiplexé avec les 6 entrées /sorties analogiques, A0 à A5,
• Des timers/compteurs,
• Un port série,
• Des sources d'interruption internes et externes,
• Des sources d'horloge internes et externes,
• Des générateurs de signaux PWM (Pulse Wave Modulation),
• ....

Cela fait du microcontrôleur un composant complet et puissant qui est facile à mettre en œuvre avec un minimum de composant externe.

Le choix du microcontrôleur est important lors de la conception d'un projet car il existe de très nombreux microcontrôleurs avec des puissances et des possibilités plus ou moins étendues.

L'avantage essentiel avec ce type de composant est que sur une base électronique définie, on peut modifier le fonctionnement d'un montage en jouant seulement sur le logiciel embarqué dans le microcontrôleur.

distribution des fonctions sur un arduino uno
Distribution des fonctions sur un arduino uno
Les PORTs de l'ARDUINO UNO
Les ports de l'Atmega 328
En interne le microcontrôleur possède 3 ports d'entrées/sorties
PORTB : 8 broches,
PORTC : 7 broches,
PORTD : 8 broches.

Pour chaque PORT sont affectés des broches correspondant au microcontrôleur.
PORTB : broches 14, 15, 16, 17, 18, 19, 9 10,
PORTC : broches 23, 24, 25, 26, 27, 28, 1,
PORTD : broches 2, 3, 4, 5, 6, 11, 12, 13.

Pour éviter d'avoir un circuit intégré avec de très nombreuses broches, utile en fonction du projet à réaliser, certaines sont multifonctions.
Le programmeur choisit par programmation la fonction qu'il veut utiliser pour chaque broche.

Nota :
• L'utilisation des fonctions du microcontrôleur repose sur l'utilisation et la manipulation de registres internes, 
• Lorsque l'on utilise les fonctions de l'arduino, l'IDE nous décharge de la manipulation de ces registres et l'on doit utiliser la numérotation de la platine arduino uno, programmation en haut niveau,
• Lorsque l'on programme en bas niveau il faut impérativement connaître les registres concernés et utiliser la numérotation de l'Atmega 328.

Les correspondances des broches de l'Atmega 328 et la platine de l'arduino uno ne sont pas identiques :

correspondance des broches
Correspondance des broches de l'Atmega 328 et l'Arduino uno

La STRUCTURE d'un PROGRAMME
Le bût de l'utilisation d'un module arduino est de connecter de nombreux périphériques externes, led, capteur, touche, clavier, écran lcd, potentiomètre..., et ensuite grâce au développement d'un logiciel donner vie à tous ces périphériques pour obtenir un fonctionnement précis, par exemple :
• Une CENTRALE DCC,
• Un ANALYSEUR de TRAME DCC,
Un DÉCODEUR D'ACCESSOIRE,
• ...

Le principal avantage est que le fonctionnement de ces périphériques n'est pas figé, on peut enrichir la réalisation d'autres périphériques et, ou modifier le comportement du programme pour obtenir un fonctionnement différent ou simplement l'améliorer.

Pour le développement d'un programme on utilise l'IDE arduino.
Après installation et lancement du logiciel on peut commencer à développer notre programme. Il se présente sous la forme :

void setup()

{ 
//Instructions exécutées une fois.
} 
 
void loop()

//Instructions exécutées en boucle.
 }
Vue de l'affichage du logiciel Arduino

Le void setup() délimité par des parenthèses contient les instructions qui seront exécutées une seule fois.
C'est ici que l'on déclarera :
• Le comportement des broches en entrées ou sorties,
• L'utilisation de résistance de PULLUP,
• L'utilisation du PRESCALER,
• Le TIMER,
• ....

Le void loop() délimité par des parenthèses contient les instructions qui seront exécutées en boucle.
C'est ici que l'on insèrera :
• Les lignes de code du programme.

On insèrera avant le void setup() la déclaration des variables pour avoir une progression dans le déroulé du programme :


//Déclaration des variables du programme


void setup()

{ 
//Instructions exécutées une fois.
} 
 
void loop()

//Instructions exécutées en boucle.
 }
Insertion de la déclaration des variables

Nota : On peut intégrer dans un programme des commentaires pour expliquer le pourquoi de certaines lignes de code et le rendre plus lisible mais il ne seront pas pris en compte lors de la compilation, pour cela on utilise les signes :
// Commentaire ou,
• /* Commentaire*/ encadré par les signes .