Introduction

L’ATmega328P est un microcontrôleur 8 bits en technologie CMOS ; il a été créé par la société ATMEL. C’est le cœur de la célèbre carte de développement Arduino Uno ;  et  il est loin d’être le seul  de cette famille ; car les microcontrôleurs AVR comportent plusieurs modèles, qui vont jusqu’aux plus puissants d’entre eux.

Mais depuis 2016, ATMEL a été rachetée par MICROCHIP. Il n’y aura donc aucune surprise si en voulant télécharger la documentation technique de ce composant, d'être redirigé vers le site de MICROCHIP.

L’ATmega328P est  cadencé par une horloge pouvant atteindre une fréquence de 20 MHz ; sa tension d’alimentation varie entre 1,8 V et 5,5 V.

Il  est commercialisé soit sous forme de boitiers  DIP (Dual In Package), TQFP (Thin Quad Flat Package), MLF (Micro Lead Frame), ou QFN (Quad Flat No-lead).

 

Exemple d’ATmega328P sous forme de boitier DIP 28 broches:

 

boitierdipatmega328

Rôles des broches:

VCC : Alimentation ;

GND : Masse ;

PortB : Port d’E/S à 8 broches de 0 à 7, dénommées  PB0…PB7.  C’est un port d’E/S bidirectionnel  avec des résistances internes de « Pull Up » ; chaque broche peut être  configurée de façon individuelle.  Lorsqu'une broche du portB est configurée en  entrée, si elle est mise à un niveau logique bas par un autre composant (par exemple une porte logique ou autre), celle-ci débitera  du courant si la résistance de « Pull Up » associée a été activée.

Toutes les broches du portB passent à un état haute impédance lorsqu’une phase de reset est en cours.

PortC : Port d’E/S à 7 broches de 0…6, dénommées PC0..PC6. On fera une distinction entre les broches PC0...PC5   et  la broche PC6.  

PC0..PC5  sont des E/S bidirectionnelles avec des résistances de « Pull Up ». Les remarques précédentes concernant les broches du portB restent valables.

La broche PC6, assure aussi la fonction de reset par défaut (active à l’état bas).  Elle assure une fonction d'E/S, lorsqu’un fusible de configuration spécial  est programmé.

PortD : Port d’E/S bidirectionnelles à 8 broches, dénommées PortD0…PortD7, avec des résistances de « Pull Up ».  Les caractéristiques concernant les broches du portD sont identiques à celles du PortB et C.

Des fonctions additionnelles sont multiplexées sur chacune des broches du portB, C et D ; tous les détails concernant leur fonctionnement se trouvent dans la documentation technique du fabricant.

AVCC : Alimentation du module de conversion analogique numérique 

AREF : Tension de référence du module de conversion analogique numérique 

Les boitiers TQFP, QFN et MLF ont les mêmes ports avec deux entrées analogiques en plus.

 

Description :

Le microcontrôleur  ATmega328 est bâti sur un cœur AVR (dénomination d’ATMEL pour le type de cœur de cette famille de composants),  autour duquel plusieurs ressources cohabitent :

  • Une mémoire programme Flash de 32 K octets ;
  • Une mémoire données RAM statique de 2 K octets;
  • Une EEPROM (Mémoire programmable et effaçable électrique) de 1 K octets ;
  • Vingt trois E/S à usage général ;
  • Trente deux registres de travail à usage général ;
  • Deux timers/compteurs de 8 bits, avec modes comparaison – capture et PWM ;
  • Un timer/compteur de 16 bits, avec mode comparaison – capture et PWM ;
  • Six canaux d’entrées analogiques (Huit pour les boitiers MLF, QFN et TQFP) ;
  • Un module chien de garde électronique programmable (WDT) ;
  • Un module de conversion analogique numérique ayant une résolution de10 bits;
  • Deux modules d’interfaces série synchrones SPI ;
  • Un module d’interface série synchrone I2C (TWI);
  • Un module de communication série asynchrone USART ;
  • Des interruptions internes et externes.

Autres caractéristiques :

  • Six modes de mise en sommeil : Power-down, Power-save, Standby, Extended Standby, Idle, ADC Noise reduction.
  • Power-on Reset (Remise à zéro à la mise sous tension).
  • Brown-out detection (gestion des défaillances d’alimentation).
  • Oscillateur interne.

Ce microcontrôleur est basé sur une architecture de type Harvard.  Avec un nombre d’instructions réduit,  il appartient à la famille des microcontrôleurs RISC (Reduced Instruction Set Computer) ;  131 instructions.

 

Architecture :

archiatmega328 

La figure ci-dessus représente les différents sous-ensembles de ce microcontrôleur. En se basant sur ce schéma on a:

Le noyau AVR, les modules système (Reset,  circuit d’oscillateur, WDT, supervision d’alimentation, interface de programmation), les périphériques d’E/S (Port B, Port C, Port D), d’autres périphériques (Timer/Compteur/Comparateur/PWM,  Conversion analogique numérique,  Comparateur analogique, USART, SPI, I2C), et les mémoires (Flash, SRAM, EEPROM).

 

Le noyau AVR 

Il a pour rôle principal d’assurer la bonne exécution des instructions.

Il est principalement constitué d’une unité centrale (CPU Central Processing Unit)  qui combine 32 registres de travail à usage général, tous connectés directement à l’unité arithmétique et logique (ALU Arithmetic Logic Unit), ainsi deux registres distincts peuvent être accessibles par une seule instruction sur un cycle d’horloge; on a aussi un registre d’état (Status Register), un pointeur de pile (Stack), un compteur programme (PC Program Counter), un registre d’instruction, un décodeur d’instructions.

La CPU

C’est l’élément principal du noyau. Elle peut accéder aux mémoires, effectuer des calculs, contrôler les périphériques et gérer les interruptions. 

L'unité centrale de l’ATmega328P fonctionne en mode « Pipeline »

La figure suivante présente un exemple mettant en évidence ce type de fonctionnement sous forme de chronogrammes, ainsi que la durée d’exécution des instructions

pipeline3atmega28

 

L’Unité Arithmétique et Logique  (ALU Arithmetic Logic Unit)

Elle opère directement avec les 32 registres d’usage général. Toutes les opérations arithmétiques, immédiates ou entre registres peuvent être exécutées sur un simple cycle d’horloge.

La figure ci-dessous présente un cycle de fonctionnement dans le cadre d’instructions opérant avec l’ALU

 

cycleatmega328

 

L’ALU est divisée en trois parties principales :

  • Les fonctions arithmétiques,
  • Les fonctions logiques,
  • Les fonctions sur des bits.

 

Le registre d’état

Contient des informations sur l’opération arithmétique qui vient d’être exécutée. Ces informations peuvent être utilisées pour changer le déroulement du programme afin d’exécuter des opérations conditionnelles.  Le registre d’état est mis à jour après chaque opération de l’ALU.

Le registre d’état n’est automatiquement ni sauvegardé, ni restitué lors de l’exécution d’une routine d’interruption.  Cette opération devra donc être gérée par le programme.

Structure:

 

sregatmega328

 

Il possède 8 bits accessibles en lecture et en écriture.

Le bit 0 - C (Carry Flag) bit de retenue : Indique la présence d’une retenue lors d’une opération arithmétique ou logique. Dans ce cas il prend la valeur logique 1.

Le bit 1 – Z (Zero Flag) bit de zéro : indique un résultat nul lors d’une opération arithmétique ou logique. Dans ce cas il prend la valeur logique 1.

Le bit 2 – N (Negative Flag) : ce bit est positionné à 1, lorsque le résultat d’une opération arithmétique ou logique est négatif.

Le bit 3 – V (Two’s complement overflow Flag) bit de débordement du complément à deux : indique un débordement lors d’une opération arithmétique en complément à deux. Dans ce cas il prend la valeur 1.

Le bit 4 – S (Sign Flag) bit de signe : ce bit est positionné à 1, lorsque le bit N vaut 1, ou le bit V vaut 1 de façon exclusive.

Le bit 5 – H (Half Carry Flag) bit de demi-retenue: il indique la présence d’une demi-retenue lors d’une opération arithmétique, notamment sur des nombres BCD. Dans ce cas il prend la valeur 1.

Le bit 6 – T (Bit Copy Storage ) : ce bit utilise les instructions du langage machine (BLD Bit LoaD et BST Bit Store),  pour effectuer des opérations de lecture et de stockage des bits dans les registres du microcontrôleur.

Le bit 7 – I (Global Interrupt Enable) : Ce bit a pour rôle de valider les interruptions. Il devra être positionné à 1 ; si ce bit est à 0, aucune interruption ne pourra s’exécuter.  Il faut cependant noter que chaque type d’interruption possède aussi ses propres bits de contrôle dans un registre qui lui est dédié.

Registres de travail à usage général

Ils sont nommés R0, R1, …R31, et sont optimisés pour améliorer le jeu d’instructions du noyau AVR.

 

Structure

listeregistresat328 

 

La majorité des instructions opérant sur ces registres s’effectuent en accès directe. Des fonctions supplémentaires sont implémentées à partir du registre R26 jusqu’au registre R31. La combinaison de ces 6 registres donne trois pointeurs d’adresses à 16 bits nommés X, Y et Z pour l’adressage indirect de la zone de données (voir la documentation technique pour plus de détails sur ces registres).

 

Pointeur de pile

La pile est principalement utilisée pour le stockage temporaire de données, de variables locales et les adresses de retour après les interruptions et les appels aux sous-programmes.

Dans la SRAM, la pile sera définie par le programme avant chaque appel aux sous-programmes ou avant chaque exécution d’une interruption.

Le pointeur de pile pointe toujours au début de la pile. Il pointe sur la zone SRAM où se situent les piles prévues pour les sous programmes et les interruptions. Sa valeur initiale est égale à la dernière adresse de la SRAM.

Il est implémenté dans un espace mémoire réservé aux E/S, et est représenté par deux registres de 8 bits SPH et SPL.

 

Structure

 

pointeratmega328

 

Les mémoires

Le microcontrôleur ATmega328P possède trois types de mémoires : une mémoire programme Flash, une mémoire données SRAM, et une mémoire effaçable et reprogrammable électriquement EEPROM.

Mémoire programme Flash

Elle se divise en deux zones : une zone réservée au programme d’application et une autre pour le programme de boot.

 

progmematmega328

 

Mémoire données SRAM

L’organisation de la SRAM est donnée par la figure ci-après

 

datamematmega328

 

Les 32 premiers espaces permettent d’adresser des registres, ensuite on a une zone de 64 octets destinée aux E/S, puis 160 octets d’extension mémoire pour les E/S, le restant de la SRAM est réservé aux données.

 

Mémoire EEPROM

La mémoire EEPROM de l’ATmega328P a une capacité de 2 Ko. Elle organisée comme une zone de données séparées dans laquelle de simples octets peuvent être lus ou enregistrés. Elle est capable de supporter  100000 cycles de lecture/écriture.

L’EEPROM est accessible à partir de l’espace réservé aux fonctions d’E/S.  Pour écrire dans EEPROM, il faudra respecter un temps d’accès de 3,3 ms ; toutefois certaines procédures devront être mises en œuvre pour écrire dans une EEPROM, ceci afin d’éviter l’enregistrement des données non désirées.

La lecture d’une EEPROM est semblable à une lecture d’une zone mémoire classique. Dans cette phase de fonctionnement, le CPU est arrêté pendant  4 cycles d’horloge avant d’exécuter l’instruction qui suit.

La lecture ou l’écriture en EEPROM met en jeu trois registres : un registre d’adresse, un registre de données et un registre de contrôle.  

Registre d’adresse

regadratmega328 

 

Les bits 15 à 9 correspondent à une zone réservée, et  seront lue comme étant des zéros.

 

Registre de données

 

regdonneeatmega328

 

Registre de contrôle

 

regcontroleatmega328

 

Les bits 7 et 6 sont réservés.

Les bits 5 et 4 EEPM1 et EEPM0 définissent le mode de programmation de l’EEPROM.

Le bit 3 EERIE EEPROM Ready Interrupt Enable : validation de l’interruption d’accès à l’EEPROM.

Le bit 2 EEMPE EEPROM Master Mode write Enable : détermine, en accord avec le bit 1, une opération d’écriture dans l’EEPROM.

Le bit 1 EEPE EEPROM write Enable : validation d’une opération d’écriture dans l’EEPROM.

Le bit 0 EERE EEPROM Read Enable : validation de la lecture de l’EEPROM.

Pour plus de détails, sur la gestion de l’EEPROM, il faudra se reporter sur la documentation technique du microcontrôleur.

 

Registres d’E/S à usage général

L’ATmega328P possède trois registres d’E/S à usage général (GPIOR0, GPIOR1 et GPIOR2). Ces registres sont utilisés pour stocker n’importe quel type d’information,  ils sont particulièrement utiles pour les variables globales et les bits d’état.  Certains de ces registres aux adresses 00 à 1F, sont directement accessibles par bit.

 

Module d’horloge

Il permet de gérer la distribution du signal d’horloge vers les autres modules pilotés par le microcontrôleur.  Différentes sources d’horloge peuvent être sélectionnées à l’aide de fusibles spécifiques. Parmi les différentes sources possibles:

  • Oscillateur Crystal pour un fonctionnement basse puissance : Low Power Crystal Oscillator.

On peut utiliser un oscillateur Crystal ou un oscillateur céramique branché entre les broches XTAL1 et XTAL2

 

horlogeatmega328

 

Les condensateurs C1 et C2 ont une capacité comprise entre  12 pF et 22 pF.

  • Oscillateur Crystal à excursion de fréquence maximale (0,4 à 20 MHz): Full swing Crytal Oscillator;

Le branchement de l’oscillateur est identique au précédent. La consommation en courant sera plus élevée.

  • Oscillateur Crystal basses frequencies: Low frequency Crystal Oscillator;

L’oscillateur est branché entre les broches XTAL1 et .XTAL2.

Cet  oscillateur aura une fréquence 32,768 KHz ; la capacité de charge et la résistance série équivalent devront être prises en compte.  Un tableau donnant des valeurs recommandées par le constructeur se trouve dans la documentation technique du microcontrôleur.

Connaissant cette capacité de charge CL et la capacité parasite Cs  sur une broche XTAL, on peut calculer la valeur des deux condensateurs C1 et C2, par la formule C = C1 =C2 = 2xCL – Cs ; 

 

  • Oscillateur interne RC 128 KHz : Internal 128 KHz RC Oscillator;
  • Oscillateur RC calibré: Calibrated Internal RC Oscillator;

 

  • Horloge externe: External Clock;

    Seule la broche XTAL1 sera utilisée dans ce cas comme entrée du signal d’horloge. La fréquence pourra atteindre 20    MHz.

L’oscillateur RC est calibré à  8 MHz,  par défaut à la fabrication du composant.

 

Gestion de l’alimentation

Elle consiste à mettre hors tensions les modules non utilisés par la CPU, durant certaines phases, l’idée étant d’économiser l’énergie.

La gestion d'alimentation intervient dans les cas suivants: la mise en sommeil, les défaillances de l’alimentation, l’état de repos, la réduction du bruit des convertisseurs analogiques numériques, la mise hors tension, le mode standby et le mode standby étendu.

 

Convertisseur analogique numérique

Le convertisseur analogique numérique de L’ATmega328P est un convertisseur à approximations successives 10 bits. Il est doté d’un échantillonneur bloqueur ;  et, est connecté à un multiplexeur 6 canaux qui accueille 6 entrées analogiques (8 pour les boitiers TQFP et QFN/MLF) sur les broches PC0..PC5 (PC0..PC7) du port C. Chacune référencée à la masse.

En outre le convertisseur possède une alimentation (AVCC) distincte. La valeur de la tension d’alimentation sur cette broche devra fluctuer de +/- 0,3 V par rapport à VCC.

La tension de référence est fournie soit par une source interne (égale à 1,1 V), soit par une source externe (AVCC).

Caractéristiques

  • Résolution : 10 bits ;
  • Erreur de non linéarité intégrale : 0,5LSB ;
  • Précision absolue : +/- 2LSB ;
  • Tension d’entrée analogique : 0 à VCC ;
  • Référence de tension interne : 1,1 V ;
  • Durée de conversion : 13 à 260 us ;
  • Génère une interruption de fin de conversion ;
  • Jusqu’à 76,9 K échantillons /secondes (jusqu’à 15 K échantillons / secondes pour une résolution maximum).

 

Remise à zéro du système (Reset)

L’ATmega328P dispose de quatre sources de Reset :

Reset à la mise sous tension (Power-On Reset) :   à la mise sous tension, la tension d’alimentation va évoluer jusqu’à atteindre sa valeur typique.  L’unité centrale sera en état de reset lorsque cette tension est dessous d’un certain seuil (VPOT) ;  pendant une durée déterminée par un compteur interne.

 

startupresetatmega328 

 

Reset externe (External  Reset) : l’unité centrale est remise à zéro lorsqu’un niveau logique bas est appliqué sur l’entrée /RESET. On peut désactiver le reset externe en programmant le fusible correspondant (RSTDISBL).

 

externalresetatmega328

 

Reset  système par chien de garde (Watchdog System Reset) : l’unité centrale est mise à zéro en cas de dépassement de capacité du Timer du Watchdog.  Une impulsion est ainsi générée, lors du front descendant sur cette impulsion, un reset est généré.

watchdogresetatmega328

 

Reset sur surveillance d’alimentation (Brown-Out Reset) : lorsque la tension d’alimentation passe en dessous d’un certain seuil (VBOT), l’unité centrale est mise à zéro. Un seuil à hystérésis a été implémenté pour prévoir d’éventuelles fluctuations ou pics de tension. Il est activé par des fusibles spéciaux (BOBLEVEL).

 

brownoutresetatmega328

 

Les interruptions

L’ATmega328P dispose de 26 sources d’interruptions ;  toutes  résumées dans le tableau ci-après

 

N Vecteur

Adresse programme(Hexa)

Source

 

1

0000

RESET

Reset Externe, Power-on reset, Brown-out reset and Watchdog  reset

2

0002

INT0

Demande d’interruption externe 0

3

0004

INT1

Demande d’interruption externe 1

4

0006

PCINT0

Demande d’interruption sur changement d’état d’une broche 0

5

0008

PCINT1

Demande d’interruption sur changement d’état d’une broche 1

6

000A

PCINT2

Demande d’interruption sur changement d’état d’une broche 2

7

000C

WDT

Dépassement durée du Watchdog

8

000E

TIMER2 COMPA

L’égalité du Timer/Compteur2 comparateur  A

9

0010

TIMER2 COMPB

L’égalité du Timer/Compteur2 comparateur  B

10

0012

TIMER2 OVF

Dépassement du Timer/Compteur2

11

0014

TIMER1 CAPT

Evénement Capture Timer/Compteur1

12

0016

TIMER1 COMPA

L’égalité du Timer/Compteur1 comparateur  A

13

0018

TIMER1 COMPB

L’égalité du Timer/Compteur1 comparateur  B

14

001A

TIMER1 OVF

Dépassement du Timer/Compteur1

15

001C

TIMER0 COMPA

L’égalité du Timer/Compteur0 comparateur   A

16

001E

TIMER0 COMPB

L’égalité du Timer/Compteur0 comparateur   B

17

0020

TIMER0 OVF

Dépassement du Timer/Compteur0

18

0022

SPI, STC

Fin d’envoi  série SPI (Serial transfert complete)

19

0024

USART, RX

Fin de réception USART

20

0026

USART, UDRE

Registre de données USART vide

21

0028

USART, TX

Fin de transfert USART

22

002A

ADC

Fin de conversion numérique (ADC)

23

002C

EE READY

EEPROM prêt

24

002E

ANALOG COMP

Comparateur Analogique

25

0030

TWI

Interface série 2 fils

26

0032

SPM READY

Prêt pour le Stockage en mémoire Programme

 

Ces interruptions sont classées par ordre de priorité.  En partant de la priorité haute vers la priorité basse. Ainsi l’interruption « RESET » est la plus prioritaire de toutes.

On distingue des interruptions externes et les interruptions internes.

 

Interruptions internes

Elles sont provoquées par des registres, par exemple le débordement d’un Timer peut provoquer le déclenchement d’une interruption.

 

Interruption externes

Elles surviennent quand il y a un changement d’état des broches possédant les fonctions PCINT0 à  PCINT23(voir préentation du boitier en début d'article), ou lors d’un front montant ou descendant sur une des  broches INT0 ou INT1, configurée en entrée. Ces interruptions peuvent être actives même si la ou les broches concernées sont configurées comme des sorties.

Trois registres sont nécessaires pour gérér les interruptions INT0 et INT1 :

Le registre EICRA (External  Interrupt  Control Register A)

 

registreeicraatmega328 

 

Ce registre contient les bits de contrôle des interruptions.

Les bits ISC00 et ISC01 définissent l’état logique ou le type de front qui déclenchera l’interruption INT0.

Les bits ISC10 et ISC11 définissent l’état logique ou le type de front qui déclenchera l’interruption INT1

Le restant des bits est réservé.

 Le registre EIMSK (External Interrupt Mask)

 

registreeimskatmega328

Le bit INT0 : Lorsqu’il est à un et si le bit I du registre SREG (registre d'état) est à un, toute activité sur la broche INT0 du port d’E/S déclenchera une interruption. Cela pourrait-être un front ou un changement d’état.

Le bit INT1 : Lorsqu’il est à un et si le bit I du registre SREG est à un, toute activité sur la broche INT1 du port d’E/S déclenchera une interruption. Cela pourrait-être un front ou un changement d’état.

Le restant de bits est réservé.

Le registre EIFR (External Interrupt Flag Register)

Ce registre positionne des bits à un lorsqu’une interruption est validée.

 

registreeifratmega328

 

Le bit INT0 : lorsqu’une interruption est validée sur la broche INT0, le bit INTF0 est positionné à un. Ce bit peut être effacé une fois la routine d’interruption effectuée.  Mais il est aussi possible de l’effacer de façon logicielle en le positionnant à un.

Le bit INT1 : lorsqu’une interruption est validée sur la broche INT1, le bit INTF1 est positionné à un. Ce bit peut être effacé une fois la routine d’interruption effectuée.  Mais il est aussi possible de l’effacer de façon logicielle en le positionnant à un.

Le restant de bits est réservé.

 

Pour les interruptions sur changement d’état des broches d’E/S, on utilisera 5 registres.

Le registre PCICR (Pin Change Interrupt Control Register)

 

registrepcicratmega328

 

Le bit PCIE0 (Pin Change Interrupt Enable) : lorsque ce bit est à un et si le bit I du registre SREG est à un, tout changement sur l’une des broches PCINT7 à PCINT0 déclenchera une interruption.

Le bit PCIE1 (Pin Change Interrupt Enable) : lorsque ce bit est à un et si le bit I du registre SREG est à un, tout changement sur l’une des broches PCINT14 à PCINT8 déclenchera une interruption.

Le bit PCIE2 (Pin Change Interrupt Enable) : lorsque ce bit est à un et si le bit I du registre SREG est à un, tout changement sur l’une des broches PCINT23 à PCINT16 déclenchera une interruption.

Le restant des bits est réservé.

Le registre PCIFR (Pin Change Interrupt Flag Register)

 

registrepcifratmega328

 

Lorsque l’une des trois interruptions est activée, le bit PCIFn (0 < n < 2) est positionné à un. Celui-ci peut être effacé à la fin de l’exécution de l’interruption, ou par logiciel en écrivant un niveau logique un.

Le registre PCMSK0 (Pin Change Mask Register 0)

 

registrepcmsk0atmega328

 

Lorsque l’un des bits PCINT7 à PCINT0 est mis à un et le bit PCIE0 du registre PCICR est positionné à un, tout changement sur la broche d’E/S correspondante provoquera une interruption.  Si un des bits PCINT7 à PCINT0 est mis à zéro, aucune interruption sur changement d’état n’aura lieu.

Le registre PCMSK1(Pin Change Mask Register 1)

 

registrepcmsk1atmega328

 

Lorsque l’un des bits PCINT14 à PCINT8 est mis à un et le bit PCIE1 du registre PCICR est positionné à un, tout changement sur la broche d’E/S correspondante provoquera une interruption.  Si un des bits PCINT14 à PCINT8 est mis à zéro, aucune interruption sur changement d’état n’aura lieu.

Le registre PCMSK2 (Pin Change Mask Register 2)

 

registrepcmsk2atmega328

 

Lorsque l’un des bits PCINT23 à PCINT16 est mis à un et le bit PCIE2 du registre PCICR est positionné à un, tout changement sur la broche d’E/S correspondante provoquera une interruption.  Si un des bits PCINT23 à PCINT16 est mis à zéro, aucune interruption sur changement d’état n’aura lieu.

 

Ports d’E/S

Le microcontrôleur ATmega328P, possède des E/S ayant des fonctionnalités de lecture/modification/écriture.  La direction de la broche d’un port peut changer indépendamment de celle des autres. Le courant délivré par les broches des ports est élevé ; lorsqu’il fonctionne en sortie, un port est capable de piloter directement des afficheurs à LED. Toutes les broches sont protégées par deux diodes dont la cathode de l’une est connectée à VCC, tandis que l’anode de l’autre est à la masse.

Schéma équivalent de la broche d’un port

 

portatmega328

 

Chaque port possède trois registres nommés  DDRx , PORTx, et PINx ; qui fonctionnent en association avec le registre MCUCR.

 

registremcucratmega328

 

Lorsque le bit PUD est positionné à 1, l’entrée correspondante est placée dans un état haute impédance.

Par exemple pour le port  B on a

 

registrepinbatmega328

 

Chaque bit  PORTBx de registre permet d’activer la résistance de Pull Up de la broche de port concernée.

 

registreddrbatmega328

 

Chaque bit DDBx de ce registre détermine la direction de la broche du port concernée (Entrée ou Sortie).

 

registrepinbatmega328

 

Chaque bit PINBx permet de verrouiller l’état logique de la broche PORTBx concernée.

On notera aussi que lorsque PORTBx et DDBx sont à zéro, le port concerné est aussi placé dans un état haute impédance.

Les broches des ports d’E/S assurent plusieurs fonctions distinctes pour bon nombre d’entre elles. Pour plus d’informations il faut se reporter à la documentation du constructeur.

 

Le Temporisateur/Compteur0

Dans cette partie, pour des raisons de simplicité d’écriture, on préférera  « Timer » à « Temporisateur ».

Le Timer/Compteur0, est un module de temporisation et de comptage à 8 bits, avec deux unités de comparaison indépendantes, capables de gérer la production d’impulsions modulées en largeur (PWM).  Il permet de gérer la précision de la durée d’exécution d’un programme, la gestion des événements, et la génération de signaux.

Caractéristiques :

  • Deux unités de comparaison indépendantes ;
  • Registres de sortie de comparaison double tampon ;
  • Mise à zéro du Timer lorsque la valeur comparée est atteinte ;
  • Modulation à largeur d’impulsion ;
  • Période du signal PWM variable ;
  • Générateur de fréquence ;
  • Trois sources d’interruption indépendantes.

La structure générale de ce module est proposée dans la documentation technique de ce composant.

Pour fonctionner, le module doit être validé par le bit PRTIM0, du registre PRR (Power Reduction Register) en le positionnant à 0.

 

registreprratmega328

D’autres registres sont nécessaires pour mettre en œuvre ce module.

 

registretcnt0atmega328

Registre Timer/Compteur0 (TCNT0) : c’est un registre 8 bits, accessible en lecture et en écriture.

 

registreocr0aatmega328 

 

Registre de sortie de comparaison A : c’est un registre 8 bits, accessible en lecture et en écriture.

 

registreocr0batmega328

 

Registre de sortie de comparaison B : c’est un registre 8 bits, accessible en lecture et en écriture.

 

Toutes les demandes d’interruption du Timer0 sont visibles dans le registre TIFR0.

 

registretifr0atmega328

 

Les interruptions sont associées à un masque nommé TIMSK0.

 

registretimsk0atmega328

 

Le Timer0 utilise soit une horloge interne via un pré diviseur, soit un  signal externe connecté sur la broche T0, du microcontrôleur.

 

Le contenu des registres OCR0A et OCR0B est comparé à celui du Timer0, le résultat peut être utilisé pour générer un signal PWM ou un signal à fréquence variable.

 

Unité de comptage

L’organe principal du Timer/Compteur0, est l’unité de comptage bidirectionnelle programmable

 

unitecmptatmega328

 

Cette unité est principalement composée, d’un module de sélection du mode de comptage, d’une unité de contrôle logique, qui pilote le registre du Timer TCNT0.

Les signaux mis en œuvre :

  • CklTn: horloge du Timer/Compteur ;
  • Count : incrémentation ou décrémentation du registre TCNT0 du Timer/Compteur ;
  • Direction : sélection du sens comptage ou décomptage ;
  • Clear : remise à zéro de tous les bits du Timer ;
  • Top : signale que le registre TCNT0 du Timer a atteint le maximum de sa capacité ;
  • Bottom : signale que le registre TCNT0 du Timer a atteint le minimum de sa capacité.

 

Unité de comparaison de sortie

Le comparateur 8 bit compare de façon continue le contenu du registre TCNT0 avec celui des registres de comparaison de sortie (OCR0A et OCR0B), en cas d’égalité un signal (OCF0x) est émis, et un drapeau est positionné au cycle d’horloge suivant. Ce drapeau peut être effacé soit par logiciel, soit lors de l’exécution de l’interruption qu’il aurait déclenché.

 

Structure

 

compareatmega328

 

Le schéma ci-après présente sa structure, on distingue les registres TCNT0, OCR0A et OCR0B, le comparateur, et le générateur de signaux.

Les signaux ainsi générés sont disponibles sur  OC0x ; ce registre porte le même nom que la broche concernée qui pourrait être OC0A ou OC0B.

Modes de fonctionnement du Timer

Le comportement du Timer/Compteur et des broches OC0x est défini par la combinaison des trois bits WGM02…WGM00, et  deux bits  COM0x1 – COM0x0 ; permettant ainsi quatre modes de fonctionnement du module :

Le mode Normal,  le mode CTC, le mode Fast PWM et le mode Phase correct PWM.

Le mode Normal :

Dans ce mode, les bits WGM02 …WGM00 valent tous 0. Le compteur incrémente (+1) à chaque top d’horloge et lorsque sa capacité maximale est atteinte, il recommence le comptage à partir de 0 ; et un drapeau de débordement appelé TOV0 (Timer0 OVerflow) est positionné. Le bit TOV0 se comporte ainsi comme le neuvième bit du registre TCNT0 ; et se trouve dans le registre TIFR0.

Le module OC0x, peut être dans ce cas utilisé pour générer une interruption.

Le mode CTC (Clear Timer on Compare match) :

Dans ce mode, les bits WGM02…WGM00, qui se trouvent dans les registres TCCR0A et TCCR0B, sont égaux à 2 (2 étant une valeur décimale).  Le registre OCR0A est utilisé pour manipuler la résolution du compteur.  Le contenu du registre TCNT0 est remis à zéro lorsque qu’il est égal (« match ») à celui de OCR0A. La valeur dans OCR0A, définie la borne supérieure du compteur.

Une interruption peut être ainsi générée à chaque fois qu’il y a égalité grâce au bit OCF0A (« OCF0A Flag »). Dans la routine de programme correspondante, si l’interruption est active, on peut mettre à jour le contenu de OCR0A.

La figure ci-après illustre ce fonctionnement

 

chronogramctcatmega328

Selon cette figure « OCn » peut être utilisé comme signal de sortie de la broche « OCnx » associée.

La fréquence du signal est obtenue par l’équation suivante :

 

\[f_{OCnx} = \frac{f_{CLK I/O}}{2.N.(1 + OCRnx)}\]

N étant le facteur de pré division pouvant prendre les valeurs 1, 8, 64, 128, 256, ou  1024.

La valeur de N est déterminée par la combinaison des bits CS02, CS01 et CS00 du registre TCCR0B.

 

Le mode Fast PWM

Dans ce mode, les bits WGM02…WGM00 sont égaux à 3 ou 7 (3 et 7 étant des valeurs décimales).

Permettant ainsi de générer des signaux hautes fréquences.  Le contenu du registre TCNT0 est incrémenté de 0 à FF hexa, puis recommence et ainsi de suite.

Lorsque le contenu de TCNT0 est égal à celui de OCR0x (x = A ou B), la broche OC0x correspondante passe à l’état bas ; puis mise à l’état haut lorsque TCNT0 débute le comptage à partir de 0.

Une interruption peut être ainsi générée à chaque fois qu’il y a égalité grâce au bit OCF0A (« OCF0A Flag »). Dans la routine de programme correspondante, si l’interruption est active, on peut mettre à jour le contenu de OCR0A.

La figure ci-après illustre ce fonctionnement, avec en plus le cas où la sortie OCnx est inversée

 

chronogramctc2atmega328

 

La fréquence du signal est obtenue par l’équation suivante

 

\[f_{OCnxPWM} = \frac{f_{CLK I/O}}{N.256}\]

N étant le facteur de pré division pouvant prendre les valeurs 1, 8, 64, 128, 256, ou  1024.

 

Le mode Phase correct PWM

Dans ce mode, les registres WGM02…WGM00 prennent la valeur 1 ou 5.  Il est basé sur un fonctionnement en double rampe.

 

chrnogramctc3atmega328

 

Lorsqu’il y a égalité entre TCNT0 et OCR0A, il y a changement d’état de la broche OC0x. Le drapeau  TOV0 est positionné à chaque fois que le contenu de TCNT0 atteint son minimum (0). Ce bit peut permettre de générer une interruption, à l’intérieure de laquelle le contenu de OCR0A peut être mis à jour.

La fréquence du signal de sortie est donnée par la formule

\[f_{OCnxPCPWM} = \frac{f_{CLK I/O}}{N.510}\]

N étant le facteur de pré division pouvant prendre les valeurs 1, 8, 64, 128, 256, ou  1024.

 

Le tableau ci-après résume l’état des bits WGM02…WGM00, pour chaque mode de fonctionnement du Timer.

 

Valeur décimale

WGM02

WGM01

WGM00

Mode de fonctionnement du Timer/Compteur0

Contenu Max

0

0

0

0

Normal

FF hexa

1

0

0

1

PWM, Phase correct

FF hexa

2

0

1

0

CTC

OCR0A

3

0

1

1

Fast PWM

FF hexa

4

1

0

0

Réservé

 

5

1

0

1

PWM, Phase correct

OCR0A

6

1

1

0

Réservé

 

7

1

1

1

Fast PWM

OCR0A

 

L’ATmega328P possède aussi deux autres Timers/Compteurs. Pour plus d’informations sur ces deux modules, il faudra se reporter à la documentation technique du composant.

Nous tenterons d’amener plus de détails sur ces modules dans des cas où ils seront utilisés dans des programmes d'exemples.

 

L’Interface de communication série – SPI

L’interface série  SPI (Serial Peripheral Interface) est une interface de transmission synchrone de données entre l’ATmega328P et d’autres composants ou entre composants AVR.

Caractéristiques :

  • Transmission de données synchrone sur trois fils en mode Full-duplex ;
  • Fonction maître ou esclave ;
  • Premier bit transmis : LSB ou MSB ;
  • Drapeau d’interruption pour la fin de transmission ;
  • Drapeau de protection anticollisions en écriture ;
  • Réveil du mode repos ;
  • Mode SPI Master double vitesse.

Le système est composé deux registres à décalage et un générateur d’horloge. C’est le maître du bus qui initie la communication en activant la broche /SS (Slave Select) de composant avec lequel il désire communiquer à l’état bas. Des impulsions d’horloge sont alors générées par le maître sur la broche SCK ; le transfert de données peut commencer du maître vers l’esclave (MOSI), ou de l’esclave vers le maître (MISO). Après chaque transfert le maître pourra synchroniser l’esclave  en mettant à l’état haut la broche /SS.

En mode esclave, l’interface SPI en mode MISO restera en sommeil dans un mode trois états aussi longtemps que la broche /SS est à l’état haut.

Le bus série SPI est géré par un registre appelé SPCR (SPI Control Register) ; et l’état du bus est donné par le registre SPSR (SPI Status Register).

Le registre SPCR

 

registrespcratmega328

Le bit SPIE lorsqu’il est positionné active l’interruption du bus SPI.

Le bit SPE lorsque ce bit est à un, le bus SPI est validé.

Le bit DORD lorsque ce bit est à un, l’envoi de données commence par le bit de poids faible ; et lorsqu’il est à zéro, c’est le bit de poids fort qui est envoyé en premier.

Le bit MSTR lorsque ce bit est à un le composant se comporte en maître du bus, et il se comporte comme esclave dans le cas contraire.

Le bit CPOL, lorsqu’il est positionné à un, la broche d’horloge SCK est à l’état haut au repos ; et lorsque ce bit est à zéro, la broche SCK est à l’état bas.

Le bit CPHA ce bit permet d’échantillonner les données soit sur front montant ou front descendant d’horloge SCK.

Les bits SPR1 et SPR0 permettent de sélectionner la vitesse de l’horloge SCK. Soit à fosc/2, fosc/4, fosc/8, fosc/16, fosc/32, fosc/64, et fosc/128 ;  fosc étant la fréquence d’horloge du microcontrôleur.

Le registre SPSR

 

registrespsratmega328

 

Le bit SPIF : c’est le drapeau d’interruption du bus SPI. Il est positionné lorsque la transmission série est terminée. L’interruption est déclenchée si le bit SPIE du registre SPCR a été préalablement positionné.

Le bit WCOL : ce bit est positionné lorsqu’il y a une écriture durant le transfert de données dans le registre SPDR (SPI Data Register).

Le bit SPI2X : la fréquence d’horloge SCK est doublée lorsque ce bit est positionné à un, et si le composant fonctionne en mode maître.

Le microcontrôleur ATmega328P dispose de deux autres types de bus série : le bus série asynchrone USART, et le bus série à deux fils I2C.

Pour plus d’informations techniques sur ces bus il faudra se reporter sur la documentation du composant.

D’autres circuits d’interface sont disponibles sur ce microcontrôleur on peut par exemple citer le comparateur analogique.

 

Fonctions spéciales

La mémoire programme de l’ATmega328P peut être protégée par des octets de verrouillage et certain fusible de configuration occupent un espace dédié à leur utilisation. La description de tous ces fusibles se trouve dans la documentation technique de ce composant.

 

Conclusion

Le microcontrôleur ATmega328P est un composant très complexe, pour n’être décrit que par ces quelques lignes. En cas d’utilisation de certaines fonctionnalités non présentées ici, il faudra se reporter à la documentation technique de ce microcontrôleur qui est suffisamment complète ; on y trouvera tous les détails nécessaires sur les interfaces ou fonctions qu’on souhaite utiliser.

En fonction des exemples qui seront traités dans d’autres articles, nous ne manquerons de présenter certaines interfaces ou fonctions au cas où elles seront utilisées. Toutefois ces exemples auront comme support la carte open source Arduino.