0% ont trouvé ce document utile (0 vote)
24 vues54 pages

GE Micro8bits Poly

Le document présente l'ATMEGA 8, un microcontrôleur 8 bits, en détaillant ses différentes fonctionnalités, son architecture interne et ses modes de communication. Il aborde également les registres systèmes, les interruptions, les ports et la conversion analogique. Enfin, il décrit les timers et les méthodes de programmation associées.

Transféré par

med80khilla
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
24 vues54 pages

GE Micro8bits Poly

Le document présente l'ATMEGA 8, un microcontrôleur 8 bits, en détaillant ses différentes fonctionnalités, son architecture interne et ses modes de communication. Il aborde également les registres systèmes, les interruptions, les ports et la conversion analogique. Enfin, il décrit les timers et les méthodes de programmation associées.

Transféré par

med80khilla
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Micro 8 bits : l’ATMEGA 8

David Delfieu

Département Génie Electrique 3ieme année


Acronyms

ADCH Analog to Digital Converter High. 20


ADCL Analog to Digital Converter Low. 20
GICR General Interrupt Control Register. 12, 13
M CU CR Management Control Unit Control Register. 9, 12
M CU CSR MCU Control and Status Register. 13
SP I Serial Peripheral Interface. 7
SRAM Static Random Access Memory. 6
SREG I T H S V N Z C. 8
U SART Universal Synchronous and Asynchronous Serial Receiver. 7
ACIC Analog Comparator Input Capture Enable. 33
ACO Analog Comparator Output. 32, 33
COM 1x1 : 0 Compare Output Mode x(A or B) 1:0. 33–35, 37, 38
ICF1 Input Compare Flag 1. 30, 32
ICN C1 Input Capture Noise Canceller 1. 33
OCF1A Output Compare Flag 1 A. 30, 32
OCF1B Output Compare Flag 1 B. 30, 32
T ICIE1 Timer Input Capture Interrupt Enable 1. 32
T OV1 Timer Overflow 1. 30, 32
W GM 13:0 Wave Generation Modes 3:0. 32–35
ACS ACD ACO ACI ACIE ACIC ACIS1 ACIS0 . 33
ADCSRA ADEN ADSC ADAT E ADIF ADIE ADP S2 ADP S1 ADP S0 . 21
ADM U X REF S1 REF S0 ADLAR M U X4 M U X3 M U X2 M U X1 M U X0 . 21
ASSR Asynchronous Status Register. 47
ICR1 Input Capture Register. 31–33, 36, 39, 40
OCR1A Output Compare Register 1 A. 31, 32, 35, 36, 39, 40
OCR1B Output Compare Register 1 B. 31, 32, 35
OCR1x Output Compare Register 1 x=A ou B. 36, 37, 40
OCR2 Output Compare Register 2. 42–48

1
OC1A Sortie MLI A du timer 1. 35
OC1X Sorties MLI A ou B du timer 1. 38
SF IOR ADT S2 ADT S1 ADT S0 − ACM E P U D P SR2 P SR10. 15, 28
T CCR0 − − − − − CS02 CS01 CS00 . 27
T CCR1A COM 1A1 COM 1A0 COM 1B1 COM 1B0 F OC11 F OC1B W GM 11 W GM 10 . 31, 32, 38
T CCR1B ICN1 ICES − W GM 13 W GM 12 CS12 CS11 CS10 . 31–33, 39
T CCR2 Timer Counter Control Register 2. 43, 46
T CN T0 Timer Counter Timer 0. 27, 28
T CN T1 Timer Counter Timer 1. 31, 32, 34–37, 39, 40
T CN T2 Timer Counter Timer 2. 42–48
T IF R OCF 2 T OV2 ICF1 OCF 1A OCF 1B T OV1 − T OV0 . 27, 31, 40, 42
T IM SK OCIE2 T OIE2 T ICIE1 OCIE1 A OCIE1 B T OIE1 − T OIE0 . 5, 27, 28, 31, 40, 48

ACSR Comparateur analogique. 19


ADCH Poids fort de la conversion analogique. 4, 22
ADCL Poids faible de la conversion analogique. 4, 22
ADCSRA Contrôle du convertisseur analogique. 4, 21, 22
ADMUX Multiplexeur analogique. 4, 22

EEPROM Petite mémoire non volatile qui contient des données dynamiques. Elle a un temps d’accès très lent, autour de
5 millisecondes pour un AT M EGA8 . 6, 8

FLASH Mémoire non volatile qui contient le programme et les données statiques. Par rapport à la SRAM , elle a un temps
d’accès plus lent ainsi qu’une durée de vie est assez limitée, par contre elle a une consommation faible. 6, 8

GICR Gestion des interruptions. 12

ICP1 Patte du timer 1 sur laquelle on peut réaliser une entrée de capture (P B0 ). 33

MCUCR Gère notamment les activations des interruptions externes. 12


MLI Modulation de Largeur d’Impulsions. 7

OC1A Patte du timer 1 sur laquelle on peut observer une MLI (P B1 ). 35


OC1B Patte du timer 1 sur laquelle on peut observer une MLI (P B2 ). 35
OSCCAL Calibration et gestion du résonnateur. 10

PUD Inhibe les résistances de tirage. 15

SFIOR Résistances de tirage et le pré-diviseur des timer 0 et 1. 15, 19


SRAM Mémoire volatile qui contient les données dynamiques. Elle est contient notamment tous les registres du microcon-
trôleur. 6, 8
SREG Registre qui contrôle les bits d’état du microcontrôleur comme la Carry, le bit Zero, le bit Négatif, . . . . 8

TCCR0 Pré-diviseur du timer 0. 4, 27


TCNT0 Registre de comptage du timer 0. 4, 27

2
Contents

1 Présentation générale 4
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.1 Les différents blocs mémoire de l’AT M EGA8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.2 Fonctionnalités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.3 Les modes de communication de l’AT M EGA8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.1 Architecture interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2.2 Registres Systèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.3 Horloges et modes des sommeil de l’AT M EGA8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Les modes interruptifs de l’AT M EGA8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.1 Les interruptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.2 Les interruptions externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.3 Le chien de garde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4 Les Ports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.4.1 Paramétrage et usage des P ORT S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.4.2 Résistance de tirage : Pull-up resistor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.3 Registres de manipulation des ports : DDRx , P INx etP ORTx . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.4 Le Port B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4.5 P ORT C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.6 P ORT D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.7 Lecture et écriture sur un port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.8 Lecture d’un Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.9 Fonction de manipulation de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2 Conversion Analogique 16
2.1 Le Comparateur Analogique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.1 Fonctionnement global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.2 Les registres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2 Le Convertisseur Analogique-Numérique : ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.1 Fonctionnement et caractéristiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2 Les différentes méthodes de programmation d’une conversion . . . . . . . . . . . . . . . . . . . . . . . 20
2.2.3 Les Registres de l’ADC : ADMUX, ADCSRA, ADCH, ADCL . . . . . . . . . . . . . . . . . . . . . . . 20

3 Les Timers 24
3.1 Le timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.1 Caractéristiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.1.2 Les registres associés au timer 0 : TCCR0, TCNT0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.1.3 Le prédiviseur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2 Le timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.1 Caractéristiques générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.2 Les 16 modes du timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.3 Les Modes du générateur de formes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.4 Inventaire des registres utiles au timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.5 Résumé des 16 modes de MLI du timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2.6 Exemples d’utilisation du timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

3
3.3 Le timer 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.3.1 Aperçu du timer 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.3.2 Génération de forme : pulse, PWM,. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3.3 Les modes du timer 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.3.4 Les registres utiles au timer 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.3.5 Les interruptions du timer 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3.6 T IM SK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3.7 TIFR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

4 La programmation 48
4.1 Langage C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.1 Structure d’un programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.2 Entête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.3 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.1.4 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.1.5 Déclaration de variable globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.1.6 Fonction de manipulation de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.1.7 Mise en oeuvre d’une interruption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.2 Interruptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

4
Chapter 1

Présentation générale

1.1 Introduction
Un microcontrôleur est un microprocesseur dédié au contrôle, il contient dans un même composant une unité de calcul
CPU, comme dans un micro-processeur, mais il a, par contre la possibilité d’adresser directement des Ports d’entrées-sorties
(impossible pour un microprocesseur. Il a de plus, spécifiquement, des timers, des convertisseurs analogiques, des unités de
communication et de la mémoire.
Ce cours présente l’AT M EGA8 , microcontrôleur de la famille Arduino ( Microchip anciennement Atmel) sur lequel on
développera des programmes en langage C dans l’environnement Arduino. On n’utilisera pas cependant le langage Arduino
leur préférant un structure C et la manipulation de registres.

La famille des AT M EGA8


Modèle Flash EEPROM RAM I0 PWM Interfaces CAN
AT M EGA8 8K 512 1024 23 3 SPI-USART 10 bits
AT M EGA16 16K 512 1024 32 4 SPI-USART 10 bits
AT M EGA32 32K 1k 2k 32 4 SPI - USART 10 bits
AT M EGA64 64K 2k 4k 53 8 SPI - USART(2) 10 bits
AT M EGA128 128K 4k 4k 53 8 SPI - USART(2) 10 bits
AT M EGA256 256K 4k 8k 53 16 SPI - USART(2) 10 bits

Dans cette famille, l’AT M EGA8 et l’AT M EGA16 sont compatibles broches à broches et il n’y a que très peu de différences
au niveau du code. On pourrait sur la carte de T P remplacer facilement un AT M EGA8 par un AT M EGA16 .

1.1.1 Les différents blocs mémoire de l’AT M EGA8


La mémoire de l’AT M EGA8 est constituée de 1ko de Mémoire vive (SRAM), de 512 octets de EEPROM et de 8ko de
mémoire FLASH.
La mémoire de type SRAM contient les registres et la pile système. La mémoire de type Static Random Access Memory
(SRAM ) est un type de mémoire vive “volatile” utilisant des bascules pour mémoriser les données. En l’absence d’alimentation
les données sont perdues. Pour placer des variables dans cet espace, on utilisera l’attribut volatile. Par exemple : volatile int i;
Cet attribut assure que la variable sera déclarée dans la SRAM, en dehors de la zone des registres spéciaux. Cela assure à
une variable globale de ne pas être perturbée par des modifications de ces registres.
La mémoire FLASH permet 10.000 cycles d’écriture. Elle contient le programme et les données. C’est une mémoire non
volatile. Par rapport à la SRAM, elle a un des temps d’accès moins rapide, une durée de vie est assez limitée mais une
consommation faible. Elle est même nulle au repos. La FLASH utilise comme cellule de base un transistor M OS possédant
une grille flottante enfouie au milieu de l’oxyde de grille, entre le canal et la grille. L’information est stockée grâce au piégeage
d’électrons dans cette grille flottante. Cette technologie se décline sous deux principales formes : N OR et N AN D, d’après
le type de porte logique utilisée pour chaque cellule de stockage. Dans l’AT M EGA8 on a une FLASH de type N OR. Les
mémoires de type N AN D sont plutôt consacrées aux mémoires de masse externes telles que les Cartes SD, disque dur,. . .
Les mémoires de type EEPROM sont les plus chères. Elle autorisent 100.000 cycles d’écriture. Elles ont un temps d’accès
un peu plus long, et donc on y stocke des données qui n’ont pas vocation a être modifiée souvent. Une autre différence avec
la FLASH classique est que l’on y écrit octet par octet.

5
1.1.2 Fonctionnalités
Les différentes fonctionnalités sont les timers, le convertisseur analogique (ADC), les possibilités de communication, les
mémoires et les P ORT Sd’entrées/sorties. Un timer peut définir des bases de temps, faire du comptage d’événements, ou
bien générer des MLI ou de gérer un watchdog 1 . L’ADC permet de convertir en valeurs numériques codées sur 10 bits des
tensions entre 0v et 5v. Les P ORT S permettent d’adresser et de communiquer avec des composants externes.

1.1.3 Les modes de communication de l’AT M EGA8


L’AT M EGA8 dispose de manière interne d’un circuit dénommé Universal Synchronous and Asynchronous Serial Receiver
(U SART ). A noter qu’on entend couramment parler d’UART, mais qu’Atmel a ajouté ici un S pour Synchronous. Ce qui
veut dire que cette interface peut servir à faire aussi bien de la communication série synchrone ou asynchrone, c’est à dire
avec des bits de start et de stop, mais aussi synchrone dans laquelle les bits de données sont envoyés de manière cadencée
par un signal de clock, piloté par un maître du protocole de communication. Elle utilise deux fils : un pour l’émission et un
pour la réception.
La communication série de type SP I est un bus de donnée série synchrone baptisé ainsi par Motorola, et qui opère en Full
Duplex. Les circuits communiquent selon un schéma maître-esclaves, où le maître s’occupe totalement de la communication.
Plusieurs esclaves peuvent co-exister sur un bus, la sélection du destinataire se fait par une ligne dédiée entre le maître et
l’esclave appelée chip select.
Le bus Serial Peripheral Interface (SP I) contient 4 signaux logiques :
• SCLK : Horloge (généré par le maître)
• M OSI : Master Output, Slave Input (généré par le maître)
• M ISO : Master Input, Slave Output (généré par l’esclave)

• SS : Slave Select, Actif à l’état bas, (généré par le maître)


La liaison SP I est utilisée pour la programmation de l’AT M EGA8 .
Grâce à une liaison série de l’AT M EGA8 on peut loader un programme à exécuter dans le microcontrôleur Mais on peut
aussi communiquer de façon synchrone (P I) ou asynchrone (TWI) avec des composants externes.

1.2 Architecture
L’architecture du microcontrôleur est illustrée dans la figure suivante :

Vcc PC6 PC5-PC0 PB7 PB6 PB5-PB0


Reset Xtal1 Xtal2

Port C Port B

Gnd
Agnd
Aref CAN/CNA TWI (I2C)

Timers/MLI
PC SP

Watchdog
SRAM

Flash :
Code Registres Unité d'IT
exéc.

X
Y
Z EEPROM

UAL

SR USART

SPI

Port D

1 Système de surveillance de bon déroulement de programme : Un wachtdog est capable de détecter si un programme sort de sa boucle infinie

déclenchant alors un reset qui remettra le programme dans se boucle

6
1.2.1 Architecture interne
Comme on l’a vu, il y a trois sortes de mémoires :
La mémoire FLASH : stocke le programme (10.000 cycles)
La mémoire SRAM (mémoire donnée) :
les 32 accus ;
les registres à fonctions spéciales ;
la pile.
La mémoire EEPROM : on y place des données stratégiques (100 000 cycles)

Registres Adresse Fonction


R0 $00 Accumulateur
R1 $01 Accumulateur
... ... accu
R25 $19 Accumulateur
Les 32 registres internes sont : R26 $1A X poids faible
R27 $1B X poids Fort
R28 $1C Y poids faible
R29 $1D Y poids Fort
R30 $1E Z poids faible
R31 $1F Z poids Fort

Mémoire Flash 8ko Mémoire SRAM (Données) 1024 o Mémoire EEprom 512 o

$0000 $0000 $0000

32 Accus : R0-R31

$001F
$0020

$01FF

Registres à Fonctions
Spéciales

$005F

$1FFF

Un mapping signifie une projection d’un plan mémoire sur l’espace d’adressage. Dans l’AT M EGA8 , certains plans
partagent un même espace d’adressage. On distinguera alors l’accès aux variables partageant ce même espace par l’utilisation
de modes d’adressage spécifiques.

7
Espace d'adressage
Mémoire SRAM (Données) 1024 o

$0000 $0000
$0001 $0001

32 Accus : R0-R31

$001F $001F

$0000 $0020
$0001 $0021

Registres à Fonctions
Spéciales ...

$003F $005F

$FFFF

1.2.2 Registres Systèmes


Ces registres agissent sur le contrôle ou indiquent l’état du processeur.

Registre SREG: SREG est un registre crucial dans ce micro-contrôleur. C’est lui qui surveille en permanence le
microcontrôleur et positionne ces bits en fonction de la dernière opération arithmétique ou logique. Par exemple si la
dernière opération donne un résultat négatif le bit N de SR passe à un.

I T H S V N Z C

• C: Carry
• Z : Zero
• N : Negative

• V : oVerflow = C8 ⊕ C7
• S : V ⊕N
• H : Half carry

• T : copy sTorage : bit tampon pour manipuler un bit


• I : autorisation générale des interruptions : sei() − cli()

Registre de pile SP Ce registre permet les appels de sous-programmes et le passage de paramètres et la sauvegarde de
l’état courant d’un programme. En assembleur, une pile se manipule par les instructions :
PUSH : Empile une donnée, décrémente SP
POP : Dépile une donnée, incrémente SP
Comme les piles Motorola, la pile de l’Atmel, fonctionne par adresses décroissantes. Par défaut SP contient : 0x60 et il
faudra changer cette valeur par la valeur : 0x1F F

8
1.2.3 Horloges et modes des sommeil de l’AT M EGA8
Les modes de sommeil : Registre M CU CR Ce registre définit les différents modes de sommeil dans lequel le micro
peut être plongé :

SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00


Les bits de configuration des modes de sommeil SMi :

SM2 SM1 SM0 Mode de Sommeil


0 0 0 Mode attente
0 0 1 Mode réduction de bruit pour l’ADC
0 1 0 Mode sommeil (Power down)
0 1 1 Mode économie d’énergie (Power save)
1 0 0 Réservé
1 0 1 Réservé
1 1 0 Non utilisé
1 1 1 En pause

Domaines d’horloges actives Oscillateurs Sources de reveil


Sommeil CPU FLA IO ADC ASY QTZ TIM INT TWI T2 EEP ADC IOs
Power Down X X
En pause X X X
Power Save X X X X X
Réd. bruit X X X X X X X X X
Attente X X X X X X X X X X X

Calibration et le contrôle de l’horloge OSCCAL

CAL7 CAL6 CAL5 CAL4 CAL3 CAL2 CAL1 CAL0

Valeur de calibrage de l’oscillateur pour la programmation de la mémoire flash ou de l’eeprom.


Suivant la configuration de certains bits, on peut utiliser les résonateurs suivants :

• Résonateur externe type céramique ou crystal


• Cristal externe basse fréquence
• Oscillateur externe ou interne de type RC
• Oscillateur calibré interne de type RC

• Horloge externe de type quelconque


La figure suivante (fig. 1.2.3) présente un montage en quartz externe basse fréquence :

Signal d'horloge
XTAL1 XTAL1

16Mhz

XTAL2 XTAL2

GND GND

Montage avec quartz externe L'horloge interne sert à produire


signal d'horloge externe

Figure 1.1: Quartz haute fréquence

On parle d’horloge temps réel lorsqu’elle permet de générer des diviseurs ou des multiples entier de la seconde. La figure
suivante (fig. 1.2.3) combine le positionnement d’un quartz externe et d’une horloge temps réel :

9
XTAL1

4Mhz
Montage quartz externe
XTAL2 basse fréquence

GND

TOSC1

32768hz Horloge temps réel

TOSC2

Figure 1.2: Quartz basse fréquence

La figure suivante (fig. 1.2.3) présente un montage en résonateur externe :

+5 V

R XT AL2

XT AL1

GND

Figure 1.3: Résonateur externe

Tableau récapitulatif de tous les registres systèmes :

Addresse Nom Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0x31 (0x51) OSCCAL Registre de calibration et de contrôle de l’horloge
0x34 (0x54) M CU CSR - - - - WDRF BORF EXTRF PORF
0x35 (0x55) M CU CR SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00
0x37 (0x57) SP M CR SPMIE RWWSB - RWWSRE BLBSET PGWRT PGERS SPMEN
0x3D (0x5D) SP L SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0
0x3E (0x5E) SP H - - - - - SP10 SP9 SP8
0x3F (0x5F) SREG I T H S V N Z C

1.3 Les modes interruptifs de l’AT M EGA8


Un microcontrôleur fonctionne de façon normale en exécutant la boucle infinie de son programme principal. Il peut aussi
être interrompu par un événement unique ou récurrent pour exécuter un sous-programme associé. Il y a deux sortes

10
d’interruptions : Les interruptions internes lièes aux timers, à l’ADC, . . . ou des interruptions externes.

1.3.1 Les interruptions


Une interruption externe correspond à la prise en compte d’un évènement dont l’occurrence possiblement aléatoire. Lors de
la survenue de cet évènement ou exécute un sous-programme associé. Ces événements peuvent être par exemple :
• La fin d’un délai,
• La fin de conversion,
• Le compteur d’un timer atteint un seuil
• Un front sur une patte du microcontrôleur
Un front sur une patte peut correspondre au niveau applicatif à :
• Un arrêt d’urgence provoqué par l’appui d’un bouton ad. hoc.
• Capteur de choc ou de contact
• Dépassement de seuil sur un capteur de température, ...
D’un point de vue programmation, il serait donc peu intéressent d’utiliser des boucles d’attentes de cette alarme. Son
traitement est donc réalisé en associant un sous-programme à un événement. On associe un évènement à un sous-programme
par la primitive ISR.

1.3.2 Les interruptions externes


L’AT M EGA8 offre deux interruptions externes sur deux pattes : IN T0 (P D2 ) et IN T1 (P D3 ). Les événements qui peuvent
se produire sur ce type de patte sont soit un front montant, soit un front descendant, soit un changement de niveau.
Associer un événement à un sous-programme se fait en utilisant l’instruction ISR auquel on passe un nom d’évènement :
ISR(N om_evenement) et du code entre accolades. L’ensemble des évènements est données dans les tables de la section 4.2
Exemple :
ISR ( INT0_vect ) {
PORTD ^= 0 xF0 ; // code associe a l ’ interruption
}
int main () {
DDRD =0 xF0 ;
GICR |= 1 < < INT0 ;
MCUCR |= 1 < < ISC01 ; // Front descendant
sei () ;
while (1) {}
}

Si l’événement IN T0 (front sur la patte P D2 ) se produit, quel que soit le comportement de la boucle infinie du programme
principal (main), le travail est interrompu pour exécuter le sous-programme associé qui est défini entre les deux accolades
du bloc ISR. A la fin du sous-programme d’interruption on revient là où l’on a été interrompu. La mise en oeuvre d’une
interruption externe se fait grâce aux registre GICR et M CU CR :
• GICR :
INT1 INT0 - - - - IVSEL IVCE

– IN T0 : à un, autorise une interruption externe sur la patte P D2


– IN T1 : à un, autorise une interruption externe sur la patte P D3

• MCUCR :

SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00

Considérons une interruption externe IN T0 . Les bits ISC01 , ISC00 correspondent alors à la patte P D2 et le niveau
d’activité est défini par le tableau suivant :

11
- 00 : niveau bas
- 01 : front montant ou descendant
- 10 : front descendant
- 11 : front montant

Autres bits du registre GICR


• IV SEL : Interrupt Vector Select
Quand le bit IV SEL est mis à zéro, les vecteurs d’interruption sont placés au début de la la mémoire flash. Quand
ce bit est mis à un, les vecteurs d’interruption sont déplacés au début de la zone du boot loader de la mémoire flash.
L’adresse de cette zone est modifiable par les bits "fusibles" BOOT SZ.
• IV SEL : à un, autorise le changement du bit IV SEL
Parmi les différents modes de fonctionnement d’un micro-contrôleur on peut citer le fonctionnement "chien de garde".

1.3.3 Le chien de garde


Un chien de garde permet de relancer/réinitialiser le programme. En effet lors d’une perturbation électromagnétique, par
exemple, le déroulement du programme peut être altéré : Le compteur programme peut alors essayer d’exécuter du code
dans une zone mémoire non prévue. Un chien de garde, par exemple, armé toutes les 500 millisecondes, peut alors resetter
le programme et le remettre dans un déroulement normal.

Registre M CU CSR
- - - - WDRF BORF EXTRF PORF

• W DRF Watchdog Reset Flag: mis à un pour activer le watchdog, raz par un reset ou par une écriture d’un 0
• BORF : mis à un lors d’une panne d’électricité partielle, raz par reset ou écriture de 0.
• EXTR et PORF : Détermine la source d’un reset.

1.4 Les Ports


Dans un système à base de microcontrôleur on appelle “P ORT d’entrées-sorties”, des ensembles de 8 connections entre
le microcontrôleur et l’exterieur. Par ces ports, le système peut réagir à des modifications de son environnement, voire le
contrôler. Elles sont parfois désignées par l’acronyme I/O, issu de l’anglais Input/Output ou encore E/S pour Entrées/Sorties.
Ces P ORT S sont programmables en entrée ou en sortie.
Des buffers sont associés aux P ORT S, ils ont la capacité d’être à la fois source ou drain de courant ou en haute impédance
Une ligne d’un port d’entrées est essentiellement composé d’un tampon à trois états. Ceux-ci se comportent comme des
interrupteurs électroniques qui font apparaître, au moment voulu, soit deux niveaux logiques : zéro ou un et un état de haute
impédance. Les niveaux logiques sont mémorisés dans un registre du processeur.

12
Nom B7 B6 B5 B4 B3 B2 B1 B0
PORT D
PIND PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0
DDRD DDRD7 DDRD6 DDRD5 DDRD4 DDRD3 DDRD2 DDRD1 DDRD0
PORTD PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0
PORT C
PINC - PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC0
DDRC - DDRC6 DDRC5 DDRC4 DDRC3 DDRC2 DDRC1 DDRC0
PORTC - PC6 PC5 PC4 PC3 PC2 PC1 PC0
PORT B
PINB PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB0
DDRB DDRB7 DDRB6 DDRB5 DDRB4 DDRB3 DDRB2 DDRB1 DDRB0
PORTB PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0
Contrôle des Ports
SFIOR - - - - ACME PUD PSR2 PSR10

XTAL1

4Mhz
Montage quartz externe
XTAL2 basse fréquence

GND

TOSC1

32768hz Horloge temps réel

TOSC2

Figure 1.4: Quartz basse fréquence

1.4.1 Paramétrage et usage des P ORT S


Pour définir le Port en Entrée ou en Sortie on utilise DDRx (x = B, C, D).
• On peux positionner des résistances de tirage sur les lignes d’un port.
• Ecriture sur le Port : Si le Port est en sortie l’écriture d’un “0” ou d’un “1” positionnera cette valeur sur le P ORTx .
Chaque port de 8 bits est limité à un courant total de 200 mA.
• Lecture sur le Port : de la donnée disponible sur le Port est faite dans P INx . A chaque bit du registre P INx est
associée une bascule D qui permet de de stabiliser la lecture en la synchronisant sur un front de l’horloge système.
Cette stabilisation se fait au détriment d’un délai de lecture qui correspond à une période d’horloge.

13
1.4.2 Résistance de tirage : Pull-up resistor

Figure 1.5: Résistances de tirage type "pull-up"

Pour poser des résistances de pull-up il est nécessaire d’avoir les trois conditions suivantes:
• Définir les lignes en entrée ;
• Ecrire un “1” sur ces lignes ;
• PUD mis à zéro dans SFIOR : SF IOR & = (1 << P U D);

Résistances de tirage : le registre SF IOR


ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10
P U D=“Pull Up Disable”
• 1: Les résistances de tirages sont désactivées, les entrées sont en mode 3-états.
• 0 : Les résistances de tirages sont activées.

1.4.3 Registres de manipulation des ports : DDRx , P INx etP ORTx


• DDRB , DDRC , DDRD : Permet de programmer le sens des lignes (1 : sortie, 0 entrée)
• P ORT B, P ORTC , P ORTD : Mémorise l’état des pins, permet l’écriture ou la lecture Ou bien il permet de configurer
la résistance de tirage en entrée.
• P INB , P INC , P IND : Permet de lire les valeurs courantes des pattes du port

1.4.4 Le Port B

1 28
2 27
3 26
4 25
5 24
6 23
7 22
ATMega8
8 21
(XTAL1/TOSC1)PB6 9 20
(XTAL2/TOSC2)PB7 10 19 PB5(SCK)
11 18 PB4(MISO)
12 17 PB3(MOSI/OC2)
13 16 PB2(SS/OC1B)
(ICP1) PB0 14 15 PB1(OC1A)

• DDRB : Programme les lignes du port B

14
• P INB : Lecture du port B
• P ORTB : Ecriture sur le port B

1.4.5 P ORT C

(Reset)PC6 1 28 PC5(ADC5/SCL)
2 27 PC4(ADC4/SDA)
3 26 PC3(ADC3)
4 25 PC2(ADC2)
5 24 PC1(ADC1)
6 23 PC0(ADC0)
7 22
ATMega8
8 21
9 20
10 19
11 18
12 17
13 16
14 15

• DDRC : Programme les lignes du port C


• P INC : Lecture du port C

• P ORTC : Ecriture sur le port C

• P ORT C est un port d’entrée-sortie bidirectionnel de 7 bits avec des résistances de pulll up.

• Le buffer de sortie du P ORT C a la capacité d’être à la fois source ou drain de courant.


• En entrée les pattes sont tirés à la masse si les résistances de pull-up sont activées.
• Les pins de C sont en 3-états quand un reset survient.

• P ORT C6 = RESET si le fusible RST DISBL est à 1, alors la ligne est disponible en E/S

1.4.6 P ORT D

1 28
(RxD)PD0 2 27
(TxD)PD1 3 26
(INT0)PD2 4 25
(INT1)PD3 5 24
(XCK/T0)PD4 6 23
7 22
ATMega8
8 21
9 20
10 19
(T1)PD5 11 18
(AIN0)PD6 12 17
(AIN1)PD7 13 16
14 15

• DDRD : Programme les lignes du port C

• P IN D : Lecture du port D
• P ORT D : Ecriture sur le port D

15
1.4.7 Lecture et écriture sur un port
Ecriture sur un Port
• Pour écrire sur un port on déclare une ou plusieurs ligne en sortie par un registre.
Exemple : DDRD= 0xF F ; Tout le port est déclaré en sortie

• Ensuite on réalise une écriture sur les lignes déclarées en sortie par le registre P ORT D
Exemple : P ORT D = 0b00000011; On active les lignes 0 et 1

Exemple d’écriture d’un Port :


int main ( void ) {
DDRD = 0 xFF ; // port D en sortie
PORTD = 0 x7A ; // Allume leds 1 ,3 ,4 ,5 ,6
while (1) { // boucle infinie
PORTD ^= 0 x7A ; // ^= : ou - exclusif fait clignoter les leds
_delay_ms (20) ;
}
}

1.4.8 Lecture d’un Port


• Pour lire sur un port on déclare une ou plusieurs ligne en entrée par le registre DDRx .
Exemple : DDRD= 0x00; Tout le port D est déclaré en entrée
• Ensuite on réalise une lecture sur les lignes déclarées en sortie par le registre P INx dans une variable de type entier.
Exemple : int lu =P IN D; On active les lignes 0 et 1

Exemple ducture et d’écriture d’un Port :


int main ( void ) {
DDRC = 0 x00 ; // \ pc \ en entree
DDRD = 0 xFF ; // port D en sortie
int lu ;
while (1) { // boucle infinie
lu = PINC ,
PORTD = lu ; // PORTD recoit PORTC
_delay_ms (20) ;
}
}

1.4.9 Fonction de manipulation de bits


// Mise a un d ’ un bit sans affecter les autres bits
PORTD = PORTD | (1 < < PORTD4 ) ;
PORTD |= (1 < <4) ; // mise a un du bit 4

// Mise a un des 4 bits de poids faible sans affecter les autres bits
PORTB = PORTB | 0 x0F // ou
PORTB |= 0 x0F ;

// Mise a zero d ’ un bit sans affecter les autres bits


PORTB &=~(1 < < PB3 ) ; // mise a zero du bit 3

// Mise a zero de 4 bits sans affecter les autres bits


PORTB &= 0 x0F ; // mise a zero des 4 bits de poids Fort

// Commutation du bit 4 sans affecter les autres bits


PORTD = PORTD ^0 x10 ;
PORTD ^= 0 x10 ;

16
Chapter 2

Conversion Analogique

2.1 Le Comparateur Analogique


2.1.1 Fonctionnement global
Cet élément offre la possibilité de comparer deux valeurs analogiques sur les pattes P D6 et P D7 . AIN0 (P D6 ) est appelé
broche positive et AIN1 (P D7 ) broche négative. Lorsque AIN0 > AIN1 alors AC0 ← 1, on peut alors déclencher une
interruption (avec bit ACIE= 1) de comparaison.

Tension 1,30 v
Vcc

ABCG
ACD
ACIE
AIN0 IT de
1
0
Comparaison
analogique
+ AND
Sélection d'interruption
-

Sortie du
mutiplexeur ACIS1 ACIS0
Analogique ACI

1
AIN1 0
ACO

ADEN
AND
ACME

On a de plus, la possibilité de changer la référence "négative" : AIN1 par l’une des broches ADC0 , ADC1 , ..., ADC5 .
De plus, l’utilisateur peut sélectionner comme évènement de déclenchement, un front montant, un front descendant ou une
inversion.
En outre, toute entrée ADC5 , ..., ADC0 peut jouer le rôle de AIN1 . Pour réaliser cela il faut positionner à un le bit de
multiplexage ACM E du registre SF IOR, et mettre ADEN à un du registre ADCSRA on a alors les M U X2...0 du registre
ADM U X.

17
Les bits M U X qui remplacent AIN1 selon le tableau suivant :

ACM E ADEN M U X2 : 0 AIN 0


0 x xxx AIN 1
1 1 xxx AIN 1
1 0 000 ADC0
1 0 001 ADC1
1 0 010 ADC2
1 0 011 ADC3
1 0 100 ADC4
1 0 101 ADC5
1 0 110 ADC6
1 0 111 ADC7

2.1.2 Les registres


Registre ACSR: Analog Comparator Status Register ACSR

ACD - ACO ACI ACIE ACIC ACIS1 ACIS0

• ACD Analog Comparator Disable : Bit de mise en marche du comparateur analogique,


0 : mise en marche,
1 : arrêt
• ACO Analog Comparator Output : Contient le résultat de la comparaison : si V AIN0 > V AIN1 alors ACO = 1.
• ACI : Analog Comparator Interrupt : Flag Bit de demande d’interruption (bit raz ds le sp d’IT)
• Condition IT : ACIS1 et ASCI0). Ce bit est remis à 0 automatiquement après le traitement de l’interruption
• Masque d’IT : ACIE.

• ACIE Analog Comparator Interrupt enable : Bit de validation de l’interruption AN A_COM P .


• ACIC : Analog Comparator Input Capture Enable : La mise à 1 de ce bit connecte la sortie du comparateur à l’entrée
de capture du Timer1.
• ACIS1 et ACSI0 gère le comportement de la sortie AC0 :

Activation de AC0 ACIS1 ACIS0


1 → 0 ou 0 → 1 0 0
non utilisé 0 1
f ront montant 0 0
f ront descendant 1 1

Registre
ADTS2 ADTS1 ADTS0 - ACME PUD PSR2 PSR10
ACM E Analog Comparator Multiplexer Enable
• Quand ACM E= 1 et ADC est éteint (ADEN = 0 et ADSC = 0) alors le multiplexeur ADC choisit l’entrée négative
du comparateur analogique.
• Quand ACM E= 0 alors AIN1 est appliqué à l’entrée négative du comparateur analogique.

18
2.2 Le Convertisseur Analogique-Numérique : ADC

(Reset)PC6 1 28 PC5(ADC5/SCL)
2 27 PC4(ADC4/SDA)
3 26 PC3(ADC3)
4 25 PC2(ADC2)
5 24 PC1(ADC1)
6 23 PC0(ADC0)
7 22 AGnd
ATMega8
8 21 AREF
9 20 AVCC
10 19
11 18
12 17
13 16
14 15

Le convertisseur (ADC) convertit une tension d’entrée analogique en une valeur à 10 bits digitale par approximations suc-
cessives. Il possède 6 entrées simultanées avec une non-linéarité inférieure à +/ − 2 LSB avec une erreur à 0 V inférieure à
1 LSB. Le résultat de la conversion est positionné dans les registes Analog to Digital Converter High (ADCH) et Analog to
Digital Converter Low (ADCL).

IRQ de fin de conversion

REFS1 REFS0

ADCH ADCL

AVcc

2,56V
Conversion logique

-
AREF + Conversion 10 bits

ADEN ADSC

ADC5
ADC4
ADC3
ADC2 MUX2:0
ADC1
ADC0

MUX2:0

Le temps de conversion prend au minimum 13 cycles d’horloge. De plus, le convertisseur a une alimentation découplée du
micro : AV cc tq AV cc ∈ [V cc − 0, 3, V cc + 0, 3] : V cc est la tension de référence qui peut être externe ou interne : AREF
ou AV cc ou = 2, 56 v.

2.2.1 Fonctionnement et caractéristiques


On peut le programmer en générant une interruption de fin de conversion. De plus, il est possible du faire fonctionner en
limitant le bruit en mode de sommeil. Le résultat de la conversion numérique est donné par la relation :

Résultat numérique = P. Entière(Tension d’entrée/Tension de référence ∗ 1024)

Ou la tension de référence est soit AREF soit AVcc soit 2,56v.

19
ADC_0= 2.5 V, AREF = 3.3 V
ADCH-ADCL = PE(2.5/3.3 x 1024) = 774

Réduction des bruits lors de la conversion Pour réduire au maximum la précision de la conversions on pourra :

• Mettre en sommeil l’unité centrale avant le lancement d’une conversion.


• Découpler soigneusement l’alimentation AVcc avec des condensateurs.
• Règles élémentaires du routage : connexions courtes, plan de masse, ...

• Effectuer un filtre numérique des résultats (amortissement ,moyenne, ...).


La valeur minimale de conversion est GN D tandis que a valeur maximale est soit la tension sur la broche AREF soit le
tension sur la broche AVcc ou bien une tension interne de 2,56 V (cf bits REF Sn ).
Chacune des 6 broches d’entrée ADC peuvent être choisies comme des entrées simples de l’ADC . De plus, l’ADC contient
un mécanisme d’échantillonneur-bloqueur qui assure que l’entrée est tenue constante pendant 1,5 cycle d’horloge.
ADCL doit être lu en premier puis ADCH pour assurer la cohérence des données qui appartiennent à la même conversion.
Une fois ADCL lu, l’accès aux registres de commandes est bloqué afin d’empêcher une nouvelle conversion tant que ADCH
n’est pas lu. Quand ADCH est lu, l’ADC est à nouveau opérationnel. L’ADC a sa propre interruption qui peut être
déclenchée quand une conversion est achevée. La lecture de l’ADCL et d’ADCH interdit l’accès aux registres de commande
de l’ADC, mais si une interruption de fin conversion se produit alors que la lecture précédente n’a pas été encore faite le
résultat sera perdu. Il faut donc faire attention à lire rapidement un résultat de conversion.

Programmation
L’ensemble des registres à programmer l’ADC est ADM U X, ADCSRA, ADCH, ADCL, étudions ADEN ADSC ADAT E ADIF
(ADCSRA) :

ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0

• L’ADC est activé avec le bit ADEN .


• La référence de tension et le choix du canal d’entrée n’entrera pas en vigueur quand ADEN est mis à 1, il faut d’abord
désactiver ADEN .

• ADC produit un résultat sur 10 bits qui est présenté dans les registres ADCH et ADCL .
• Par défaut, le résultat est présenté ajusté à droite, mais peut facultativement être présenté ajusté à gauche en mettant
le bit ADLAR à un dans ADM U X. Pour un résultat sur 8 bits et un ajustement à gauche, la lecture du registre
ADCH est suffisante.

Lancement d’une conversion


Début d’une conversion Une conversion simple est lancée par ADSC← 1 (ADSC ∈ ADCSRA).
Si l’on change le canal tandis qu’une conversion est en cours, l’ADC finira la conversion actuelle avant l’exécution du
changement de canal.

Fin de conversion Dès lors, qu’une conversion est en cours, ADSC reste à un tant que la conversion se réalise et il
redescend à 0 quand la conversion est achevée. Quand une conversion est finie, le résultat est écrit dans les registres de
données ADCH et ADCL et ADIF est mis à 1. Le programme peut alors lancer ADSC de nouveau et une nouvelle
conversion sera amorcée sur le premier front montant de l’horloge.

Durée d’une conversion Une conversion simple commence par ADSC ← 1 ∈ ADCSRA puis en attendant le front
montant suivant du cycle d’horloge ADC . Une conversion normale prend 13 cycles d’horloge.
La première conversion après l’allumage de l’ADC : ADEN mis alors à 1 dans ADCSRA .

20
2.2.2 Les différentes méthodes de programmation d’une conversion
Conversion échantillonnée
Pour ce mode on va utliser un timer qui va définir une période d’échantillonnage. On va associer à une interruption de
débordement de ce timer dans laquelle on va déclencher la conversion analogique-numérique. Un exemple de codage est
donnée dans la section suivante (cf section ??).

Free Running mode : Mode de fonctionnement libre


Dans ce mode, l’ADC échantillonne en permanence, sans aucune action du programmeur autre que le lancement initial, et
met à jour les registres de données (ADCH et ADCL ). Ce mode est positionné par la valeur 1 dans ADF R ∈ ADCSRA.
La première conversion doit être lancée par ADSC ∈ ADCSRA. Dans ce mode l’ADC effectue des conversions sans se
préoccuper du flag d’interruption ADIF . Un exemple de codage est donnée dans la section suivante (cf section 2.2.3).

Conversion avec attente active


Pour ce mode on va définir une fonction ducture qui retournera un entier image de la conversion. L’attente active est du au
fait que, après avoir lancée la conversion par ADSC . Un exemple de codage est donnée dans la section suivante (cf section
??).

Aspects numériques Par défaut, la fréquence d’horloge d’entrée est entre 50 kHz et 200 kHz pour obtenir la résolution
maximale. Si une résolution plus basse que 10 bits est nécessaire, la fréquence d’horloge d’entrée de l’ADC peut alors être
plus haute que 200 kHz.

Temps de conversion Le temps de conversion qui est égal à 13 fois l’horloge système, peut, de plus, être multiplié, par
un facteur de pré-division (cf bits ADP S2−0 . Le module ADC contient un pré-diviseur qui produit une fréquence d’horloge
acceptable pour l’ADC à partir de celle du Control Process Unit (CP U ). La Mise en marche pré-diviseur se fait par ADP S
∈ ADCSRA et le pré-diviseur commence à compter dès que l’ADC est allumé en mettant le bit ADEN à 1 dans ADCSRA
.

ADEN
OR
ADSC
CK

CK/2
CK/4 CK/64
CK/8 CK/32
CK/16
CK/128
ADPS0
ADPS1
ADPS2

Fréquence échantillonnage en mode libre

2.2.3 Les Registres de l’ADC : ADMUX, ADCSRA, ADCH, ADCL


• ADM U X
REF S1 REF S0 ADLAR - M U X3 M U X2 M U X1 M U X0

21
– REF S1 , REF S0
REF S1 REF S0 Tension de Référence
0 0 AREF
0 1 AVcc avec capacité externe sur AREF
1 0 non utilisé
1 1 2, 56 v

– ADLAR : ADC Left Adjust Result Ajustement à gauche à 1 ou à droite à 0 du résultat dans le registre ADCL
et ADCH.
– M U X3,2,1,0 : Choix du canal ADC .

• ADCSRA
ADEN ADSC ADFR ADIF ADIE ADP S2 ADP S1 ADP S0

– ADEN : (AD ENable) Mise en marche du convertisseur avec la mise à 1 du bit, l’arrêt avec la mise à 0, la
conversion en cours sera terminée.
– ADSC : (AD Start Conversion) Lancement de la conversion de la voie sélectionnée (retourne à 0 en fin de
conversion). En mode simple conversion, il faut remettre à 1 à chaque nouvelle conversion. En mode libre, la
première conversion dure 25 cycles puis les suivantes 15, il n’est pas nécessaire de remettre le bit à 1 à chaque
conversion.
– ADF R : (Analog Digital Free Running Mode) La mise à 1 de ce bit permet de mettre en le convertisseur en
mode conversion libre : mode de fonctionnement ou les conversions ont lieu en permanence sans avoir besoin dus
re-lancer.
– ADIF : (AD Interrupt Flag) Passe à 1 une fois la conversion terminée et déclenche l’interruption si ADIE= 1.
Ce bit repasse automatiquement à 0 lors du traitement de la routine d’interruption.
– ADIE : “AD Interrupt Enable” : Validation de l’interruption du convertisseur.
– ADP S2 , ..., ADP S0 : Bits de Sélection du "Prescaler": facteur de pré-division de l’horloge interne du convertisseur
en fonction du quartz : rien,2,4,8,16,32,64,128.

• ADCH − ADCL:

– Avec ADLAR = 0 : On cherche un résultat sur 10 bits

- - - - - - ADC9 ADC8
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
int L = ADCL;
int H = ADCH;
int res = (H<<8)+L;

– Avec ADLAR = 1 : On cherche un résultat sur 8 bits en laissant tomber ADCL

ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2


ADC1 ADC0 - - - - - -
int res = ADCH;

Programmes relatifs à l’ADC

-1- Mode scrutatif : attente active. La led qui doit clignotter sur P B0 .

22
volatile int lu ; // variable globale

void l e c t u r e _ a n a l o g i q u e _ s c r u t a t i v e () {
char L ;
ADCSRA |= (1 < < ADSC ) ;
while ( ADCSRA & (1 < < ADSC ) ) {};
lu = ADCH ; // lecture sur 8 bits
}

int main ( void ) {


DDRB =0 x1F ; DDRC =0 x00 ; // C : entree , B : Sortie
ADMUX =(1 < < ADLAR ) ; // ajust Gauch , PC0 entree analog .
ADCSRA = (1 < < ADEN ) ; // Mise On ADC
do {
_delay_ms (200) ;
l e c t u r e _ a n a l o g i q u e _ s c r u t a t i v e () ;
} while (1) ;
return (0) ;
}

-2- Mode échantillonné : On réalise ici, un déclenchement échantillonée par le timer 1, de la conversion analogique
volatile int F ;

ISR ( ADC_vect ) { char L = ADCL ; F = ADCH ; }

ISR ( TIMER1_OVF_vect ) { ADCSRA |= (1 < < ADSC ) ; PORTB ^=1;}

int main ( void ) {


DDRB =0 x1F ; DDRC =0 x00 ;
ADMUX =(1 < < ADLAR ) ; // ajust Gauche , Lecture sur PC0
ADCSRA = (1 < < ADEN ) +(1 < < ADIE ) ; // mise ON du can , IT CAN
TCCR1A =0; TCCR1B = (1 << CS11 ) ; // prediv du \ timer \ Fcpu /8
TIMSK = (1 < < TOIE1 ) ; // Validation It de debordement */
sei () ; // toute les its autorisees
do {
PORTB ^=1; _delay_ms (50) ;
} while (1) ;
return (0) ;
}

-3- Free Running : On lance l’ADC une fois ouis on lit à la volée ADCH et ADCL.
int main ( void ) {
int H , L ;
DDRB =0 x1F ; DDRC =0 x00 ;
ADMUX =(1 < < ADLAR ) ;
ADCSRA = (1 < < ADEN ) + (1 < < ADSC ) + (1 < < ADFR ) ;
do {
PORTB ^=1;
delai (50) ;
L = ADCL ; H = ADCH ;
Res = (H < <8) + L ;
} while (1) ;
return (0) ;
}

23
-4- Mode boggué : Sans timer relance de l’ADC dans l’interruption de conversion.
volatile int F ;

ISR ( ADC_vect ) { F = ADCH ; ADCSRA |= (1 < < ADSC ) } // Aie !!!

int main ( void ) {


DDRB =0 x1F ; DDRC =0 x00 ;
ADMUX =(1 < < ADLAR ) ; // ajust Gauche , Lecture sur PC0
ADCSRA = (1 < < ADEN ) +(1 < < ADIE ) ; // mise ON du can , IT CAN
sei () ; // toute les its autorisees
do {
PORTB ^=1; _delay_ms (50) ;
} while (1) ;
return (0) ;
}

24
Chapter 3

Les Timers

Les fonctions d’un timer concernant d’abord les fonctions de temporisation avec la définition de base de temps, la génération
de formes (signaux carrés, MLI ) ansi que le comptage d’événements. Un timer permet aussi de mesurer un temps entre
deux événements.
Dans la figure suiva,nte nous illustrons une base de temps et la génération de formes :

Base de temps

δt

Forme périodique

PWM

70% de temps à l'état haut par rapport à la période définie

Dans cette figure on décrit le comptage ou la capture d’événements :

Détecteur de Contrôle
Pattes
Front Logique

base de temps du pré-scaler


0 0 0 0 0 0 1 1

TCNTn

L’AT M EGA8 possède 3 timers : timer 0, timer 1 et timer 2. Les timers 0 et 2 sont des timers 8 bits tandis que les timers
1 est un timer 16 bits. Le timer 2 est plus élaboré que le timer 0, il permet en plus de faire de la MLI et de produire une
interruption de comparaison.

3.1 Le timer 0
3.1.1 Caractéristiques
Ses fonctions de base

• timer à sortie unique

25
• Générateur de fréquences
• Comptage d’événements externes
• Pré-diviseur d’horloge 10 bits

• Le timer 0 se manipule à l’aide de seulement 3 registres :


– T CN T0
– T CCR0
– T IM SK

Aperçu global du timer 0 Le timer 0 est un timer 8 bits. Un débordement provoque l’évènement T IM ER0_OV F _vect
et la mise à un du drapeau T OV0 (dans le registre T IF R) et possiblement une interruption se produit. Le masquage ou
l’autorisation de cette interruption est réalisé par le bit T OIE0 du registre T IM SK . Comme le montre le schéma précédent
T CN T0 s’incrémente suivant :

• La patte externe timer 0


• Ou le pré-diviseur d’horloge. Ce choix étant fait par les bits CS02:0 ∈ T CCR0

TCCR0: contrôle du prédiviseur

Patte Détecteur de
ClkT0 Contrôle Timer Oveflow TOV0
T0 Front
Logique
Requête d'IT

Incrément
base de temps du prédiviseur

0 0 0 0 0 0 1 1 =0xFF

TCNT0

Figure 3.1: Aperçu de timer 0

• Le bloc logique ordonne alors l’incrément du registre TCNT0.

• Lorsque T CN T0 atteint la valeur 0xF F il repasse à la valeur 0 et dans le même temps le bit T OV0 passe à un.
• T OV0 agit comme un 9ième bit.
• Si une interruption a été mise en place alors ce bit est raz lors de l’exécution du sous-programme d’interruption associé.

3.1.2 Les registres associés au timer 0 : TCCR0, TCNT0


• T CCR0
- - - - - CS002 CS001 CS000

26
CS02 CS01 CS00 Description
0 0 0 T0 en pause
0 0 1 clkI/O : Horloge Système
0 1 0 clkI/O /8
0 1 1 clkI/O /64
1 0 0 clkI/O /256
1 0 1 clkI/O /1024
1 1 0 source externe : front descendant sur la patte T 0
1 1 1 source externe : front montant sur la patte T 0

Remarque 3.1.1 Si par ailleurs, la patte est utilisée en entrée Alors un front sur cette patte affectera quand même
timer 0 si les modes 6 ou 7 ont été choisis.

• T CN T0 : Accessible en lecture ou écriture : Registre de comptage courant.


• T IM SK
OCIE2 OCIE2 T ICIE1 OCIE1A OCIE1B T OIE1 - T OIE0

La condition d’autorisation de l’interruption de débordement de timer 0 est T OIE0 = 1 ET I = 1 ∈SR). Sur un


débordement de T CN T0 , on a :
– T OV0 ∈ T IF R qui passe à un, et le programme associé à l’interruption est alors exécuté.
– T OV0 est alors automatiquement raz dés le début du sous-programme d’IT.
Sinon en mode non interruptif, c.a.d. en mode scrutatif il faut remettre a zéro ce bit EN Y ECRIVANT UN "1".

3.1.3 Le prédiviseur
Les timers timer 0 et timer 1 partagent le même module de pré-division, mais ceux-ci peuvent avoir des fréquences différentes
de pré-divisions par rapP à la source d’Horloge Interne. Le Timer/Compteur peut être cadencé directement par l’horloge de
système (avec CS02:0 ∈ T CCR0 (timer 0) ou CS12:0 ∈ T CCR1 à 1) permettant une fréquence d’horloge maximale : clkI/O .
Autrement, on pourra choisir un facteur de pré-division suivant : clkI/O /8, clkI/O /64, clkI/O /256, clkI/O /1024.

27
clkI/O
Prédiviseur 10 bits
clear
PSR10
CLKI/O/8 CLKI/O/256
CLKI/O/64 CLKI/O/1024

CS10 CS00 1
CS11 CS01 0
CS12 CS02 1

Source d'horloge de T1 Source d'horloge de T0de


=clk /1024
I/O

Il y a la possibilité d’échantillonner la source externe à travers un détecteur de front qui induira alors un retard de 2.5 à
3.5 cycles d’horloge.

SF IOR
ADT S2 ADT S1 ADT S0 - ACME PUD P SR2 P SR10

• Quand P SR10 ← 1 le prédiviseur de timer 0 et timer 1 est raz.


• Attention ce prédiviseur est partagé par timer 0 et timer 1, et un reset du prédiviseur les affectent tous les 2.

28
Exemple d’utilisation du timer zéro avec la mise en place d’une interruption de débordement :
ISR ( T I ME R0 _ OV F_ v ec t ) {
static int Compteur ;
if ( Compteur ++ == 50) {
Compteur =0;
PortB ^=1 // permet de mesurer la periode
}
}

void configTimer0 () {
TCCR0 = (1 < < CS02 ) + (1 < < CS00 ) ; // clkio /1024
TIMSK = 1 < < TOIE0 ; // Autorisation IT de debordement
}

int main () {
DDRB =0 xFF ;
configTimer0 () ;
sei () ; // autorise ttes les interruptions
while (1) ;
}

3.2 Le timer 1
3.2.1 Caractéristiques générales
Ses fonctions de base
• timer 16 bits ;
• 2 sorties indépendantes de comparaison ;
• Une entrée de capture avec réduction de bruit ;

• 16 modes de PWM
• Générateur de fréquence
• Compteur externe d’événements
• 4 sources d’IT : T OV1 , OCF1A , OCF1B , ICF1 .

29
TOV1
Incrément
Logique de
Raz Contrôle
clkI/O PIN T1
Direction
TOP BOTTOM Prédiviseur

TCNT1

= =0

PIN
= MLI OC1A

OCF1A

OCR1A
Top prédéfinies :
FF,1FF,3FF,FFFF

OCF1B

PIN
= MLI OC1B

OCR1B

Datation de front

ICR1

TCCR1A TCCR1B

Les registres 16 bits


• le registre de comptage T CN T1

• les registre de sortie de comparaison : OCR1A - OCR1B


• le registre de capture d’entrée ICR1

les registres 8 bits

• Les registres de contrôle du timer T CCR1A -T CCR1B


• le registre de sortie de comparaison : OCR1A - OCR1B
• le registre de capture d’entrée ICR1

Les interruptions du timer 1 : Tous les signaux d’IT sont visibles depuis T IF R. Toutes les interruptions sont
masquables individuellement dans T IM SK

Contrôle de T CN T1 : Le timer 1 peut être fréquencé de façon interne par le prédiviseur ou par une source externe patte
timer 1. Le bloc logique détermine comment la source est utilisée pour incrémenter ou décrémenter T CN T1 . Le timer 1 est
inactif quand il n’y a aucune source. La source clkT1 de la figure (en haut à droite de la figure 3.2.1) est sélectionnée par
CS12:0 ∈ T CCR1B .

30
TOV1

Incrément Détecteur T1
Clear Logique clkT1 de front
TCNT1
Direction de contrôle
Prédiviseur

Top Bottom

Comparaison de seuil : Les deux registres de comparaison OCR1A - OCR1B sont utilisés comme des seuils qui sont
comparés avec T CN T1 . Le résultat ces comparaisons peut être utilisé pour générer une forme de type PWM ou bien une
fréquence variable sur les pattes OC1B , OC1B . Ces comparaisons d’égalité vont positionner les flags OCF1A ou OCF1B qui
peuvent alors être utilisé pour générer l’interruption correspondante.

La capture : Le registre de capture d’entrée ICR1 peut capturer un événement (front) sur la patte ICP1 Cette partie
inclue un filtre réducteur de bruit évitant la capture de fronts parasites.

Le choix de la valeur maximum : La valeur T OP est soit le maximum du timer (0xF F F F ) ou bien une valeur définie
dans ICR1 ou OCR1A . L’utilisation de OCR1A pour définir la valeur T OP , bloque la génération de PWM pour la sortie
OC1A. Lorsque l’on utilise ICR1 pour définir la valeur T OP les deux sorties PWM sont alors disponible (OCR1A et
OCR1B ), par contre l’entrée de capture n’est plus disponible.

BOT T OM BOT T OM = 0x0000


M AX M AX = 0xF F F F
T OP T CN T1 atteind T OP
c.a.d quand il atteint soit :
− 0xF F, 0x1F F, 0x3F F
− OCR1A, ou bien ICR1

Fonctionnement de l’Unité de Comptage


Le registre T CN T1 est piloté par le bloc logique via les signaux clear, increment ou decrement et part la source clkT1 . clkT1
peut être généré par une source externe ou interne selon les bits CS12 : 0. Quand CS12 : 0 = 0, le timer 1 est arrété, la
valeur de T CN T1 étant toujours accessible par le CPU. Une écriture par le CPU sur T CN T1 à la priorité sur toute autre
opération.
La séquence de comptage peut alors déterminer une forme d’onde (waveform) sur la patte OC1A selon les bits W GM 13:0
des registres T CCR1A et T CCR1B . Les formes d’onde dépendent en fait des modes de comptage (cf section 3.2.3) sur
T CN T1 . Le bit de débordement T OV1 dépend aussi du mode choisi sur W GM 13:0 .

Unité de capture
L’unité de capture peut capturer des événements externes en leur attachant une étiquette temporelle 1 attachée à cette
occurrence. Le signal externe indiquant l’occurrence d’un ou de plusieurs évènements est diponible sur la patte ICP1 ou par
le comparateur analogique. Les étiquettes temporelles peuvent être utilisées pour calculer une fréquence, un rapport cyclique
ou d’autres. Ces étiquettes temporelles sont parfois utilisées pour créer un "log" d’évènements.

Aperçu de l’Unité de Capture Quand un événement (front) se produit (cf figure 3.2.1) sur ICP 1, ou sur ACO, ce signal
passe par le réducteur de bruit et le détecteur de front. Si il passe cet étage, il déclenche l’écriture de T CN T1 dans ICR1 ,
T CN T1 constitue alors ce que l’on appelle une étiquette temporelle. Dans le même temps le drapeau ICF1 passe à un.
1 qui est la valeur courante de T CN T1

31
ICR1 TCNT1

Déversement de TCNT1 dans ICR1

Compatareur
ACO
Analogique

Réducteur de bruit Détecteur de front

ICP1

Figure 3.2: Unité de capture

En mode interruptif, Si T ICIE1 passe à un, une interruption de capture est déclenchée. ICF1 est automatiquement
remis à zéro dans le sous-programme d’IT.

Remarque 3.2.1 ICR1 ne peut être mis à jour que lorque l’on utilise le mode qui utilise ICR1 fixant la valeur T OP . Dans
ce cas, les bits W GM 13:0 doivent être positionnés avant que ICR1 soit initialisé avec la valeur T OP . On écrira dans ICR1
d’abord l’octet de poids faible puis le poids Fort.

La source de capture : La patte de capture est ICP1. Cette source peut aussi être connectée au comparateur analogique.
Le comparateur est sélectionné avec le bit ACIC du registre ACS.

Remarque 3.2.2 Attention, changer la source peut provoquer une capture, le flag ICF doit donc être raz après ce change-
ment.

Les pattes ICP1 et la patte de sortie ACO sont échantillonnées avec les mêmes techniques déjà évoquées : Le détecteur
de front est identique. Quand le réducteur de bruit est activé, de la logique est rajoutée avant le détecteur de front ce qui
ralentit le signal de 4 cycles d’horloge. Une entrée de capture peut être déclenchée par programme en contrôlant le P ORT C
contenant la patte ICP 1.

Réducteur de bruit C’est en fait un filtre numérique qui délivre la sortie ssi les 4 signaux échantillonnés consécutifs sont
égaux. Le réducteur est activé par le bite ICN C1 du registre T CCR1B .

Capture des événements Tout évènement capturé écrase le précédent même si il n’a a pas été traité par le CPU. Aussi,
dans un sous-programme d’interruption il faudra lire ICR1 au plus tôt. On prendra garde à ne pas changer la valeur T OP
lors de l’utilisation de capture. Lors de la mesure d’un signal de type PWM , la détection est changée aprés chaque capture
et cela doit donc être fait aussitôt que ICR1 a été lu.

Unité de Comparaison de sorties


Les sorties OC1A/B sont controlées par les bits COM 1x1 : 0. Un de ces bits à un provoque la sortie du générateur de forme.

32
OR

COM1x1

COM1x0 Générateur
D Q
FOCx0 de formes
1 OC1A/B
O
clkI/O

D Q

PORT

D Q

clkI/O
DDR

Figure 3.3: Contrôle de la sortie du comparateur

La forme produite sur les pattes OC1A ou OC1B dépend des bits W GM 13:0 et des modes de comparaison défini par
COM 1x1 : 0, ainsi que des valeurs pour T OP et BOT T OM . Il faut noter que cette figure montre que les pattes OC1A ou
OC1B doivent avoir été déclarées en sortie à l’aide du registre DDR.

3.2.2 Les 16 modes du timer 1


Le Comparateur permet de définir la valeur T OP de T CN T1 . Le comparateur peut fonctionner suivant différents modes.

Temp

OCR1H OCR1L TCNT1H TCNT1L

BUFFER de OCR1 TCNT1

OCR1H OCR1L

OCR1

OFF1A/B

TOP
BOTTOM Générateur de formes OC1A/B

WGM13:0 COM11:0

Figure 3.4: Unité de comparaison

33
Initialisation des registres et pattes de sorties

T CN T1 : L’écriture dans T CN T1 quel que soit le mode va bloquer les comparaisons pour un cycle d’horloge. Il y a des
risques à changer T CN T1 en utilisant le comparateur : Si la valeur écrite dans T CN T1 est égale à OCR1A ou OCR1B alors
le résultat de la comparaison sera perdu. Il ne faut pas écrire dans T CN T1 une valeur égale à T OP en mode PWM à valeur
variable. La comparaison avec T OP échouera alors et continuera jusqu’a 0xF F F F . Même effet si l’on écrit dans T CN T1
une valeur égale à BOT T OM en décomptant.
Concernant les pattes OC1A et OC1B, il fait faire attention à positionner OC1A et OC1B, en sortie (P B6 , P B7 ) avant
de produire une MLI par l’écriture de DDRB .
Le générateur de formes est défini par les bits COM 1x1 : 0 qui peremttent de définir 16 modes regroupés 5 catégories :

• Normal
• CTC
• PWM rapide

• Phase correcte PWM


• Phase et fréquence correcte PWM
modes normal, CTC, fast PWM , . . . En mode PWM COM 1x1 : 0 définissent si la PWM est inversée ou non. Les modes
sont completement définis avec : W GM 13:0 et COM 1x1 : 0.

3.2.3 Les Modes du générateur de formes


Les 16 différents modes sont déterminés par les bits : W GM 13:0

a) Le mode Normal : W GM 13:0 =0

La sortie OC1A commute à chaque fois que T CN T1 atteint la valeur T OP (si COM 1A1:0 = 1)
• Dans ce mode la fréquence max est :
fclkI/O
fOC1A =
2
• Sinon la fréquence est définie par :
fclkI/O
fOC1A =
2.N.(1 + OCR1A )

N représente le facteur de prédivision (1,8,64,256,1024)

Attention à ne pas changer la valeur T OP avec une valeur inférieure à la valeur courante du comparateur OCR1A .

c) Le mode PWM rapide W GM 13:0 =5,6,7,14 ou 15


Cette PWM permet de générer de plus hautes fréquences. Elle est dite à simple pente et on peut ici avoir 2 commutations
de la sortie sur la même pente. Ici, T CN T1 compte de BOT T OM à T OP et fait alors une comparaison avec un seuil
(OCR1A ), pendant la montée puis revient à BOT T OM .

Sortie
• En mode non inversé, la sortie est raz sur égalité avec OCR1A et mise à un sur BOT T OM .

• En mode inversé, la sortie est à un sur égalité et raz sur BOT T OM .


• Du fait de son fonctionnement en simple pente, on va 2 fois plus vite.

34
Changement de OCR1A (ou ICR1) ou de TOP

OCR1A

TCNT1

OC1A

Figure 3.5: Le mode PWM rapide

Fréquence Dans ce mode la fréquence est définie par :


fclkI/O
fOC1A P W M =
N.(1 + T OP )

N représente le facteur de prédivision (1,8,64,256,1024)

Valeurs particulières Attention à ne pas changer la valeur T OP avec une valeur inférieure à la valeur courante de celle
du comparateur. De plus, pour une valeur T OP = 0 on aura un quasi front à chaque top d’horloge.

d) Le mode PWM à phase correcte W GM 13:0 =1,2,3,10 ou 11


Ce mode permet d’obtenir une haute résolution de PWM à phase correcte. On est cette fois ci sur du double pente
avec comparaison de seuil. Le compteur compte de la valeur BOT T OM à T OP puis il décrémente jusqu’a BOT T OM et
recommence indéfiniment.

Instant de commutation de OC1x Cette commutation dépend du registre OCR1x et de la valeur T OP . On voit ces
instants de commutation dans la figure 3.2.3 ou deux événements se produisent lors des montées et des descentes :
• En mode non inversé, OC1x est raz sur l’égalité de T CN T1 avec OCR1x en comptant, et mis à un sur l’égalité de
T CN T1 avec OCR1x en décomptant.

• En mode inversé, OC1x est mis à un sur l’égalité de T CN T1 avec OCR1x en comptant, et raz sur l’égalité de T CN T1
avec OCR1x en décomptant.

Remarque 3.2.3 OCR1x sont mis à jour sur T OP . Cela signifie que si OCR1x est modifié pendant une pente, sa nouvelle
valeur n’est prise en compte que sur le prochain T OP

Ce mode à double pente à une fréquence de hachage maximale évidemment deux fois plus petite que celle à simple pente,
mais son caractère symétrique le rend plus utilisé dans les applications de commande de moteurs.

Résolution La résolution varie de la valeur 2 bits à 16 bits, elle dépend de la valeur de OCR1A ou ICR1 . La résolution
de la PWM est donnée par l’équation :
log(T OP + 1)
RP CP W M =
log(2)
Dans ce modu compteur est incrémenté jusqu’à ce que la valeur atteigne soit une des valeurs : 0x00F F, 0x01F F, 0x03F F
(W GM 13:0 = 1, 2, ou 3), soit la valeur dans ICR1 (W GM 13:0 = 10), soit la valeur dans OCR1A (W GM 13:0 = 11).
Dès que T CN T1 a alors atteint T OP alors OC1A commute et T CN T1 décompte dés lors.

35
Égalité de comparaison avec OCR1B

T CN T1

OC1B
t

Th : 1 Th : 2 Th : 3 Th : 4

Attention Là encore, lorsque l’on change la valeur T OP on doit s’assurer qu’elle est supérieure à la valeur courante de
T CN T1

Fréquence Dans ce mode la fréquence est définie par :


fclkI/O
fOC1A P CP W M =
2.N.(1 + T OP )

N représente le facteur de prédivision (1,8,64,256,1024)

Mode inversé ou non En positionnant les bits COM 1x1 : 0 à 2 on aura du non inversé. En positionnant les bits
COM 1x1 : 0 à 3 on aura de l’inversé

e) Le mode PWM à phase et fréquence correcte : "MLI Centrée" W GM 13:0 = 8 ou 9


Ce mode fournit une haute résolution à phase et fréquence correcte. Ce mode comme le précédent est basé sur une double
pente. Il compte indéfiniment de BOT T OM (0x0000) à T OP et de T OP à BOT T OM
En mode non inversé (cf figure suivante) les sortiesOC1A et OC1B sont remises à zéro sur l"égalité entre T CN T1 et
OCR1x en comptant et mis à un sur égalité en décomptant. En mode inversé c’est l’inverse.

Remarque 3.2.4 OCR1x sont mis à jout sur BOT T OM . Cela signifie que si OCR1x est modifié dans une pente alors sa
nouvelle valeur n’est prise en compte que sur le prochain BOT T OM .

L’opération en double pente donne une fréquence max plus basse comparée à celle en simple pente. Cependant son
caractère très symétrique en fait le modu plus utilisé en terme de contrôle moteur.

Résolution La résolution de la PWM est donnée par l’équation :

log(T OP + 1)
RP CP W M =
log(2)

36
Egalité de comparaison avec OCR1B

T CN T1

OC1B t

Th : 1 Th : 2 Th : 3 Th : 4
Au contraire du mode précédent il y a une symétrie dans le signal quand on examine sa période. De plus, OC1X ne sera
visible sur le que si le P ORT B a été programmé en sortie : avec DDRB .

Inversé/non inversé En positionnant les bits COM 1x1 : 0 à 2 on aura du non inversé. En positionnant les bits COM 1x1 : 0
à 3 on aura de l’inversé.

Fréquence Dans ce mode la fréquence est définie par :


fclkI/O
fOC1A P F CP W M =
2.N.(1 + T OP )

N représente le facteur de prédivision (1,8,64,256,1024)

3.2.4 Inventaire des registres utiles au timer 1

Le registre T CCR1A
COM1A1 COM1A0 COM1B1 COM1B0 F OC1A F OC1B W GM11 W GM10

Bits COM 1x1, COM 1x0 en mode normal et CTC

COM 1x1 COM 1x0 Description


0 0 P libre OC1x déconnectés
0 1 changement d ’état quand OC1x = T CN T 1
1 0 raz sur égalité
1 1 mis à un sur égalité

37
Bits COM 1x1, COM 1x0 en mode fast PWM

COM 1x1 COM 1x0 Description


0 0 P libre OC1x déconnectés
0 1 W GM 13:0 = 15
OC1A commute sur égalité
OC1B déconnectés
1 0 raz OC1x sur égalité
mis à un sur BOT T OM
1 1 mis à un sur égalité
raz sur BOT T OM

Bits COM 1x1, COM 1x0 en mode PWM à phase correcte et PWM à phase et fréquence correcte

COM 1A1 COM 1A0


COM 1B1 COM 1B0 Description
0 0 P libre OC1x déconnectés
0 1 OC1A commmute sur égalité, OC1B déconnecté
1 0 raz OC1x sur égalité en incrémentant
mis à un en décrémentant sur égalité
1 1 mis à un sur égalité en incrémentant
raz sur égalité en décrémentant

Bits F OC1x Ces bits F OC1x ne sont actifs que si on n’est pas en PWM mode. Cependant ces bits doivent être raz en
PWM mode. F OC1x ← 1 force à l’instant choisi, une comparaison entre T CN T1 et OCR1A (par ex.). Ce sont des bits
d’échantillonage. En lecture ces bits valent zéro.

W GM 11:0 Waveform Generation Mode Ces bits déterminent le sens du comptage, T OP et le type de forme et on l’a
vu précédement, ils déterminent aussi le mode : normal, CTC, et les trois modes PWM :
• PWM rapide : Fast PWM
• PWM à phase correcte : Phase correct PWM .
• PWM à phase et fréquence correcte : Phase and frequency correct PWM .

Le registre T CCR1B
ICN C1 ICES1 - W GM 13 W GM 12 CS12 CS11 CS12

ICN C1 : Réduction de bruit La réduction de bruit se fait par ICN C1 : Input Capture Noise Canceler. Si ICN C1 ← 1
cela active le réducteur de bruit de l’entrée de capture.
Quand le réducteur de bruit est activé l’entrée de capture ICP1 est filtrée. Le filtre affecte sa sortie si on a 4 sorties
successives égales ce qui induira un délai de 4 cycles d’horloges.

ICES1 : La sélection du type d’évènement La sélection du type d’évènement se fait par ICES1 : Input Capture Edge
Select. Ce bit sélectionne quel type de front permet de déclencher la capture. Quand ICES1 = 0 c’est un front descendant,
lorsque ICES1 = 1 c’est un front montant.
Quand une capture est déclenchée, T CN T1 est vidé dans ICR1 . ICF 1 est positionné à un et peut générer une interruption
. Quand c’est ICR1 qui détermine T OP alors ICP1 est déconnectée et le mécanisme de capture ne fonctionne plus.

W GM 13 : 2 Waveform Generation Mode (cf 3.2.2)

38
Bit CS12:0 Clock Select Ces trois bits sélectionnent la prédivision : division de Cllkio par N = (1, 8, 64, 256, 1024).

Les Registres T CN T1 , OCR1x , ICR1


T CN T1 est accessible en lecture et en écriture. Modifier T CN T1 pendant le comptage peut produire un effet indésirable
si la nouvelle valeur est supérieure aux valeurs de comparaison : on manque alors une comparaison.

OCR1x , les registres de comparaison contiennent une valeur 16 bits qui est continument comparée avec la valeur courante
de T CN T1 . L’égalité est utilisée pour générer une interruption ou une forme sur la patte OC1x .

ICR1 est mis à jour avec la valeur du compteur T CN T1 à chaque fois qu’un événement se produit sur la patte ICP 1 .
Ce registre peut aussi être utilisé pour définir la valeur T OP .

Le registre T IM SK
OCIE2 OCIE2 T ICIE1 OCIE1A OCIE1B T OIE1 - T OIE0

T ICIE1 : "Timer/Counter1, Input Capture Interrupt Enable" :

Quand T ICIE1 ← 1, le bit I du registre d’état est mis à un, toutes les interruptions sont donc globalement autorisées et
en particulier l’interruption de capture. L’interruption ad hoc est alors exécutée lorsque ICF1 ∈ T IF R reçoit un.

OCIE1A : "Timer/Counter1, Output Compare A Match Interrupt Enable" : Quand OCIE1A ← 1, le bit I du
registre d’état est mis à un, toutes les interruptions sont donc globalement autorisées et en particulier l’interruption de
comparaison. L’interruption ad hoc est alors exécutée lorsque OCF 1A ∈T IF R reçoit un.

OCIE1B : "Timer/Counter1, Output Compare B Match Interrupt Enable" : Quand OCIE1A ← 1, le bit I du
registre d’état est mis à un, toutes les interruptions sont donc globalement autorisées et en particulier l’interruption de
comparaison. L’interruption ad hoc est alors exécutée lorsque OCF 1B ∈ T IF R reçoit un.

T OIE1 : "Timer/Counter1, Overflow Interrupt Enable" :

Quand T OIE1 ← 1, le bit I du registre d’état est mis à un, toutes les interruptions sont donc globalement autorisées et
en particulier l’interruption de comparaison. L’interruption ad hoc est alors exécutée lorsque T OV1 ∈ T IF R reçoit un.

Le registre T IF R
OCF2 T OV2 IC1 OCF1A OCF1B T OV1 - T OV0

ICF1 : "Timer/Counter1, Input Capture Flag" :

ICF1 est un drapeau (flag) qui reçoit un quand la patte ICP 1 reçoit un signal. Quand ICR1 est utilisé pour stocker
T OP avec un mode de W GM 13 : 0, ICF1 est positionné à un quand le compteur atteint T OP . ICF1 est automatiquement
raz par le sous-programme d’interruption est exécuté. Sinon ICF1 peut être raz en y écrivant un un.

OCF 1A : "Timer/Counter1, Output Compare B Match Flag" :

OCF 1A est un drapeau (flag) qui reçoit un quand l’égalité de OCR1A avec T CN T1 se produit. OCF 1A est automatique-
ment raz par le sous-programme d’interruption est exécuté. Sinon OCF 1A peut être raz en y écrivant un un.

OCF 1B : "Timer/Counter1, Output Compare B Match Flag" :

Ce bit est un drapeau (flag) qui reçoit un quand l’égalité de OCR1B avec T CN T1 se produit. OCF 1B est automatiquement
raz par le sous-programme d’interruption est exécuté. SinonOCF 1B peut être raz en y écrivant un un.

39
T OV1 : "Timer/Counter1, Overflow Flag" :

Dans les modes normal et CTC modes, T OV1 est mis à un sur un dépassement de capacité T OV1 est automatiquement
raz par le sous-programme d’interruption est exécuté. Sinon T OV1 peut être raz en y écrivant un un.

3.2.5 Résumé des 16 modes de MLI du timer 1


v W GM13 W GM12 W GM11 W GM10 M ode T OP Mise à jour Mise à un
des Timers de OCR1x de T OV1
0 0 0 0 0 Normal 0xF F F F Immediate M AX
1 0 0 0 1 PWM Phase Correcte 8-bit 0x00F F T OP BOT T OM
2 0 0 1 0 PWM Phase Correcte 9-bit 0x01F F T OP BOT T OM
3 0 0 1 1 PWM Phase Correcte 10-bit 0x03F F T OP BOT T OM
4 0 1 0 0 CTC OCR1A immediate M AX
5 0 1 0 1 Fast PWM 8-bit 0x0F F BOT T OM T OP
6 0 1 1 0 Fast PWM 9-bit 0x1F F BOT T OM T OP
7 0 1 1 1 Fast PWM 10-bit 0x3F F BOT T OM T OP
8 1 0 0 0 PWM Phase, freq. correctes ICR1 BOT T OM BOT T OM
9 1 0 0 1 PWM Phase, freq. correctes OCR1A BOT T OM BOT T OM
10 1 0 1 0 PWM Phase Correcte ICR1 T OP BOT T OM
11 1 0 1 1 PWM Phase Correcte OCR1A T OP BOT T OM
12 1 1 0 0 CTC ICR1 immediate M AX
13 1 1 0 1 Réservé − − −
14 1 1 1 0 Fast PWM ICR1 BOT T OM T OP
15 1 1 1 1 Fast P W M OCR1A BOT T OM T OP

3.2.6 Exemples d’utilisation du timer 1


-1- MLI centrée sur la patte P B2 (OC1B ).

int main ( void ) {


int i ;

DDRB = 0 xFF ; // Port B en sortie

// TCCR1A : Mli centree : Mode 9 , RAZ sur egal . en incr . et SET sur egal .
en decr .
TCCR1A = (1 < < COM1B1 ) +(1 < < WGM10 ) ; // 0 b00100001 ;

// TCCR1B : suite des bits de WGM et predivision = 1


TCCR1B =(1 < < WGM13 ) +(1 < < CS10 ) ; // 0 b00010001 ;

// OCR1A : valeur de Thash


OCR1A =10000;
// OCR1B : valeur tu Ton
OCR1B =5000;
while (1) ;
}

-2- Interruption de débordement du timer 1:


# define LedToggle PortB ^=1
volatile byte Compteur ;

ISR ( T IM E R1 _ OV F_ v ec t )
{ byte i ;
TCNT1 = 0;
if ( Compteur ++ == 50) {
Compteur =0;
LedToggle ; // mesurer la periode sur PB0

40
}
}

void configTimer1 () { //
TCCR1A = 0; // Mode normal
TCCR1B = 1 < < CS10 ; // clkio
TIMSK = 1 < < TOIE1 ;
}

int main () {
DDRB =0 xFF ;
configTimer1 () ;
sei () ; // autorise les interruptions
while (1) ;
}

3.3 Le timer 2
Les fonctions du timer 2 sont la génération de fréquences, le comptage, le mode raz de T CN T2 sur comparaison avec
rechargement automatique et la fonction génération de formes (waveform). Celle-ci permet les modes suivant :

• mode sans erreur ;


• mode PWM à phase correcte ;

3.3.1 Aperçu du timer 2

TOSC1
TCCR2
TOV2

Incrément Oscillateur
Logique de Prédiviseur
Raz Contrôle
Direction
TOP BOTTOM clkI/O TOSC2

TCNT2

=0xFF =0

= WaveForm OC2

IT OC2

OCR2

clkI/O
Drapeaux d'états synchronisés Unité de
synchronisation
clkASY
Drapeaux d'états

ASSR2
Sélection de mode asynchrone

Figure 3.6: Aperçu du timer 2

Le timer 2 est un compteur 8 bits aussi, T CN T2 et OCR2 sont des registres 8-bit. Les ITs sont visibles dans T IF R
et masquables dans T IM SK. Le timer peut être clocké de façon interne par le prédiviseur ou de façon asynchrone
par T OSC1 , T OSC2 . Cette synchronisation est contrôlée par le registre ASSR. Le block logique sélectionne la source

41
d’incrémentation. OCR2 est comparé à tout moment à T CN T2 et le test de cette égalité peut être utilisé à tout mo-
ment pour générer une forme de type PWM ou pour faire varier une fréquence sur OC2 . Le débordement genère sur une
interruption par le flag OCF2 On a BOT T OM = 0, M AX = 0xF F , de plus T OP peut être soit M AX soit la valeur placée
dans OCR2

Contrôle du comptage

TOSC1

TOV2

Incrément Oscillateur
clkT2
Logique de Prédiviseur
Raz Contrôle
Direction

TOP BOTTOM clkI/O TOSC2

TCNT2

Figure 3.7: Contrôle du comptage

• Comptage : incrémentation ou décrémentation ;

• clkT 2 horloge d’incrément


• T OP : signale que T CN T2 a atteint sa valeur haute ;
• BOT T OM : signale que T CN T2 a atteint 0 ;

Contrôle de la fréquence
• CS22 : 0 sélectionne la clock ;
• si CS22 : 0= 0 le timer est au repos ;
• W GM 21 W GM 21 ∈ T CCR2 permettent de déterminer la séquence de comptage.

3.3.2 Génération de forme : pulse, PWM,. . .

OCR2 TCNT2

=
OCF2

TOP
BOTTOM Générateur de OC2
FOC2 forme

WGM21:0 COM21:0

Figure 3.8: Génération de formes

42
OCR2 est un registre à buffer double en mode PWM . On n’a pas la double bufferisation en mode normal et CTC. Quand
on est en double buffer le CPU accède au buffer de OCR2 , quand ce mode est désactivé le CPU accède au registre lui-même.
Mise à jour du buffer et de OCR2 :
La mise à jour d’OCR2 est retardée au moment ou T CN T2 atteint soit T OP ou BOT T OM évitant ainsi de créer des PWM
non symétriques rendant la sortie "Glitch Free".
En mode non PWM , on peut forcer la comparaison par F OC2 si il y a égalité OC2 prend une valeur. C’est COM 21:0
qui définissent ce qui se passe alors sur OC2 (1, 0 ou commutation). Toute écriture du CPU bloque toute comparaison avec
T CN T2 ce qui permet de positionner une même valeur d’initialisation sur OCR2 et T CN T2 . Par contre, si on met une
valeur dans OCR2 égale à T CN T2 le test d’égalité va être perdu.

Unité de comparaison

COM21
COM20 Générateur D Q
FOC2 de forme
Clk

OC2

1
OC2
0

Bus interne D Q

Clk

PORT

D Q

Clk

DDR

clkI/O

Figure 3.9: Unité de comparaison

• COM 21:0 contrôle 2 fonctions :


– La sortie de comparaison du générateur de formes
– Ce que reçoit OC2 dans le cas ou l’un des deux bits est à un.
• Cette patte reçoit soit :
– La sortie du générateur de formes
– soit un bit d’un port , suivant la configuration du Port fixé par DDR

3.3.3 Les modes du timer 2


Les modes sont programmés par les bits W GM 21:0 et COM 21:0 . Les bits COM 21:0 contrôlent si la PWM est inversée ou
non. Pour les modes non PWM (tel que le mode comparaison), les bits COM 21:0 contrôlent aussi, si OCF2 doit être raz,mis
à un, ou commuté (toggle). Enfin, W GM 21:0 contrôlent les modes.

Mode normal W GM 21:0 = 0


Dans ce mode T CN T2 s’incrémente jusqu’a 0XF F puis recommence depuis 0. T OV2 passe à un quand T CN T2 retombe à
zero. T OV2 sert alors de 9ième bits, il sert aussi à déclencher une interruption . L’interruption est raz automatiquement
par l’exécution du sous-programme d’interruption et en mode non interruptif il faut faire une raz par une mise à un.

43
Mode Clear timer on Compare CTC : W GM 21:0 = 2
Dans ce mode OCR2 définit la résolution. T CN T2 est raz quand T CN T 2 devient égal à OCR2 qui définit la valeur T OP
(cf figure 3.3.3).

TCNT2

OC2
(Changement d'état)

Période 1 2 3 4

Figure 3.10: le timer 2 : Mode Clear timer on Compare

Interruption: Une interruption peut être générée à chaque T OP . Dans le sous-programme d’interruption on peut changer
le T OP . Attention : ne pas changer T OP avec une valeur à T CN T2

Fréquence
fclkI/O
fOC2 =
2.N.(1 + OCR2 )

Mode PWM a fréquence rapide avec W GM 21:0 = 3


C’est un mode à simple front. T OV2 est mis à un quand T CN T2 atteint M AXn l’interruption peut mettre à jour OCR2 .
T CN T2 compte de BOT T OM à M AX et repart de BOT T OM ; En mode non inversé, OC2 est raz sur égalité de T CN T2
et OCR2 , et mis à un sur BOT T OM

Fréquence
fclkI/O
fOC2 P W M =
N.(1 + OCR2 )

TOV2 TOV2 TOV2 TOV2 TOV2

OCF2 OCF2

TOV2 TOV2 TOV2


OCF2 OCF2 OCF2

TCNT2

OC2

Période 1 2 3 4 5

Figure 3.11: le timer 2 : Mode PWM rapide

Chronogramme de la PWM rapide

44
Le mode PWM à phase correcte
Dans ce mode W GM 21:0 = 1, on a une PWM à phase correcte. Elle est basée sur un mode double front. T OV2 est mis à
un quand T CN T2 atteint BOT T OM et l’interruption peut mettre à jour OCR2 T CN T2 compte de BOT T OM à M AX
et repart de M AX jusqu’a BOT T OM ;

inversé/non inversé En mode non inversé, en comptant OC2 est raz sur égalité de T CN T2 et OCR2 , tandis que en
décomptant, OC2 est mis à un sur sur égalité de T CN T2 et OCR2 . On a un mode ici symétrique : "phase correcte".

Fréquence
fclkI/O
fOC2 P W M =
2.N.(1 + OCR2 )

OCF2
OCF2 OCF2

TCNT2 TOV2 TOV2 TOV2

OC2

Période 1 2

Figure 3.12: le timer 2 : Mode PWM phase correcte

Chronogramme de la PWM à phase correcte

3.3.4 Les registres utiles au timer 2


Le registre T CCR2
Le registre T CCR2
F OC2 W GM2 COM 21 COM 20 CS22 CS21 CS20 T CCR2

Bit 7 : F OC2 : Force Output Compare F OC2 est actif quand on est pas en mode PWM . Cependant ce bit doit êtr
raz quand T CCR2 est mis à jour en mode PWM . Quand F OC2 ← 1 une comparaison immédiate est forcée selon la valeur
des bits de COM 21:0 OC2 sera mis à jour. F OC2 est un bit provoquant un échantillonnage.

Bit 6,3 : W GM 21:0 : Waveform Generation Mode Ces Bits contrôlent la séquence de comptage, le maximum et le
type de forme :

v W GM 21 W GM 20 M ode T OP maj OCR2 T OV2 ← 1?


0 0 0 Normal 0xF F Immédiatement M AX
1 0 1 PWM phase correcte 0xF F T OP BOT T OM
2 1 0 CTC OCR2 Immédiatement M AX
3 1 1 PWM rapide 0XF F BOT T OM M AX

45
Bit COM 21:0 : Compare Match Output Mode En mode de comparaison

COM 21 COM 20 description


0 0 OC2 est deconnectée du P
0 1 OC2 est commutée sur égalité
1 0 OC2 est raz sur égalité
1 1 OC2 est mise à un sur égalité

Bit COM 21:0 : Compare Match Output Mode En mode de comparaison et PWM rapide

COM 21 COM 20 description


0 0 OC2 est deconnectée du P
0 1 réservé
1 0 OC2 est raz sur égalité, mise à un sur BOT T OM
1 1 OC2 est mise à un sur égalité, raz sur BOT T OM

Bit 5:4 : COM 21:0 : Compare Match Output Mode En mode de comparaison et PWM à phase correcte
COM 21 COM 20 description
0 0 OC2 est deconnectée du P
0 1 réservé
1 0 OC2 est raz sur égalité en comptant, mise à un sur égalité en décomptant
1 1 OC2 est mise à un sur égalité en comptant, raz sur égalité en décomptant

Bit 2:0 : CS22:0 : Clock Select


CS22 CS21 CS20 description
0 0 0 pas d’horloge, le timer 2 est stoppé
0 0 1 clkI/O
0 1 0 clkI/O /8
0 1 1 clkI/O /32
1 0 0 clkI/O /64
1 0 1 clkI/O /128
1 1 0 clkI/O /256
1 1 1 clkI/O /1024

ASSR
Le registre ASSR
- - - - AS2 T CN 2UB OCR2UB T CR2UB

Bit AS2 : Asynchronous Timer/Counter2 Quand AS2 = 0, le timer 2 est cadencé par clkI/O Quand AS2 = 1, le timer
2 est cadencé par le quartz connecté à T OSC1

Bit T CN 2UB : Timer/Counter2 Update Busy Quand le timer 2 fonctionne en mode asynchrone, et que T CN T2 est
mis à jour alors T CN 2UB ← 1. Un niveau bas sur ce bit indique que T CN T2 est prêt à être mis à jour avec une nouvelle
valeur.

Bit 1 : OCR2UB : Output Compare Register2 Update Busy Quand le timer 2 fonctionne en mode asynchrone, et
que OCR2 est mis à jour alors OCR2UB ← 1. Un niveau bas sur ce bit indique que OCR2 est prêt à être mis à jour avec
une nouvelle valeur.

46
Bit 0 : T CR2U B : Timer/Counter Control Register2 Update Busy Quand le timer 2 fonctionne en mode
asynchrone, et que T CCR2 est mis à jour alors T CCR2UB ← 1. Un niveau bads sur ce bit indique que T CCR2 est prêt à
être mis à jour avec une nouvelle valeur.

Definition 3.3.1 Accès aux registres "busy" Si une écriture est réalisée sur un des trois registres : T CN T2 , OCR2 ou
T CCR2 alors que les flags correspondants sont busy alors on peut corrompre les calculs ou provoquer une interruption non
désirée.

Précautions sur le passage en mode asynchrone Lors des changements synchrones-asynchrones les valeurs des registres
T CN T2 , OCR2 ou T CCR2 peuvent être erronées. La procédure de change vers le mode asynchrone est la suivante :
• Désactiver les interruptions relatives à le timer 2 par raz de OCIE2 et OCIE2
• Sélectionner la source avec AS2
• Ecrire les nouvelles valeurs dans T CN T2 , OCR2 ou T CCR2
• Passer en mode Asynchrone : Attendre que les bits T CN 2UB , OCR2UB ou T CR2UB passe de "busy" à "libre" (valeur
0).
• raz les flags d’interruption relatifs à le timer 2
• Ré-autoriser les IT s
• L’oscillateur est optimisé pour utiliser un quartz de 32, 768 khz.
• Attention la fréquence du quartz principal doit être au moins 4 fois supérieure à celle du quartz que l’on utliserait en
mode asynchrone connecté à T OSC1 .
• Lors d’une écriture dans T CN T2 , OCR2 ou T CCR2 , la nouvelle valeur passe par T EM P et n’est accessible que après
deux fronts positifs sur T OSC1 . Il faudra à l’utilisateur scruter les bits "busy" déjà évoqués avant d’écrire de nouvelles
valeurs.

3.3.5 Les interruptions du timer 2


3.3.6 T IM SK
• Bit 7 : OCIE2 : Timer/Counter2 Output Compare Match Interrupt Enable
Quand OCIE2 ← 1 et que I = 1(∈ SREG) alors l’interruption de comparaison du timer 2 est active. Si une égalité
entre T CN T2 et OCR2 se produit alors OCF2 ← 1(∈T IF R)
• Bit 6 : OCIE2 : Timer/Counter2 Overflow Interrupt Enable
Quand T OIE2 ← 1 et que I = 1(∈ SREG) l’interruption de débordement est active et T OV2 ← 1(∈ T IRF )

3.3.7 TIFR
• Bit 7 : OCF2 : Output Compare Flag 2
OCF2 ← 1 quand une égalité de comparaison se produit entre T CN T2 et OCR2 .
– OCF2 ← 1 par le hard dans le sous-programme d’interruption.
– Sinon, OCF2 ← 0 en écrivant un un.
– C’est quand on a I = 1(∈ SREG) et T OCIE2 =1 et OCF2 = 1 que le sous-programme d’interruption est exécuté.
• Bit 6 :T OV2 : Timer/Counter2 Overflow Flag

– T OV2 ← 1 quand un overflow se produit.


– T OV2 ← 0 par le hard dans le sous-programme d’IT.
– Sinon, T OV2 ← 0 en écrivant un un.
• C’est quand on a I = 1(∈ SREG) et T OIE2 = 1 et T OV2 =1 que le sous-programme d’IT est exécuté.

47
• En mode PWM ce bit reçoit un quand il y a un changement de direction à 0x00
Exemple d’utilisation du timer 2 avec la mise en place d’une interruption de débordement :
# define LedToggle PortB ^=1
volatile byte Compteur ;

ISR ( T I ME R2 _ OV F_ v ec t )
{ byte i ;
TCNT2 = 0;
if ( Compteur ++ == 50) {
Compteur =0;
LedToggle ; // mesurer la periode
}
}

void configTimer2 () {
TCCR2A = 0; // Mode normal
TCCR2B = (1 < < CS22 ) + (1 < < CS21 ) ; // clkio /256 est incremente toutes les 16 uS
TIMSK2 = 1 < < TOIE2 ; // TOIE2
}
int main () {
DDRB =0 xFF ;
configTimer2 () ;
sei () ; // autorise les interruptions
while (1) ;
}

48
Chapter 4

La programmation

4.1 Langage C
4.1.1 Structure d’un programme
Un programme C est composé de trois parties. Les entêtes, les fonctions nécessaires et le programme principal (main).
// - - - - - - - - - - - - - - - - ENTETE - - - - - - - - - - - - - - - - - - - - - - - - - -
# include < avr / io .h >
# define F_CPU 12 E6 // reglage fclkIO sur fquartz
# include < util / delay .h > // utilisation de _delay_ms
# include < avr / interrupt .h >
# define Max_del 262
// - - - - - - - - - - - - - - - - FONCTIONS - - - - - - - - - - - - - - - - - - - - - -
void sleep ( int dzs ) {
int i =0;
for ( i =0; i <10* dzs ; i ++) _delay_ms (10) ;
}
// - - - - - - - - - - - - - - - - MAIN - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int main ( void )
{
DDRC = 0 x00 ; // \ pc \ en entree
DDRB = 0 x01 ; // PB0 en sortie
DDRD = 0 b1111011 ; // Port D en sortie , PORTD2 en entree
do {
sleep (10) ;
} while (1) ;
return (1) ;
}

4.1.2 Entête
Sous l’IDE Arduino , il n’y a pas besoin d’inclure de bibliothèques, et par contre, on peut y définir des constantes non
modifiables ou des fichiers à inclure.
# define Max_del 262
# include " mesfonctions . c " // Inclusions de fichier c
# include " interface . h " // Inclusion de bibliotheque utilisateur

4.1.3 Main
Un main commence par des initialisations et se termine généralement par une boucle infinie :

49
void fonction1 () {...}
int fonction1 () { int a ; ... ; return a }
int main ( void )
{
DDRC = 0 x00 ; // PORTC en entree
DDRB = 0 x01 ; // PB0 en sortie
DDRD = 0 b1111011 ; // PORTD en sortie , PD2 en entree
int j ;
do {
sleep (10) ;
fonction1 () ;
j = fonction2 () ;
} while (1) ;
return (1) ;
}

4.1.4 Fonctions
Elles apparaissent de préférence (sinon on mettra les prototypes) avant le main :

void sleep ( int dzs ) {


int i =0;
for ( i =0; i <10* dzs ; i ++) _delay_ms (10) ;
}

void entier ( int nbtours , int sens ) { // passage de variables


int i , j ;
int Tentier [4]={1 ,2 ,4 ,8};

for ( j =0; j < nbtours *12; j ++) {


for ( i =3; i >=0; i - -) {
delai2 () ;
PB = Tentier [ i ];
}
}
}

4.1.5 Déclaration de variable globales


Pour les variables globales, on utilisera l’attribut volatile qui est une directive qui indique au compilateur de déclarer une
variable dans la RAM et non dans la zone de registre. Cette zone peut produire, en effet, des modications de variables
inattendus. On pourra aussi utiliser cet atribut pour les variables des sous-programmes d’IT.
Cet attribut dégradu temps d’accés à la variable.
volatile int F ;

void delai () {
int i , deltaT = F ;
for ( i =0; i <= deltaT ; i ++) _delay_ms (1) ;
}

int main ( void ) {


F =10;
DDRB =0 x1F ;

50
DDRC =0 x00 ;

do {
PB ^=1;
delai () ;
} while (1) ;
return (0) ;
}

4.1.6 Fonction de manipulation de bits


• Mise à un par masque avec opérateur “ou” |:
• Mise à zéro par masque avec opérateur “et” &:
• Inversion avec opérateur “xor” ∧:

// Mise a zero des 4 bits de poids faible


PORTB = PORTB & 0 xF0 ; // ou bien
PORTB &= 0 xF0 ;

// Mise a un des 4 bits de poids faible d ’ un port


PORTB = PORTB | 0 x0F // ou bien
PORTB |= 0 xF0 ;

// Le Pipe : On utilise un pipe quant on veux modifier un registre


// Si l ’ on veux simplement initialiser un registre on utilise l ’ affectation ’= ’
// Mise a un du bit 4 de PORTD et seulement lui !
PORTD |= 1 < < PORTD4 ;

// Mise a zero du bit PORTD4 et seulement lui !


PORTD &= ~(1 < < PORTD4 ) ;

// Commutation du bit PORTD4 et seulement lui !


PORTD ^= (1 < < PORTD4 ) ;

4.1.7 Mise en oeuvre d’une interruption


On utilise la directive ISR qui associe un évènement à du code :
ISR ( TIMER0_OVF_vect ) { // routine d ’ interruption
PORTD = PORTD ^0 x10 ; // Commutation du but num 4
TCNT0 =0;
}
int main ( void )
{
DDRD = 0 b1111011 ; // Port D en sortie , PORTD2 en entree
TCNT0 = 0; // valeur initiale du compteur
TCCR0 = 5; // facteur de predivision de clk / IO
sei () ; // Toutes les ITs sont possibles
TIMSK |= (1 < < TOIE0 ) ; // Validation de l ’ It de debordement
do {} while (1) ;
return (1) ;
}

51
4.2 Interruptions
Nom de l’interruption Description
ADC_vect ADC Conversion Complete
ANALOG_COMP_0_vect Analog Comparator 0
ANALOG_COMP_1_vect Analog Comparator 1
ANALOG_COMP_2_vect Analog Comparator 2
ANALOG_COMP_vect Analog Comparator
ANA_COMP_vect Analog Comparator
EE_RDY_vect EEPROM Ready
EE_READY_vect EEPROM Ready
EXT_INT0_vect External Interrupt Request 0
INT0_vect External Interrupt 0
INT1_vect External Interrupt Request 1
IO_PINS_vect External Interrupt Request 0
LCD_vect LCD Start of Frame
LOWLEVEL_IO_PINS_vect Low-level Input on Port B
OVRIT_vect CAN timer Overrun
PCINT0_vect Pin Change Interrupt Request 0
PCINT1_vect Pin Change Interrupt Request 1
PSC0_CAPT_vect PSC0 Capture Event
PSC0_EC_vect PSC0 End Cycle
PSC1_CAPT_vect PSC1 Capture Event
PSC1_EC_vect PSC1 End Cycle
PSC2_CAPT_vect PSC2 Capture Event
PSC2_EC_vect PSC2 End Cycle
SPI_STC_vect Serial Transfer Complete
SPM_RDY_vect Store Program Memory Ready
SPM_READY_vect Store Program Memory Read
TIM0_COMPA_vect Timer/Counter Compare Match A
TIM0_COMPB_vect Timer/Counter Compare Match B
TIM0_OVF_vect Timer/Counter0 Overflow
TIMER0_CAPT_vect ADC Conversion Complete
TIMER0_COMPA_vect TimerCounter0 Compare Match A
TIMER0_COMPB_vect timer Counter 0 Compare Match B
TIMER0_COMP_A_vect Timer/Counter0 Compare Match A
TIMER0_COMP_vect Timer/Counter0 Compare Match
TIMER0_OVF0_vect Timer/Counter0 Overflow
TIMER0_OVF_vect Timer/Counter0 Overflow
TIM1_CAPT_vect Timer/Counter1 Capture Event
TIM1_COMPA_vect Timer/Counter1 Compare Match A
TIM1_COMPB_vect Timer/Counter1 Compare Match B
TIM1_OVF_vect Timer/Counter1 Overflow
TIMER1_CAPT1_vect Timer/Counter1 Capture Event
TIMER1_CAPT_vect Timer/Counter Capture Event
TIMER1_CMPA_vect Timer/Counter1 Compare Match 1A
TIMER1_CMPB_vect Timer/Counter1 Compare Match 1B
TIMER1_COMP1_vect Timer/Counter1 Compare Match
TIMER1_COMPA_vect Timer/Counter1 Compare Match A
TIMER1_COMPB_vect Timer/Counter1 Compare MatchB
TIMER1_COMPC_vect Timer/Counter1 Compare Match C
TIMER1_COMPD_vect Timer/Counter1 Compare Match D
TIMER1_COMP_vect Timer/Counter1 Compare Match
TIMER1_OVF1_vect Timer/Counter1 Overflow
TIMER1_OVF_vect Timer/Counter1 Overflow

52
Nom de l’interruption Description
TWI_vect 2-wire Serial Interface
TXDONE_vect Transmission Done, Bit timer Flag 2 Interrupt
TXEMPTY_vect Transmit Buffer Empty, Bit Itmer Flag 0 Interrupt
UART0_RX_vect UART0, Rx Complete
UART0_TX_vect UART0, Tx Complete
UART0_UDRE_vect UART0 Data Register Empty
UART1_RX_vect UART1, Rx Complete
UART1_TX_vect UART1, Tx Complete
UART1_UDRE_vect UART1 Data Register Empty
UART_RX_vect UART, Rx Complete
UART_TX_vect UART, Tx Complete
UART_UDRE_vect UART Data Register Empty
USART0_RXC_vect USART0, Rx Complete
USART0_RX_vect USART0, Rx Complete
USART0_TXC_vect USART0, Tx Complete
USART0_TX_vect USART0, Tx Complete
USART0_UDRE_vect USART0 Data Register Empty
USART1_RXC_vect USART1, Rx Complete
USART1_RX_vect USART1, Rx Complete
USART1_TXC_vect USART1, Tx Complete
USART1_TX_vect USART1, Tx Complete
USART1_UDRE_vect USART1, Data Register Empty
USART2_RX_vect USART2, Rx Complete
USART2_TX_vect USART2, Tx Complete
USART2_UDRE_vect USART2 Data register Empty
USART3_RX_vect USART3, Rx Complete
USART3_TX_vect USART3, Tx Complete
USART3_UDRE_vect USART3 Data register Empty
USART_RXC_vect USART, Rx Complete
USART_RX_vect USART, Rx Complete
USART_TXC_vect USART, Tx Complete
USART_TX_vect USART, Tx Complete
USART_UDRE_vect USART Data Register Empty
USI_OVERFLOW_vect USI Overflow
USI_OVF_vect USI Overflow
USI_START_vect USI Start Condition
USI_STRT_vect USI Start
USI_STR_vect USI START
WATCHDOG_vect Watchdog Time-out
WDT_OVERFLOW_vect Watchdog timer Overflow
WDT_vect Watchdog Timeout Interrupt

53

Vous aimerez peut-être aussi