Vous êtes sur la page 1sur 41

Microcontrôleurs

EI3 2018-2019
(partie 2)
Un circuit très simple à base de
microcontrôleur
Alimentation

Quartz (horloge) + 2 condensateurs


pour cadencer le microcontrôleur

Le reste constitue l’électronique d’interface pour


exploiter les entrées et les sorties.

LE PROGRAMME est ici DANS le microcontrôleur


Chaîne de développement
1) Edition programme en C (sur un PC)

2) Cross-compilation → code machine

3) Chargement du code machine dans la


mémoire de programme du microcontrôleur
Structure d’un microcontrôleur
• Un processeur (8 bits, 16 bits ou 32 bits)
processeur 8bits  opérations 8 bits
• De la mémoire de programme non volatile
– ROM, OTP, EPROM, Flash
• De la mémoire volatile (RAM) de données
– Généralement très peu (maxi 1 à 4 ko)
• Des périphériques variés
E/S binaires (TOR), ADC, PWM, Timers, I2C,
Interruptions …
TP en EI3
• Cartes ARDUINO / ATMEGA328 (8bits)
• Programmation en C / chargement via USB
• Exploitation de quelques périphériques
Périphériques Standards
• Survol des entrées-sorties courantes sur un
microcontrôleur (principes d'utilisation)
• E/S TOR, Interruptions, Timers, PWM,
ADC, …
• Illustrations ATMEGA328 (pour TPs)
Entrées-Sorties Tout Ou Rien
(Digital I/O)
• La plupart des broches gèrent des
entrées/sorties TOR
PORTS E/S
• Port E/S = regroupement d'E/S TOR
• PORTB, PORTC, PORTD sur ATMEGA
broches PBx PCx PDx
Carte Arduino UNO
Registres / PORTS
• E/S TOR via des registres
void setup()
{
DDRB |= 0x20; // DDRB.5 <- 1
PORTB &= 0xDF; // PORTB.5 <- 0
}
void loop()
{
PORTB |= 0x20; // PORTB.5 <- 1
delay(200); // 200 ms
PORTB &= 0xDF;; // PORTB.5 <- 0
delay(1000); // 1s
}
Que peut-on exploiter avec des
E/S TOR ?
• LEDs, interrupteurs, boutons poussoirs,
afficheurs 7 segments, afficheurs LCD …

• Exemples simples : gestion de LEDS et de


switchs
Interruptions (IT)

• Qu'est-ce que c'est ?


Permet d'exécuter un traitement (ISR) suite
à un événement E.

Quand E a lieu → ISR(...) exécutée


ISR Interrupt Service Routine

• Le programme en cours est


INTERROMPU/ SUSPENDU
Quels événements E peuvent
conduire à une interruption ?
Exemples Arduino UNO/ATMEGA 328 :
• Fronts sur les broches INT0(PD2)/INT1(PD3)
• Changement d'état d'une entrée (Pin Change)
concerne toutes les broches PCINT0 - PCINT23
• Evénement lié à un timer (débordement, ...)
• Réception d'un octet en série
• Fin de conversion Analogique/Numérique
A quoi ça sert ?
• Sans interruption, tout est séquentiel

• Avec les interruptions, l'exécution des ISR


asynchrone

→ Délai très court entre E et ISR(E)


Mais l'ISR doit être brève
Exemple ATMEGA
//table des ISR p13
ISR(INT0_vect) // ISR associée à INT0
{
PORTB ^= 0x10;
}

void setup()
{ // configurations IT sur 1->0/INT0
...
}

void loop() // permanent interruptible


{
...
}
On peut gérer plusieurs IT
ISR(INT0_vect) // ISR associée à INT0
{
PORTB ^= 0x10;
}
ISR(INT1_vect) // ISR associée à INT1
{
PORTB ^= 0x01;
}

void setup(){
// configurations IT sur 1->0/INT0
... // configurations IT sur 0->1/INT1
}

void loop{ ... }


IT sur l'ATMEGA (table p13)
• Événements sur les broches INT0/INT1
• Changements d'état sur PCINTxx
• 3 sources d'IT par Timer [3 timers 0,1 et 2]
– Timer 0 utilisé par Arduino pour delay( )
• etc … plus de 20 en tout
// Exemple : exploitation IT Externe 0 p15

ISR(INT0_vect){ PORTB ^= 0x20; }

void setup(){
cli(); // désactive les IT en général
DDRB |= 0x20; PORTB &= ~0x20;
DDRD &= ~0x04; PORTD |= 0x04;

EICRA = 0x02; // IT si front


EIMSK |= 1; // source INT0 activée
sei(); // active les IT en général
}
void loop() { … }
// Exemple p17 IT Pin Change
void setup(){
cli();
DDRB&=~0x03; DDRD&=~0x0A; //PB1,PB0,PD7,PD5 entrée
PCICR |= 0x05; // Pin Change sur port D et port B
PCMSK0=0x03; // Pin Change broches PB0 et PB1
PCMSK2=0xA0; // Pin Change broches PD7 et PD5
sei();
}
void loop(){ …}

ISR(PCINT0_vect)// Pin Change sur PB1 ou PB0


{ ... }
ISR(PCINT2_vect)// Pin Change sur PD7 ou PD5
{ ... }
Les Timers/Counters

• Modules pour compter des fronts


sur une entrée ou des cycles
d'horloge
– Sur Arduino UNO : horloge
à 16 Mhz
Qu'est-ce qu'un Timer ?
• Le microcontrôleur est «cadencé» par une
horloge (à quartz)
• Sur Arduino UNO 16Mhz
Qu'est-ce qu'un Timer ?
Un timer compte, dans un registre 8 bits ou
16 bits, les cycles de l'horloge (ou d'une
division de l'horloge)

→ mesure l'écoulement du temps


IT timers ATMega328
• IT sur débordement (OVERFLOW)
ISR(TIMER2_OVF_vect){ … }
sur 8 bits → passe de (FF)h à (00)h (timer2)
sur 16 bits → passe de (FFFF)h à (0000)h (timer1)

• IT sur « COMPARE MATCH »


ISR(TIMER2_COMPA_vect){ … }
ISR(TIMER2_COMPB_vect){ … }
Timers 8 bits de l'ATMEGA
• Ex : comptage 8 bits, horloge 16MHz.
Si le timer compte des cycles horloge,
combien de temps entre 2 débordements ?
Si l'on associe une fonction d'interruption
au débordement timer, cette fonction sera
donc exécutée périodiquement
Quelques configurations des
Timers ATMEGA
• Timer 8 bits avec prescaler
• Timer 16 bits avec prescaler
• Timer 8 bits avec comparaison
Timers ATMega Horloge + prescaler

Registre comptage

Entrée de
comptage
Registres comparaison

Broches gérées
Par timer(PWM)
Schéma de principe ATMega328
Prescaler Timer 2 (p.22)
TCNTn
Clk Clk/presc. (reg. compteur)
(16Mhz)
prescaler
TCNT2 = 8bits

Prescaler Timer 1 (p.29)

TCNT1 = 16bits
prescaler
IT Timer 2 Overflow (p24)

volatile unsigned char cpt=0; // compteur d'IT

ISR(TIMER2_OVF_vect) //IT si débordement TCNT2


{ cpt++;
if(cpt==61){ PORTB ^=0x20; cpt=0; }
}
void setup(){
DDRB |= 0x20; PORTB &= ~0x20;
cli();
TCCR2A=0; // Mode Normal (pas PWM)
TCCR2B=0x07; // Prescaler 1024 (Clock/1024)
TIMSK2=0x01; // IT Timer2 Over Flow Active
sei();
}
void loop() { /* aucun traitement*/ }
IT Timer 2 Mode CTC IT
volatile unsigned char cpt;
ISR(TIMER2_COMPA_vect){ // IT si OCR2A==TCNT2
cpt++;
if(cpt==40) PORTB|=0x20;
if(cpt==50){ PORTB &=~0x20; cpt=0;}
}
void setup(){
DDRB |= 0x20; PORTB &= ~0x20;
// Configuration Timer 2
TCCR2A=0x02; // Mode CTC (Clear Timer On Compare)
OCR2A=156; // Registre de comparaison A = 156
TCCR2B=0x07; // Prescaler 1024 (Clock/1024)
TIMSK2=0x02; // IT Timer2 Quand TCNT2=OCR2A
sei(); // activation des IT (SREG.7=1)
}
void loop() { /*aucun traitement*/ }
Les autres périphériques
ATMEGA328
• Sur le poly, gestion bas niveau
– PORTS Digital I/O
– Interruptions INTx/Pin Change
– Timers 1,2 Normal/CTC + Interruptions
• D'autres périphériques disponibles
– ADC, Sorties PWM, Liaison série
asynchrone et synchrone
Entrées analogiques
• Structure = 1 convertisseur (ADC) +
multiplexeur analogique

Une seule entrée


convertie à la fois

Valeur numérique
ADC sur ATMega328
• 6 entrées analog. : ADC0 à ADC5
• Conversion 10 bits
• Temps de conversion : 13 à 260 micros
• Entrée entre 0V et Vcc

Fonction ARDUINO = int analogRead(pin)


Sorties PWM
• PWM : Pulse Width Modulation

Signal périodique binaire


Rapport Cyclique Réglable

Rapport Cyclique =
Durée du signal à 1 / période
PWM  sortie analogique
• Les microcontrôleurs ont rarement des
sorties analogiques
• Un signal PWM dans un filtre passe-bas a le
même effet qu'un signal constant dont
(valeur = moyenne du PWM)
• Utilisé pour
– Commande de moteurs à courant continu
– Modifier l'intensité des LEDS
PWM sur ATMEGA328
• Les signaux PWM sont générés par les timers qui
peuvent modifier l'état des 6 broches OCxA
OCxB

Marquées PWM ou ~ (dessin UNO page 4)

Fonction Arduino : void analogWrite(pin,value)


Interface Série Asynchrone
• Echange de données entre 2 équipements.
• Les bits d'un octet envoyés en série
• canal d'émission/ canal de réception
(full duplex)
Communication PCMicroC.
• Sur un PC, les échanges série asynchrones
suivent le standard RS-232 (Port COM)

• L'interface série asynchrone permet donc de


faire communiquer un PC et un système à
microcontroleur
Int. Série Asynch. ATMega328
• Les broches de communication série
asynchrone sont notées
TxD = émission série
RxD = réception série
• Gestion sur Arduino (objet Serial)
Serial.begin(9600); //9600 bits/s
Serial.println(val); //texte
Serial.write(val); //binaire
Interface Série Synchrone
• Les microcontrôleurs disposent souvent
d'interfaces de communication I2C/TWI
• I2C = bus 2 fils développé par Philips
• TWI = Two Wire Interface (autres
fabricants)
SCL = signal d'horloge
SDA = signal de données
TWI : maître/esclaves
Servomoteurs
• Moteurs avec asservissement
de position
• La commande transmise est
une consigne de position de
l'axe du moteur
• Le signal (consigne) transmis
ressemble à un PWM de
période 20ms
• La taille de l'impulsion
correspond à la consigne

Vous aimerez peut-être aussi