GE Micro8bits Poly
GE Micro8bits Poly
David Delfieu
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
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
ICP1 Patte du timer 1 sur laquelle on peut réaliser une entrée de capture (P B0 ). 33
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.
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 .
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.2 Architecture
L’architecture du microcontrôleur est illustrée dans la figure suivante :
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
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)
Mémoire Flash 8ko Mémoire SRAM (Données) 1024 o Mémoire EEprom 512 o
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
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
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é :
Signal d'horloge
XTAL1 XTAL1
16Mhz
XTAL2 XTAL2
GND GND
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
TOSC2
+5 V
R XT AL2
XT AL1
GND
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
10
d’interruptions : Les interruptions internes lièes aux timers, à l’ADC, . . . ou des interruptions externes.
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
• MCUCR :
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
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.
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
TOSC2
13
1.4.2 Résistance de tirage : Pull-up resistor
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);
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)
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
• P ORT C est un port d’entrée-sortie bidirectionnel de 7 bits avec des résistances de pulll up.
• 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
• 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
// Mise a un des 4 bits de poids faible sans affecter les autres bits
PORTB = PORTB | 0 x0F // ou
PORTB |= 0 x0F ;
16
Chapter 2
Conversion Analogique
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 :
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).
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.
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 :
Programmation
L’ensemble des registres à programmer l’ADC est ADM U X, ADCSRA, ADCH, ADCL, étudions ADEN ADSC ADAT E ADIF
(ADCSRA) :
• 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.
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 ??).
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
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:
- - - - - - ADC9 ADC8
ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
int L = ADCL;
int H = ADCH;
int res = (H<<8)+L;
-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
}
-2- Mode échantillonné : On réalise ici, un déclenchement échantillonée par le timer 1, de la conversion analogique
volatile int F ;
-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 ;
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
Détecteur de Contrôle
Pattes
Front Logique
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
25
• Générateur de fréquences
• Comptage d’événements externes
• Pré-diviseur d’horloge 10 bits
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 :
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
• 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é.
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.
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
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
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 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.
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
Compatareur
ACO
Analogique
ICP1
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.
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
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.
Temp
OCR1H OCR1L
OCR1
OFF1A/B
TOP
BOTTOM Générateur de formes OC1A/B
WGM13:0 COM11:0
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
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 )
Attention à ne pas changer la valeur T OP avec une valeur inférieure à la valeur courante du comparateur OCR1A .
Sortie
• En mode non inversé, la sortie est raz sur égalité avec OCR1A et mise à un sur BOT T OM .
34
Changement de OCR1A (ou ICR1) ou de TOP
OCR1A
TCNT1
OC1A
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.
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
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é
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.
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é.
Le registre T CCR1A
COM1A1 COM1A0 COM1B1 COM1B0 F OC1A F OC1B W GM11 W GM10
37
Bits COM 1x1, COM 1x0 en mode fast PWM
Bits COM 1x1, COM 1x0 en mode PWM à phase correcte et PWM à phase et fréquence correcte
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.
38
Bit CS12:0 Clock Select Ces trois bits sélectionnent la prédivision : division de Cllkio par N = (1, 8, 64, 256, 1024).
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
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.
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 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 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.
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.
// TCCR1A : Mli centree : Mode 9 , RAZ sur egal . en incr . et SET sur egal .
en decr .
TCCR1A = (1 < < COM1B1 ) +(1 < < WGM10 ) ; // 0 b00100001 ;
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 :
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
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
TCNT2
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.
OCR2 TCNT2
=
OCF2
TOP
BOTTOM Générateur de OC2
FOC2 forme
WGM21:0 COM21:0
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
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
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 )
Fréquence
fclkI/O
fOC2 P W M =
N.(1 + OCR2 )
OCF2 OCF2
TCNT2
OC2
Période 1 2 3 4 5
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
OC2
Période 1 2
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 :
45
Bit COM 21:0 : Compare Match Output Mode En mode de comparaison
Bit COM 21:0 : Compare Match Output Mode En mode de comparaison et PWM rapide
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
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.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
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 delai () {
int i , deltaT = F ;
for ( i =0; i <= deltaT ; i ++) _delay_ms (1) ;
}
50
DDRC =0 x00 ;
do {
PB ^=1;
delai () ;
} while (1) ;
return (0) ;
}
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