Professional Documents
Culture Documents
Microcontrleurs
bertrand.cottenceau@univ-angers.fr
1/23
1 Introduction
Le modle UNO de la socit ARDUINO est une carte lectronique dont le coeur est un
microcontrleur ATMEL de rfrence ATMega328. Le microcontrleur ATMega328 est un
microcontrleur 8bits de la famille AVR dont la programmation peut tre ralise en langage C.
L'intrt principal des cartes ARDUINO (d'autres modles existent) est leur facilit de mise en
oeuvre. ARDUINO fournit un environnement de dveloppement s'appuyant sur des outils opensource. Le chargement du programme dans la mmoire du microcontrleur se fait de faon trs
simple par port USB. En outre, des bibliothques de fonctions "cl en main" sont galement
fournies pour l'exploitation d'entres-sorties courantes : gestion des E/S TOR, gestion des
convertisseurs ADC, gnration de signaux PWM, exploitation de bus TWI/I2C, exploitation de
servomoteurs ...
L'objectif de ce document est de mettre en vidence certaines informations techniques concernant
l'exploitation des priphriques intgrs, en particulier lorsqu'on n'utilise pas les fonctions "cl en
main" d'ARDUINO, dans l'objectif de comprendre comment a marche !
2 Schma simplifi de la carte Arduino UNO
Les signaux d'entre-sortie du microcontrleur sont relis des connecteurs selon le schma cidessous.
Microcontrleurs
2/23
Microcontrleurs
3/23
Microcontrleurs
4/23
Direction des ports : si le bit DDRB.2 vaut 1 alors la broche PB2 est une sortie TOR.
Ecriture des sorties TOR : si une broche est configure en sortie (DDRx.n=1) alors l'criture du bit
PORTx.n permet de dfinir l'tat de la sortie (0 ou 1).
Ex : DDRB.5=1 (donc PB5 en sortie) crire 0 ou 1 dans le bit PORTB.5 permet de dfinir l'tat de
la sortie PB5.
Lectures des entres TOR : si une broche est configure en entre (DDRx.n=0) alors la lecture du
bit PINx.n permet de connatre l'tat de l'entre.
Ex : DDRB.4=0 (donc PB4 en entre), lire PINB.4 permet de connatre l'tat de l'entre PB4.
Si PUD=1 ALORS toutes les resistances de pull-up -interne de tous les ports dsactives
Microcontrleurs
5/23
4.3.1
Interruptions Externes
Microcontrleurs
6/23
Note : Pour l'interruption INT1, les bits ISC11 et ISC10 ont le mme sens que ci-dessus.
Activation des interruptions INT0/INT1 = bit SREG.7 (I)=1 et mise 1 de EIMSK.0/EIMSK.1
Flags internes = lorsqu'une cause d'IT est dtecte, un flag interne de EIFR est positionn
Exemple : on souhaite qu'un front ngatif sur INT1 (PD3) conduise une interruption INT1. Il
faut donc
SREG.7=1 (bit gnral d'activation des IT, sans lui aucune IT)
EIMSK.1 (INT1)= 1 (pour prise en compte des IT INT1)
EICRA.2(ISC10)=0 ET EICRA.3(ISC11)=1 (IT sur front ngatif sur INT1)
Broches PCINT0 PCINT23 : configurables pour dclencher des interruptions (n 4,5 et 6) sur
des changements d'tat ("Pin Change") des broches (configures en entre DDRx.n=1). Les broches
sont spares en 3 sous-groupes, il y a une source d'interruption par sous-groupe, et pour chaque
broche on peut activer ou non le systme "Pin Change Interrupt"
L'interruption PCI2 (IT n6) a lieu sur changement d'tat de l'une des broches PCINT23..16,
l'interruption PCI1 (IT n5) sur les changements d'tat de PCINT14..8, et l'interruption PCI0 (IT
n4) a lieu sur les changements d'tat des broches PCINT7..0. Les registres PCMSK2, PCMSK1
and PCMSK0 contrlent quelles broches peuvent conduire (ou non) une interruption de type "pin
change".
Activation des interruptions PCINT0 PCINT23 = bit SREG.7 (I)=1 et mise 1 de PCIEx
Microcontrleurs
7/23
Exemple : on souhaite qu'un changement d'tat de la broche PCINT2 (PB2) conduise une
interruption PCIE0. Il faut donc
SREG.7=1 (bit gnral d'activation des IT, sans lui aucune IT)
PCICR.0 = PCIE0=1 (pour que le sous-groupe 0 puisse conduire IT)
PCMSK0.2 = PCINT2 = 1 (pour que la broche PCINT2 soit prise en compte)
4.3.2
Interruptions Timers
Microcontrleurs
8/23
9/23
C'est un module Timer/Counter avec registre de comptage 8 bits. En utilisant l'IDE Arduino,
le timer 0 est implicitement utilis par les fonctions de delay (ainsi que l'interruption
correspondante). Ce module Timer/Counter n'est donc pas utilisable directement avec la carte
ARDUINO.
4.4.2
Microcontrleurs
10/23
Microcontrleurs
11/23
Selon le mode choisi par les bits WGM0:2 on a les options suivantes (mode PWM Phase
correct non dcrit)
Bits 7:6 COM2A1:0: Compare Match Output A Mode. Ces bits configurent le rle de la broche
OC2A/PB3. Si l'un des bits COM2A1:0 vaut 1, la broche OC2A a une fonction alternative (associe au
module Timer/Counter 2). Nanmoins, le registre DDR doit tre tel que OC2A/PB3 soit une sortie (cf 4.2).
Table 17-2 : Mode Normal ou CTC (non-PWM mode)
Microcontrleurs
12/23
4.4.3
Le registre de comptage TCNT1, ainsi que les registres de comparaison OCR1A et OCR1B, sont
cette fois-ci sur 16 bits.
Note: en langage d'assemblage, il faut deux accs 8 bits pour lire/crire ces registres 16 bits. En
langage C, on peut manipuler symboliquement des donnes 16 bits via les symboles TCNT1,
OCR1A et OCR1B sans se soucier de la faon dont le code sera gnr.
Microcontrleurs
13/23
Microcontrleurs
14/23
Selon le mode choisi par les bits WGM10:3 on a les options suivantes (mode PWM Phase
correct non dcrit)
Microcontrleurs
15/23
Microcontrleurs
16/23
5 Exemples
On fournit ici quelques exemples simples tests avec la carte ARDUINO UNO.
5.1.
Microcontrleurs
17/23
5.2.
Types/Taille :
boolean : true/false (8 bits)
char = entier 8 bits sign [-128,+127] (stocke aussi des codes ASCII)
byte / unsigned char : entiers 8 bits non signs [0,255]
Note: des constantes sont dfinies et permettent d'crire
byte b = B10010;
void loop()
{
digitalWrite(13,HIGH); // set PB5
delay(200);
// dlai 200 ms
digitalWrite(13,LOW);
// clear PB5
delay(1000);
// dlai 1 s
}
L'exemple le plus simple, fourni par ARDUINO, consiste faire clignoter la LED raccorde la
broche PB5 du microcontrleur, broche galement disponible sur les connecteurs de la carte et
portant le numro 13.
La fonction setup() configure la broche PB5 (connexion n13 sur la carte) en sortie.
La fonction loop() dcrit ce qui sera rpt indfiniment : mettre PB5 1 pendant 200ms puis
mettre PB5 0 pendant 1s, et ainsi de suite.
Fonctions utiles fournies par ARDUINO
Constantes : HIGH, LOW, INPUT, OUTPUT
Digital I/O
pinMode(pin,mode) : pin = numro sur connecteur, mode = INPUT/OUTPUT
digitalWrite(pin,value) : pin = numro sur connecteur, value= HIGH/LOW
int digitalRead(pin) : pin = numro sur connecteur, retourne la valeur
Temporisations
delay(unsigned long ms) : delai de ms milli secondes avec ms sur 32 bits
delayMicroseconds(unsigned int ms) : delai de ms microsecondes avec ms sur 16 bits
unsigned long micros() : nombre de micro secondes depuis dmarrage. Revient zro tous
les 70mn environ.
unsigned long millis() : nombre de milli secondes depuis dmarrage. Revient zro tous
les 50 jours environ.
Microcontrleurs
18/23
Remarques :
Les exemples ATMega328 en langage C trouvs sur internet utilisent des "styles" d'criture parfois
droutants. Notamment, lors de la gestion des ports I/O, on doit souvent faire des oprations
logiques (&,|,~,^) pour mettre des bits 0, 1 ou inverser des bits.
Certaines critures peuvent tre droutantes, par exemple
PORTB &= ~(1<<PORTB5);
Microcontrleurs
19/23
}
void loop() {
// aucun traitement
Microcontrleurs
20/23
sei();
void loop() {
Microcontrleurs
21/23
le nom de la source d'interruption est un symbole dfini parmi les valeurs suivantes
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
INT0_vect
INT1_vect
PCINT0_vect
PCINT1_vect
PCINT2_vect
WDT_vect
TIMER2_COMPA_vect
TIMER2_COMPB_vect
TIMER2_OVF_vect
TIMER1_CAPT_vect
TIMER1_COMPA_vect
TIMER1_COMPB_vect
TIMER1_OVF_vect
TIMER0_COMPA_vect
TIMER0_COMPB_vect
TIMER0_OVF_vect
SPI_STC_vect
USART_RX_vect
USART_UDRE_vect
USART_TX_vect
ADC_vect
EE_READY_vect
ANALOG_COMP_vect
TWI_vect
_VECTOR(1)
_VECTOR(2)
_VECTOR(3)
_VECTOR(4)
_VECTOR(5)
_VECTOR(6)
_VECTOR(7)
_VECTOR(8)
_VECTOR(9)
_VECTOR(10)
_VECTOR(11)
_VECTOR(12)
_VECTOR(13)
_VECTOR(14)
_VECTOR(15)
_VECTOR(16)
_VECTOR(17)
_VECTOR(18)
_VECTOR(19)
_VECTOR(20)
_VECTOR(21)
_VECTOR(22)
_VECTOR(23)
_VECTOR(24)
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
// aucun traitement }
Pour le programme prcdent, on branche un bouton poussoir entre PD2 et la masse GND
(numro 2 et 7 sur connecteur de la carte ARDUINO UNO).
Quand on enfonce le bouton poussoir, on force l'entre 0. On utilise ici la rsistance de pull-up
interne pour retirer le niveau 1 quand le bouton est relch.
Principe : chaque fois qu'on fait passer le niveau de 1 0 sur l'entre INT0(PD2), la fonction
d''interruption associe INT0 est excute. Cette action a pour effet d'inverser l'tat de la LED.
Microcontrleurs
22/23
Configuration
PORTB.5 en sortie = gestion de le LED
PORTD.2 en entre avec pull-up interne active = gestion du bouton poussoir
soit DDRD.2=0 ET PORTD.2=1 (cf 4.2 DIGITAL I/O)
Autorisation de la source d'IT INT0 : EIMSK= (0000 0001)b
Interruption sur front ngatif sur INT0 : EICRA= (0000 0010)b soit ISC01=1 ISC00=0
Interruption "PIN CHANGE"
Cette interruption a lieu sur un changement d'tat d'une des broches PCINTxx. On connecte
un bouton poussoir entre AI5 (entre analogique 5 PC5/PCINT13) et GND. Ca correspond la
source PCINT13 ("Pin Change 13").
Chaque changement d'tat sur la broche PC5 conduit l'interruption PCINT1. Attention,
l'interruption PCINT1 correspond tout changement d'tat sur les broches PCINT8 PCINT14
pour lesquelles le bit correspondant dans PCMSK1 est 1.
}
void loop() {
// aucun traitement
Remarque : sur AVR, une fonction d'interruption ne peut pas elle-mme tre interrompue.
Microcontrleurs
23/23