UNIVERSITE AFRICAINE DE TECHNOLIGIE ET DE
MANAGEMENT (UATM) GASA-FORMATION
CORRIGE DE MICROCONTROLEURS
Filière : Génie Electrique SPECIALITE : SI
Année : Master 1 Date : 08/03/2024
Questions de Cours
1. Nature et fonction des registres suivants
Registre Nature Fonction
DDR Data Direction Register Définir le sens de chaque broche du port, soit en entrée
(Registre Physique) (0) soit en sortie (1)
PORT Data Register Port Permet de lire ou d’écrire la valeur logique de chaque
(Registre physique) broche du port, soit 0 (niveau bas) soit 1 (niveau bas)
PIN Reading the Pin value Permet de lire le contenu d’un port quelque soit sa
(Registre virtuel) configuration en entrée ou en sortie
2. Ecriture en langage binaire et hexadécimal des sorties mises à 1 d’un microcontrôleur
Pour mettre à 1 les sorties d'un microcontrôleur sur les pattes 7, 4, 3 et 2 de la catégorie B,
il faut écrire les valeurs suivantes en langage binaire et hexadécimal :
Binaire : 0b10011000
Hexadécimal : 0x98
3. Citons les pattes utilisées pour effacer et envoyer le code dans la mémoire
Les pattes utilisées pour effacer et envoyer le code dans la mémoire FLASH ou EEPROM
d’un microcontrôleur AVR-ATmel sont les suivantes :
RESET
SCK
MOSI
MISO
4. Fonction de ces pattes
Les pattes utilisées pour effacer et envoyer le code dans la mémoire FLASH ou EEPROM
d’un microcontrôleur AVR-ATmel sont les suivantes :
RESET : c’est une patte qui permet de réinitialiser le microcontrôleur en appliquant un
niveau bas. Elle permet aussi de lancer le mode de programmation en série (SPI) en
combinaison avec les autres pattes.
Page 1 | 5
SCK (Serial Clock) : c’est une patte qui fournit le signal d’horloge pour la
communication SPI entre le microcontrôleur et le programmateur.
MOSI (Master Out Slave) : c’est une patte qui reçoit les données en série du
programmateur vers le microcontrôleur.
MISO (Master In Slave Out) : c’est une patte qui envoie les données en série du
microcontrôleur vers le programmateur.
La fonction de ces pattes est de permettre la programmation en série du microcontrôleur,
c’est-à-dire de transférer le code compilé depuis le programmateur vers la mémoire FLASH
ou EEPROM du microcontrôleur. Ce mode de programmation nécessite un protocole de
communication SPI (Serial Peripheral Interface) qui utilise les signaux SCK, MOSI et MISO
pour synchroniser et échanger les données. Le signal RESET permet de sélectionner le mode
de programmation en série en le mettant à l’état bas pendant la communication SPI.
5. Ecriture en langage C/C++ des sorties mises à 1 d’un microcontrôleur
#include <avr/io.h> // Bibliothèque pour accéder aux registres I/O
int main(void)
{
// Configurer les pattes comme sorties
DDRC |= (1 << DDC5)|(1 << DDC1);
// Mettre les sorties à 1
PORTC |= (1 << PC5)|(1 << PC1);
while (1)
{
// Boucle infinie
}
Problème
1. Association des Entrées¿Sorties de l’organe de traitement des données aux capteurs et
actionneurs
Page 2 | 5
Entrées
Capteurs Broches du microcontrôleur
C1 PB0
C2 PB1
C3 PB2
C4 PB3
DCY PB4
Sorties
Actionneurs Broches du microcontrôleur
RO PC1
DE PC2
MO PC3
2. Schéma de montage de tout le système informatique
U1
+12 RO
RESET
220V
RL1
U2 D1 12V
ATMEL
40 1
16.000
PA0/ADC0 PB0/T0/XCK
39 2
AREF PA1/ADC1 PB1/T1
38 3
GND PA2/ADC2 PB2/AIN0/INT2
13 37 4
DIGITAL
13 PA3/ADC3 PB3/AIN1/OC0
IOREF
12
12 36
PA4/ADC4 PB4/SS
5
R1 Q1
11 35 6
ARDUINO
RESET
~11 PA5/ADC5 PB5/MOSI BC547
3.3V 10 34 7
3.
~10 PA6/ADC6 PB6/MISO 10k
5V 9 33 8
(PWM~)
~9 PA7/ADC7 PB7/SCK
8
GND
POWER
8
ATMEL
ATMEGA328P
22 14
7 PC0/SCL PD0/RXD
UNO
E
Vin 7
6 23 15
~6
PC1/SDA PD1/TXD
A0 5 24 16
A0 PC2 PD2/INT0
ANALOG IN
A1 ~5 25 17
A1 4 PC3 PD3/INT1
A2 4
3 26 18
A2
~3
PC4 PD4/OC1B
A3 27 19
A4
A3
2
2
28
PC5 PD5/OC1A
20
+12V DE
A4 1 PC6/TOSC1 PD6/ICP1
A5 TX > 1 29 21
ON
A5 0 PC7/TOSC2 PD7/OC2
RX < 0
ICSP
[Link]
13
ARDUINO UNO XTAL1
32 12
AREF XTAL2
30 9 220V
AVCC RESET
+12
ATMEGA8535 RL2
D2 12V
R2
Q2
10k BC547
R3 R4 R5 R8
10k 10k 10k R7 10k
10k
+12V MO
C1 C2 C3 DCY
C4 220V
RL3
D5 12V
R6 Q3
BC547
10k
criture du programme de gestion du système informatique en C/C++
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#define Sorties PORTC
#define RO (1<<PC1)
#define DE (1<<PC2)
#define MO (1<<PC3)
#define Entrees PORTB
#define C1 (1<<PB0)
#define C2 (1<<PB1)
Page 3 | 5
#define C3 (1<<PB2)
#define C4 (1<<PB3)
#define DCY (1<<PB4)
#define FinEtapes 4
#define FinTransistion 4
char a,b,c,d,e;
char Etapes [FinEtapes];
char Transition [FinTransistion];
void LectureEntres(){
a=!(Entrees && C1);
b=!(Entrees && C2);
c=!(Entrees && C3);
d=!(Entrees && C4);
e=!(Entrees && DCY);
}
void GestionTransistions (){
Transition[1]=(Etapes[1] && a && d && e);
Transition[2]=(Etapes[2] && c);
Transition[3]=(Etapes[3] && b);
Transition[4]=(Etapes[4] && a);
}
void GestionsDesactivationEtapes(){
if(Transition[1]) Etapes[1]=0;
if(Transition[2]) Etapes[2]=0;
if(Transition[3]) Etapes[3]=0;
if(Transition[4]) Etapes[4]=0;
}
void GestionsActivationEtapes(){
if(Transition[1]) Etapes[2]=0;
if(Transition[2]) {Etapes[3]=1;}
if(Transition[3]) {Etapes[4]=1;}
if(Transition[4]) {Etapes[1]=1;}
}
void GestionsActivationSorties(){
if(Etapes[1]) Sorties=0;
if(Etapes[2]) Sorties=RO;
if(Etapes[3]) Sorties=DE;
if(Etapes[4]) Sorties=MO;
}
int main()
{
/* Replace with your application code */
DDRD =0xFF;
PORTC = 0xFF;
unsigned int i;
for (i=0;i<FinEtapes;i++)
{
Etapes[0]=1;Etapes[i]=0;
}
while (1)
{
LectureEntres();
GestionTransistions ();
GestionsDesactivationEtapes();
Page 4 | 5
GestionsActivationSorties();
}
}
4. Proposition d’un code en langage C/C++ simple
#include <avr/io.h>
#include <util/delay.h>
#define C1_PIN (1 << PB0)
#define C2_PIN (1 << PB1)
#define C4_PIN (1 << PB2)
#define DCY_PIN (1 << PB2)
#define RO_PIN (1 << PC1)
#define DE_PIN (1 << PC2)
#define MO_PIN (1 << PC3)
int main(void) {
DDRB &= ~(C1_PIN | C2_PIN | C4_PIN | DCY_PIN); // Configure les broches comme
entrées
DDRC |= RO_PIN |DE_PIN | MO_PIN ; // Configure les broches comme sorties
PORTB |= (C1_PIN | C2_PIN | C4_PIN | DCY_PIN); // Active les résistances de
pull-up
while (1) {
if (!(PINB & C1_PIN) && !(PINB & C4_PIN) && !(PINB & DCY_PIN)) {
PORTC |= RO_PIN ; // Rotation du plateau
_delay_ms(300); // Temporisation de 300ms
PORTC &= ~DE_PIN ; // Descente poinçon
}
if (!(PINB & C2_PIN)) {
PORTB |= MO_PIN; // Monter le poinçon
while (!(PINB & C1_PIN)) {} // Attendre que le bouton C1 soit
relâché
PORTB &= ~MO_PIN; // Arrêter la montée
}
}
Page 5 | 5