Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Microprocesseurs et
ses interfaces
Support de cours : 1 ere année Master
INSTRUMENTATION et Micro-informatique
1
III.2.5 Adressage basé ...........................................................................................................................17
III.2.6 Adressage indexé .......................................................................................................................17
III.2.7 Adressage basé indexé ...............................................................................................................18
III.3 Les instructions de transfert .......................................................................................................18
III.3.1 Instruction MOV .......................................................................................................................18
III.3.2 Instruction de pile......................................................................................................................19
III.3.3 Instruction XCHG......................................................................................................................20
III.4 Les instructions arithmétiques .................................................................................................20
III.4.1 Instruction ADD .........................................................................................................................20
III.4.2 Instruction ADC ........................................................................................................................20
III.4.3 Instruction INC...........................................................................................................................21
III.4.4 Instruction SUB .........................................................................................................................21
III.4.5 Instruction SBB .........................................................................................................................21
III.4.6 Instruction DEC ........................................................................................................................21
III.4.7 Instruction NEG ........................................................................................................................21
III.4.8 Instruction CMP.........................................................................................................................21
III.4.9 Instruction MUL.........................................................................................................................22
III.4.10 Instruction DIV.........................................................................................................................22
III.4.11 Instructions IMUL et IDIV.....................................................................................................22
III.5 Les instructions logiques..........................................................................................................22
III.5.1 Instruction AND..........................................................................................................................22
III.5.2 Instruction OR ...........................................................................................................................22
III.5.3 Instruction XOR ........................................................................................................................23
III.5.4 Instruction TEST........................................................................................................................23
III.5.5 Instruction NOT .........................................................................................................................23
III.5.6 Instructions de Décalages...........................................................................................................23
III.5.7 Instructions de Rotations ...........................................................................................................24
III.6 Les instructions de branchement .............................................................................................24
III.6.1 Instruction de saut inconditionnel ...........................................................................................25
III.6.2 Instructions de sauts conditionnels ..........................................................................................25
III.6.3 Instruction CALL.......................................................................................................................25
III.6.4 Instruction RET ..........................................................................................................................26
2
III.6.5 Instructions des interruptions ...................................................................................................26
III.6.6 Instruction de boucles LOOP ....................................................................................................26
III.7 Les instructions de manipulation de chaines ...........................................................................26
Chapitre 4 : Interfaçage du microprocesseur 8086 .....................................................................................28
IV.1 Microprocesseur 8086 (Minimum Mode).................................................................................28
IV.2 Générateur d’horloge.................................................................................................................28
IV.3 Bus système (Demultiplexed and Buffered) .............................................................................28
IV.4 Mémoire système (ROM & RAM) ............................................................................................30
IV.5 E/S système (Switches and LEDs) .............................................................................................32
IV.5.1 Adresse cartographique .............................................................................................................32
IV.5.2 Adressage indépendant ..............................................................................................................32
Chapitre 5 : Les interfaces d’entrées/sorties................................................................................................34
V.1 Définition.....................................................................................................................................34
V.2 L’interface parallèle 8255 .........................................................................................................34
V.2.1 Interfaçage de 8086 avec le 8255 ...............................................................................................37
V.3 Le 8279........................................................................................................................................37
V.4 L’interface série 8250 .................................................................................................................38
V.4.1 Structure de l’UART..................................................................................................................39
V.4.2 Les registres du 8250..................................................................................................................40
Chapitre 6 : Les interruptions......................................................................................................................41
VI.1 Définition d’une interruption ....................................................................................................41
VI.2 Le contrôleur programmable d’interruptions 8259 ................................................................42
VI.3 Le temporisateur programmable 8253/8254...........................................................................44
VI.4 DMA (Accès Direct à la Mémoire)............................................................................................48
VI.5 Le 8237.........................................................................................................................................48
Bibliographie...................................................................................................................................................50
3
Chapitre 1 : Introduction aux microprocesseurs
I.1 Introduction
Dans les années 70 les technologies des
ordinateurs numériques et celles des circuits intégrés
sont fondues pour donner naissance au
microprocesseur.
Le microprocesseur possède une architecture
semblable à l’ordinateur en plus tous les deux
effectuent des calculs sous le contrôle d’un
programme.
La plupart des systèmes informatiques
d'aujourd'hui sont basés sur un principe de conception
proposée par le Dr John Von Neumann (1946).
I.2.1 Le microprocesseur
C’est le cœur du système. C’est lui qui a la charge des fonctions suivantes :
- Fournit les signaux de synchronisation et de commande à tous les éléments du système
- Prend en charge les instructions et les données dans la mémoire
- Transfère les données entre la mémoire et les dispositifs d’I/O et vice versa
- Décode les instructions
- Effectue les opérations arithmétiques et logiques commandées par les instructions
- Réagit aux signaux de commande produits par les entrées/sorties comme le signal RESET et
les INTERRUPTIONS
4
I.2.2 La mémoire
La mémoire a pour rôle de conserver des groupes de chiffres binaires (mots) qui sont soit
des instructions formant un programme, soit des données dont le programme a besoin.
Elle se décompose souvent en :
a/ une mémoire morte (ROM = Read Only Memory) chargée de stocker le programme. C’est une
mémoire à lecture seule.
• ROM : Read Only Memory. Mémoire à lecture seule, sans écriture. Son contenu est programmé
une fois pour toutes par le constructeur. Avantage : faible coût.
Inconvénient : nécessite une production en très grande quantité.
• PROM: Programmable Read Only Memory. ROM programmable une seule fois par l’utilisateur.
• EPROM : Erasable PROM, appelée aussi UVPROM. ROM programmable électriquement avec
un programmateur et effaçable par exposition à un rayonnement ultraviolet.
• EEPROM : Electrically Erasable PROM. ROM programmable et effaçable électriquement.
Les EEPROM contiennent des données qui peuvent être modifiées.
b/ une mémoire vive (RAM = Random Access Memory) chargée de stocker les données
intermédiaires ou les résultats de calculs. On peut lire ou écrire des données dedans, ces données
sont perdues à la mise hors tension.
• SRAM: Static Random Access Memory. Mémoire statique à accès aléatoire, à base de bascules à
semi-conducteurs à deux états (bascules RS).
• DRAM : Dynamic RAM. Basée sur la charge de condensateurs : condensateur chargé = 1,
condensateur déchargé = 0.
Remarque :
Les disques durs, disquettes, CDROM, etc… sont des périphériques de stockage et sont considérés
comme des mémoires secondaires.
On peut donc schématiser un circuit mémoire par la figure suivante où l’on peut distinguer :
5
Les entrées d’adresses, les entrées / sorties de données, les entrées de commandes :
Entrée de sélection de lecture ou d’écriture. (R/ W), une entrée de sélection du circuit. (CS).
Le nombre de lignes d’adresses dépend de la capacité de la mémoire : n lignes d’adresses
permettent d’adresser 2n cases mémoire: 8 bits d’adresses permettent d’adresser 256 octets, 16 bits
d’adresses permettent d’adresser 65536 octets (= 64 Ko), ...
Exemple : mémoire RAM 6264, capacité = 8K×8 bits : 13 broches d’adresses A0 à A12,
213 = 8192 = 8 Ko.
UAL Registres
Bus d’adresse
Flags
Bus de données
Décodeur Séquenceur
Unité de commande
Figure I.3: Principales sections d'un microprocesseur
6
ALU (Arithmetic and Logic Unit)
C'est l’unité qui permet d'effectuer des calculs arithmétiques simples (additions, soustractions,
décalages, etc.) et des opérations logiques (ET, OU, etc.).
Les registres généraux
Les registres généraux participent aux opérations arithmétiques et logiques ainsi qu'à l'adressage. Le
plus important est appelé accumulateur.
Registre d’état
C’est l’ensemble des drapeaux (flags) qui forme le registre d’état.
Les flags réagissent après certaines instructions et permettent de savoir si le résultat de l'opération
est zéro (flag Z), si il y a eu un dépassement (flag C), si le nombre de bit à 1 est pair (flag P) et le
signe (flag S).
7
I.4.2 Le microprocesseur 8088 (1979)
Il est entièrement compatible avec le 8086, le jeu d'instruction est identique. La seule
différence réside dans la taille du bus de données, celui du 8088 fait seulement 8 bits.
8
I.4.6 Le microprocesseur 80486 (1989)
Bus d'adresse de 32 bits.
Bus de données 32 bits interne et externe.
Des registres de 32 bits.
On-chip cache (stocke les instructions et les données les plus récemment utilisées)
Unité à virgule flottante intégrée (FPU)
Modes réels et protégés comme dans 80386
9
Chapitre 2 : Le Microprocesseur Intel 8086
10
ALE (Address Latch Enable ): Ce signal est une impulsion active pendant T1, elle indique que
l’information qui circule dans bus A/D est une adresse.
Elle est fournie par le Cpu pour verrouiller les lignes d'adresse au cours des cycles T2, T3, T4.
RD : Read, signal de lecture d’une donnée.
WR : Write, signal d´écriture d’une donnée.
M/IO : Memory/Input-Output, indique si le CPU adresse la mémoire (M/IO = 1) ou les
entrées/sorties (M/IO = 0).
DEN : Data Enable, indique que des données sont en train de circuler sur le bus A/D (équivalente
de ALE pour les données).
DT/R : Data Transmit/Receive, indique le sens de transfert des données :
• DT/R = 1 : données émises par le microprocesseur (écriture) ;
• DT/R = 0 : données reçues par le microprocesseur (lecture).
11
Chronogramme de sens de transfert de données sur le bus de données
1 1 aucun octet
12
II.2.1 Connexions de base
GND: se connecter à 0V.
Remarque :
Un système à microprocesseur très simple est composé des parties suivantes:
13
Figure II.2 : architecture du microprocesseur 8086
14
Remarque : la pile est une zone mémoire ou on peut sauvegarder le contenu des registres, les
adresses ou les données pour les récupérer après l'exécution d'un sous-programme ou l'exécution
d'un programme d'interruption.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
15
Chapitre 3 : La programmation du microprocesseur 8086
III.1 Généralités
Le programme est une suite d'instructions. Une instruction est un mot binaire décrivant
l'action que doit exécuter le microprocesseur,
Une instruction est définie par son code opératoire, qu’on écrit généralement en hexa, mais
pour une plus grande facilité on les désignera par leurs mnémoniques. Le mnémonique est une
abréviation en caractère latin.
La programmation en assembleur utilise un ensemble d’instructions appelé jeu
d’instructions. Chaque microprocesseur à son propre jeu d’instructions.
Pour les microprocesseurs classiques, le nombre d’instructions reconnues varie entre 75 et
150 (microprocesseurs CISC : Complex Instruction Set Computer). Il existe aussi des
microprocesseurs dont le nombre d’instructions est très réduit (microprocesseurs RISC : Reduced
Instruction Set Computer) : entre 10 et 30 instructions, permettant d’améliorer le temps
d’exécution des programmes.
Les instructions peuvent être classées en groupes :
• instructions de transfert de données ;
• instructions arithmétiques ;
• instructions logiques ;
• instructions de branchement ...
L’opération est réalisée entre les 2 opérandes et le résultat est toujours récupéré dans
l’opérande de gauche.
Il y a aussi des instructions qui agissent sur un seul opérande.
Les opérandes peuvent être des registres, des constantes ou le contenu de cases mémoire, on
appelle ça le mode d’adressage
Les modes d'adressage définissent comment identifier l'opérande de chaque instruction.
Un mode d'adressage spécifie comment calculer l'adresse de la mémoire d'un opérande en
utilisant les informations contenues dans les registres et / ou Les constantes contenues dans
l’instruction.
Il y a plusieurs modes d'adressage dans le 8086:
16
III.2.1 Adressage registre
Ce mode utilise les registres internes de CPU, dans ce mode le CPU transfert d'une copie
d'un octet (8 bits) ou un mot (16 bits) d'un registre (source) vers un autre registre (destination).
Exemples : MOV AX, BX : Copier le contenu de BX dans AX
Notez que le transfert d'un registre 8 bits avec un registre 16 bits est une erreur.
17
III.2.7 Adressage basé indexé
C’est un mode combine entre de modes d’adressage comme l’indique son nom.
Exemple : MOV AX, [BP+SI-8] : AX est chargé par la mémoire d'adresse SS:BP+SI-8
MOV AX, [BX+DI+4] : AX est chargé par la mémoire d'adresse DS:BX+DI+4
18
III.3.2 Instruction de pile
Les instructions de pile sont des instructions importantes qui stockHQW et récupérHQW des
données à partir de la pile mémoire selon le protocole LIFO (dernier entré, premier sorti).
Le processeur 8086 prend en charge 4 instructions de pile:
PUSH
POP
PUSF (Push Drapeau enregistrer)
POPF (Pop Drapeau enregistrer)
a/ PUSH
Le format général d'une instruction de PUSH est : PUSH opérande
- L'instruction PUSH stocke le contenu de l’opérande Op (16 bits) dans le sommet de Pile
- Décrémente SP de 2
b/ POP
Le format général d'une instruction POP est : POP opérande.
- L'instruction POP Dépile une valeur de 16 bits depuis le sommet de la Pile (STACK
SEGMENT) et la stocke dans les opérandes (16 bits).
- ,Qcrémente SP de 2
19
Figure III.2 : Fonctionnement de l'instruction POP
20
III.4.3 Instruction INC
Incrémentation d’un opérande.
INC Destination ; Destination destination+1.
La destination peut être : registre, mémoire.
Les FLAGs affectés : OF ; AF ; SF ; ZF ; PF
CF reste inchangé
Pour incrémenter une case mémoire, il faut préciser la taille :
INC byte [ ], INC word [ ]
21
III.4.9 Instruction MUL
Cette instruction exécute la multiplication entre l’accumulateur et un opérande (non
signé) : MUL Opérande.
Si l’opérande est une valeur sur 8 bits : AX AL * Opérande.
Si l’opérande est une valeur sur 16 bits : DX : AX AX * Opérande.
L'opérande ne peut pas être une donnée, c’est soit un registre soit une position mémoire,
dans ce dernier cas, il faut préciser la taille (byte ou word)
Les FLAGs affectés : CF et OF si la partie haute du résultat est non nulle. La partie haute
est AH pour la multiplication 8 bits et DX pour la multiplication 16 bits
Exemple :
MUL BL ; AL x BL → AX
MUL CX ; AX x CX → DX:AX
III.5.2 Instruction OR
OU logique entre deux opérandes bit à bit : OR Destination, Source ;
Destination destination (OU) source.
La destination peut être : registre, mémoire.
La source peut être : registre, mémoire, immédiate.
Les FLAGs affectés : ZF ; SF ; PF
22
III.5.3 Instruction XOR
OU Exclusif entre deux opérandes bit à bit : XOR Destination, Source ;
Destination destination (ou exclusif) source.
La destination peut être : registre, mémoire.
La source peut être : registre, mémoire, immédiate.
Les FLAGs affectés : ZF ; SF ; PF
Remarque : Astuces sur les instructions logiques (OR, XOR, AND) :
1. Forçage à 1 : c’est le OR avec un « 1 ».
2. Masquage à 0 : c’est le AND avec un « 0 ».
3. Inverser un bit : c’est le XOR avec un « 1 ».
Shift Left
Shift Arithmetic
Left
Shift Right
Shift Arithmetic
23
Remarque : Les décalages arithmétiques permettent de conserver le signe. Ils sont utilisés pour
effectuer des opérations arithmétiques comme des multiplications et des divisions par 2.
La forme générale des instructions de décalage est : XXX destination, N
Où: XXX est le mnémonique de décalage (i.e., SHL, SHR, SAL, SAR),
La destination peut être : registre, mémoire et l'opérande N peut être soit une constante
(immédiat) soit le registre CL :
Exemples: SHL AX, 1
SHL AX, CL
Rotate Through CF
Left
Rotate Left
Rotate Through CF
Right
Rotate
Right
24
III.6.1 Instruction de saut inconditionnel
JMP label ; Provoque un saut sans condition à la ligne portant l'étiquette label.
Où label est un identificateur d'adresse de programme.
Remarque :
- Les termes supérieur et inférieur (above and below) pour les nombres non signés.
- Les termes plus grand et plus petit (greater than and less than) pour les nombres signés.
25
(2) Il stocke le contenu du registre IP dans la pile de programme.
(3) On ajuste le contenu du registre d'IP de nouveau pour pointer sur la première instruction
de la procédure appelée.
L’unité centrale continue à exécuter les instructions jusqu'à ce qu'elle rencontre une
instruction RET.
Remarque : Chacune des instructions existe en deux versions, entre deux octets, ou entre 2
words, le préfixe REP pour les instructions de transfert MOVS LODS STOS, Ce préfixe utilise
le registre CX comme un compteur de répétition.
26
Les préfixes REPE et REPZ : Répétition des instructions de comparaisons SCAS et CMPS
tant que ZF=1 et CX≠0.
Les préfixes REPNE et REPNZ : Répétition des instructions de comparaisons SCAS et
CMPS tant que ZF=0 et CX≠0.
Ces instructions sont utilisées sans opérandes. les registres utilisés sont : pour la source
DS:SI, et pour la destination ES:DI. A chaque exécution d’une instruction de traitement de
chaîne, les registres d’indexes sont incrémentés ou décrémentés selon le flag DF de registre
d’état.
* DF = 0 : SI et DI sont incrémentés, (l’instruction CLD mit (DF = 0))
* DF = 1 : SI et DI sont décrémentés. (l’ instruction STD mit (DF = 1))
SI et DI sont incrémentés de 1 ou de 2 selon que l'opération s'effectue sur un octet
(byte) ou sur un mot de 16 bits (word).
MOVSB : Copie Le contenu d’un octet de mémoire DS: [SI] dans un octet de mémoire
ES: [DI], puis auto inc/decrémente les registres SI et DI.
MOVSW : Copie Le contenu du mot de mémoire DS: [SI] dans le mot de mémoire ES:
[DI], puis auto inc/decrémente de 2 les registres SI et DI
LODSB : Copie l'octet source DS: [SI] dans AL puis inc/décr le registre SI.
LODSW : Copie le mot source DS: [SI] dans AX puis inc/décr de 2 le registre SI.
STOSB : Copie AL dans l’octet destination ES: [DI] et inc/décr le registre DI.
STOSW : Copie AX dans le mot destination ES: [DI] et inc/décr de 2 le registre DI.
CMPSB : Compare l'octet source ES : [DI] avec l'octet destination DS: [SI], positionne
les indicateurs puis inc/décrémente les registres SI et DI.
CMPSW : Compare le mot source ES : [DI] avec mot destination DS: [SI], positionne
les indicateurs puis inc/décrémente de 2 les registres SI et DI
27
Chapitre 4 : Interfaçage du microprocesseur 8086
28
Figure IV.2 : bascules D circuits 8282
Si plus de 10 composants sont attachés aux broches de bus, l'ensemble du système 8086 doit
être amplifié. Les broches démultiplexés (adresse bus A19-A0 et BHE) sont déjà
amplifiées par les verrous (latch). Donc, il faut amplifier le bus de données D15 - D0. Le bus de
données est bidirectionnel, nous devons utiliser des tampons (buffers) bidirectionnels :
Exemples de tampons de bus : circuits transmetteurs bidirectionnels 8286 ou 74245 :
Remarque : Les signaux de bus de contrôle (M/IO, RD et WR) les signaux de bus de
contrôle sont des signaux unidirectionnels. Par conséquent, nous avons besoin d'utiliser des
tampons unidirectionnels tels que le buffer 74LS244.
La figure suivante montre la conception de bus système de μp 8086
29
Figure IV.4 : conception de bus système de μp 8086
30
Le 8086 sera interfacé à la RAM comme suit:
Les lignes d'adresse les moins significatives A16-A1 sont utilisées pour adresser des
emplacements de mémoire dans la RAM.
Les lignes d'adresse les plus significatives A19-A17 sont utilisées pour sélectionner la plage
d'adresses nécessaires dans l'espace de mémoire de 8086 (sélectionner les deux boitiers RAM),
comme sur figure.
Décodage Adressage
31
Figure IV.6 : décodage signaux lecture et écriture mémoire et I/O.
32
Tableau IV.1: Comparaison entre Adressage cartographique et indépendant
Remarque : la mémoire et les ports I/O partage le même bus de données et d’adresse, c’est Le
signal M/IO qui permet de différencier l’adressage de la mémoire de l’adressage des ports E/S :
• pour un accès à la mémoire, M/IO = 1;
• pour un accès aux ports d’E/S, M/IO = 0.
Les instructions utilisées pour R/W d’un port sont « IN / OUT ». Il existe deux types
d’accès, accès direct et un autre indirect. Les registres utilisés sont l’accumulateur « AL / AX » et le
registre de données « DX ». Les instructions directes d'E / S fournissent l'adresse de port (qui doit
être un nombre compris entre 0 et FFh).
Si l’adresse du port d’E/S est sur un octet:
Pour accéder à la plage complète des ports d'E/S de 0000H à FFFFH, les instructions
indirectes d'E / S doivent être utilisées.
Pour ces instructions, le registre DX doit être préchargé avec l'adresse du port.
• si l’adresse du port d’E/S est sur deux octets:
33
Chapitre 5 : Les interfaces d’entrées/sorties
V.1 Définition
Une interface d'entrées/sorties est un circuit permettant au Cpu de communiquer avec
l'environnement extérieur (périphérique) : clavier, écran, imprimante, processus industriel etc...
Les interfaces d'E/S sont connectées au microprocesseur à travers les bus d'adresses de
données et de commandes.
Un circuit d’E/S possède des registres pour gérer les échanges avec les périphériques :
• Registre de configuration
• Registre de données
A chaque registre est assignée une adresse : le microprocesseur accède à un port d’E/S en
spécifiant l’adresse de l’un de ses registres.
Intel a développé plusieurs circuits intégré de contrôle de périphérique conçus pour soutenir
la famille de processeurs 80x86 tels que:
Le 8255A Programmable Peripheral Interface (PPI),
Le 8259 Programmable Interrupt Controller (PIC),
Le 8253/54 Programmable Interval Timer (PIT),
Le 8237 Programmable DMA Controller.
34
Tableau V.1: Sélection des ports de 8255
35
Figure V.3: Structure du registre de commande
36
V.2.1 Interfaçage de 8086 avec le 8255
On peut connecter le bus de données du
8255 sur les lignes de données de poids faible
du 8086 (D0 - D7) ou sur celles de poids fort
(D8 - D15).
Donc l’un des deux signaux A0 ou
BHE doit être utilise pour sélectionner le 8255
alors les adresses des registres du 8255 se
trouvent à des adresses paires (validation par
A0) ou impaires (validation par BHE).
Exemple :
V.3 Le 8279
Intel 8279 est un circuit intégré d'interface programmable clavier / l'écran :
Scans et encode jusqu'à un clavier de 64-clé.
Contrôle jusqu'à un affichage numérique de 16 chiffres.
La Section Clavier possède une mémoire tampon de 8 caractères FIFO intégrée.
L'affichage est commandé à partir d'une RAM interne 16x8 qui mémorise les informations
d'affichage codées.
37
Figure V.6: Interface du 8279 (Un clavier Hexa et afficheur 7 segments) avec le 8086.
• dans le protocole de transmission de données on a que deux états significatifs : 0 (ou low),
38
et 1 (ou high). Quand on ne transmet rien, la ligne est à l'état high (tension négative). Comme le
montre la figure V.7,
• Le bit de Start permettra au récepteur de savoir que des données vont être transmises;
• Les bits de données sont transmis l’un après l’autre en commençant par le bit de poids
faible. Ils peuvent être au nombre de 5, 6, 7 ou 8.
• Le bit de parité est un bit supplémentaire dont la valeur dépend du nombre de bits de
données égaux à 1. Il est utilisé pour la détection d’erreurs de transmission ;
• Les bits de stop (1, 1.5 ou 2) marquent la fin de la transmission du caractère.
L'UART est conçue pour gérer les signaux en provenance d'un modem. Aussi est-il
nécessaire de donner quelles broches sont utilisées par
l'ETCD (Equipement Terminal de Communication de
Données).
signal Signification
TxD Transmit Data
RxD Receive Data
RTS Request To Send
CTS Clear To Send
DTR Data Terminal Ready
DSR Data Set Ready
DCD Data Carrier Detect
RI Ring Indicator
Les 2 signaux TxD et RxD servent à transmettre les données. Les autres signaux sont des
signaux de contrôle de l’échange de données.
39
Figure V.10 : Bornes du circuit UART 8250.
40
Chapitre 6 : Les interruptions
41
VI.2 Le contrôleur programmable d’interruptions 8259
Le 8259A peut gérer jusqu’à 8 demandes d’interruptions matérielles. Il est programmé par le
logiciel du système comme un périphérique d'E / S.
Une sélection de modes de priorité est disponible pour le programmeur de sorte que la
manière dont les demandes sont traitées par le 8259A peut être configurée pour correspondre à ses
besoins du système.
Les modes de priorité peuvent être modifiés ou reconfigurés dynamiquement à tout moment
pendant le programme principal. Cela signifie que la structure d'interruption complète peut être
définie selon les besoins.
42
VI.3 Brochage du 8259 :
43
VI.3 Le temporisateur programmable 8253/8254
On peut facilement exécuter une boucle de temporisation mais lorsque le microprocesseur
exécute la temporisation il ne peut plus rien faire d’autre. Pour cela on fait appel à un circuit
spécialisé c’est le PROGRAMMABLE TIMER.
Le 8253 programmable interval timer/counter est spécialement conçu pour les circuits
d’Intel. Le programmeur configure le 8253 pour correspondre à ses besoins, initialise un des
compteurs du 8253 avec la quantité désirée, puis avec le mot de commande le 8253 prendra en
charge la temporisation et signalera la fin d’exécution avec une interruption du CPU.
Il y a trois registres de comptage de 16 bits, dont chacun peut être programmé comme un
timer ou un compteur d'événements. Plus un registre de commande qui peut ne peut-être qu’écrit.
L’accès aux registres du 8254 s’effectue de la façon suivante :
Tableau VI.1: Description des opérations de base
CS RD WR A1 A0 fonction
0 1 0 0 0 Chargement compteur 0
0 1 0 0 1 Chargement compteur 1
0 1 0 1 0 Chargement compteur 2
0 1 0 1 1 Ecriture mot de mode
0 0 1 0 0 Lecture compteur 0
0 0 1 0 1 Lecture compteur 1
0 0 1 1 0 Lecture compteur 2
0 0 1 1 1 Etat de haute impédance
1 X X X X
0 1 1 X X
44
Table VI.2: Pin description of the 8254.
La programmation du 8254 se fait par l’envoi d’un mot de commande dans le registre de
commande CR. Les bits 6 et 7 de ce mot de commande permettent de l’affecter à l’un des trois
compteurs. Le format du mot de commande est le suivant :
45
On remarque que chaque compteur peut être utilisé selon l’un des 6 modes possibles :
Mode 0 :
Il Permet au 8254 d’être utilisé comme un compteur ou temporisateur. Dans ce mode, la
sortie est au niveau logique 0 Lorsque le décomptage atteint 0, la sortie passe au niveau 1. On
notera que l'entrée GATE doit être un 1 logique pour permettre au compteur de compter. Si G
devient 0 au milieu du comptage, le compteur s’arrête jusqu'à ce que G redevient 1.
Mode 1 :
Le 8254 à la fonction comme un monostable redéclenchable. Un front montant sur la
gâchette GATE déclenche le décompte au top d’horloge qui suit. Alors la sortie passe à 0 et s’y
maintient jusqu’à ce que le décompte arrive à 0. Chaque front montant sur GATE relance le
processus à partir du compte initial (si celui- ci n’a pas été modifié).
Mode 2 :
C’est le mode diviseur par n il permet au 8254 de générer une série d'impulsions continues.
La séparation entre les impulsions est déterminée par le comptage. Par exemple, pour un compte de
10, la sortie est un état logique 1 pendant neuf périodes d'horloge et 0 pour une période d'horloge.
Ce cycle est répété jusqu'à ce que le compteur est programmé avec un nouveau comptage ou jusqu'à
ce que l’entrée G est placée à un niveau logique 0. L'entrée G doit être un 1 logique pour ce mode
pour générer une série continue d'impulsions.
Mode 3:
Ce mode est similaire au mode 2 sauf que OUT passe au niveau bas lorsque la moitié du
compte initial est atteinte, soit N/2, et reste dans cet état jusqu’à ce que le compte arrive à 0 et le
cycle recommence. Comme pour le mode 2, un niveau 1 sur GATE valide le décompte et un niveau
0 l’inhibe alors qu’un front montant le réinitialise. De ce fait, une valeur impaire amène (N+l)/2
avec sorties au niveau haut et (N-1)/2 au niveau bas.
Mode 4:
Ce mode est similaire au mode 0 sauf que OUT est au niveau haut pendant le décomptage et
produit une seule impulsion négative lorsque le compte devient nul.
Mode 5:
Ce mode est similaire au mode 4. Cependant il est démarré par une impulsion de
déclenchement sur la broche G au lieu par le programme. Ce mode est également similaire au mode
1, car il est redéclenchable.
46
Figure VI.4 : Les six modes de fonctionnement pour le 8254. L'entrée de G = 0 arrête le
compteur en mode 2, 3, et 4.
47
VI.4 DMA (Accès Direct à la Mémoire)
Précédemment, nous avons discuté d'E / S de base et de traitement d’interruption.
Maintenant, nous nous tournons vers la forme finale d'E / S appelé accès direct à la mémoire
(DMA). La technique DMA offre l’accès directe à la mémoire pendant que le microprocesseur est
temporairement désactivé. Ceci permet aux données d'être transférées entre la mémoire et le
dispositif d'E / S à une vitesse qui est limitée uniquement par la vitesse des composants de
mémoire dans le système ou le dispositif de commande DMA. Les transferts DMA sont utilisés à de
nombreuses fins, mais plus fréquents comme pour, transfert de données entre la mémoire et le
disque dur, transfert de données vers la carte graphique ou la carte de son, etc.
On utilise pour cela le contrôleur de DMA un circuit intégré qui gère le transfert par DMA,
lors de l’initialisation d’un transfert par DMA, le contrôleur de DMA négocie l’accès au bus de
données avec le microprocesseur via les deux broches HRQ et HLDA du microprocesseur :
– Le cycle commence avec la requête du périphérique via une entrée DREQ (pour Dma
REQuest) du DMAC.
– Le DMAC positionne alors l’entrée HOLD du 8086 à niveau haut, requérant ainsi que le
microprocesseur entre dans un état HOLD qui laisse la main au DMAC.
– Le microprocesseur répond en terminant le cycle de bus en cours (s’il y en a un) et met ses
adresses, données et la plupart des contrôles en position ouverte (haute impédance). La broche
HLDA (pour HOLD Acknowledge) est positionnée au niveau haut par le microprocesseur pour
accuser réception de la requête.
Dans un système avec des tampons de bus d’adresse, de données et de contrôle, HDLA est
utilisé pour désactiver ces tampons de façon à ce que le microprocesseur soit complétement
déconnecté de la mémoire et des entrées-sorties.
– Lorsqu’il reçoit HDLA, le DMAC applique DACK (pour Dma ACknowledge) au
périphérique requérant le service. Le DMAC contrôle alors le système, fournissant les signaux de
bus d’adresse et de contrôle comme si il était le microprocesseur (ce qu’il est réellement).
– Tant que le DMAC utilise les bus pour des transferts, le microprocesseur est inactif (et
réciproquement, lorsque le microprocesseur est actif, le DMAC est inactif). Lorsque le DMAC a
terminé son travail, il met HOLD à un niveau bas de façon à ce que le microprocesseur reprenne la
main.
VI.5 Le 8237
Intel a conçu le DMAC 8237 pour être associé au microprocesseur 8080. Il est également
utilisé pour les microprocesseurs 8085 et 8086/88. Le 8237 est en fait un microprocesseur à usage
spécial dont le travail est le transfert de données à grande vitesse entre la mémoire et les E / S. la
Figure suivante montre le brochage et le diagramme du contrôleur de DMA programmable 8237.
Le 8237 a quatre canaux pour transférer les données, c’est-à-dire qu’il peut être relié à
quatre périphériques. Bien entendu, à un instant donné, un seul périphérique peut utiliser le DMAC
pour transférer des données.
A chaque canal est associé deux signaux : DREQ et DACK. Il y a un seul signal HOLD et
un seul signal HLDA, ce qui signifie que les quatre canaux utilisent les mêmes bus système, mais le
DMAC décide quel périphérique doit prendre le contrôle à partir d’un registre des priorités qui peut
être programmé.
48
Figure VI.5 : (a) Schéma fonctionnel et (b) brochage du contrôleur DMA programmable
8237.
On ne va pas aller plus loin dans l’étude du contrôleur DMA programmable 8237 car il est
rarement utilisé d’une façon individuelle.
49
Bibliographie
[1] Brey, Barry B. The Intel microprocessors 8086/8088, 80186/80188, 80286, 80386, 80486,
Pentium, Pentium Pro processor, Pentium II, Pentium III, Pentium 4, and Core2 with 64-
bit extensions: architecture, programming, and interfacing ;8th ed; Pearson Prentice Hall ;
2009.
[2] D.a.godse A.p.godse. Microprocessors and Interfacing; first edition ; technical publications
pune ; 2009 .
[3] M.aumiaux . Les systèmes à microprocesseurs ; 2eme edition ; masson ; 1982.
[4] Intel The 8086 Family; Users Manual ; 1979.
[5] Dr J.Y. Haggége. MICROPROCESSEUR ; (cours Institut Supérieur des études
Technologiques de Radés) ; 2003
[6] A. Oumnad. MICROPROCESSEURS DE LA FAMILLE 8086.
[7] www.chipdocs.com
[8] www.datasheetcatalog.com
50
Chapitre 3 : Ports et registres Microcontrôleur AVR ATmega16 / ATmega32
Introduction
1. DDRx Register: ils sont utilisés pour décider de la direction des broches, (broches
d’entrées ou broches de sortie ).
2. PINx: Ils sont utilisés pour lire le niveau logique sur les ports.
3. PORTx registers: ils servent à définir la logique sur les broches HIGH ou LOW.
(Où x peut être A, B, C ou D en fonction des registres de ports à adresser).
Exemple :
L'écriture 1 sur les bits de ce registre configure les broches correspondant à ces broches
en tant que broches de sortie.
Ici, nous avons configuré les 8 broches du port D en tant que broches de sortie en
écrivant 1 sur chacune d’elles. (0xFF = 0b11111111).
Exemple:
Nous allons utiliser le registre PORTx du port D pour écrire une valeur 0x55 sur le port D.
PORTD = 0x55;
PINx: Registres d'adresses des broches d' entrée
Exemple:
Nous lirons la valeur sur le port D dans une variable de 8 bits nommée 'valeur_port'.
valeur_port = PIND;
L'exemple le plus simple, fourni par ARDUINO, consiste à faire clignoter la LED raccordée à la
broche PB5 du microcontrôleur, broche également disponible sur les connecteurs de la carte et
Exemple ARDUINO UNO Faire clignoter la LED (PB5) sans utiliser les
fonctions ARDUINO
void setup() // LED <- PB5 : LED allumée quand PB5=1
{ void setup() {
pinMode(13, OUTPUT); //broche PB5 en sortie // configurer broche PB5 en sortie
} DDRB |= B100000; // B100000 représente la
void loop() constante 0x20
{ // OU DDRB|=0x20; // équivalent
digitalWrite(13,HIGH); // set PB5 // OU DDRB |= 32; // équivalent quoique moins clair
delay(200); // délai 200 ms PORTB &= ~(1<<PORTB5); // PORTB.5 <- 0
digitalWrite(13,LOW); // clear PB5 }
delay(1000); // délai 1 s void loop() {
PORTB |= (1<<PORTB5); // PORTB.5 <- 1
delay(200); // 200 ms
} PORTB &= ~(1<<PORTB5); // PORTB.5 <- 0
delay(1000); // 1s
Exemple 1
Écrivons un code pour programmer la broche 3 du port D en tant que broche de sortie et l’utiliser
pour piloter une LED. Nous allons basculer la LED avec un peu de retard.
Le courant nominal maximum pour les LED est généralement compris entre 20 et
30 mA.
Afin de limiter le courant traversant la LED, nous connectons une résistance en série avec elle.
En supposant que la LED présente une chute de tension directe de 0,7 V et qu'un courant de
10 mA soit suffisant pour qu'elle s'allume correctement, la valeur de la résistance requise peut
être calculée comme suit :
Donc,
La valeur standard la plus proche de la résistance disponible est 470Ω. Donc, cette valeur est
utilisée dans le circuit.
/*
www.electronicwings.com
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
/*
In order to make only PD3 as output while keeping direction of other pins as it is, do the following
PORTD = PORTD | (1<<3); /* Making PD3 high. This will make LED ON */
_delay_ms(100);
PORTD = PORTD & (~(1<<3)); /* Making PD3 low. This will make LED OFF */
_delay_ms(100);
/* Do not keep very small delay values. Very small delay will lead to LED appearing continuousl
y ON due to persistence of vision */
}
return 0;
}
Exemple 2
Écrivons un code pour lire le statut de la broche en entrée. Nous indiquerons cet état sur LED.
Nous utilisons switch comme entrée. Le commutateur est connecté à PD2 du contrôleur.
Nous utilisons des voyants comme indicateur de l’état de la broche PD2. La LED est
connectée à PD3.
Remarque :
Dans ce code, nous allons montrer l'état de la broche sur la LED. Nous ne montrerons
pas l'état de l'interrupteur sur la LED.
Lorsque le commutateur est ouvert, la broche est HAUTE, le voyant est allumé.
Lorsque l’interrupteur est enfoncé, la broche est BAS, le voyant est éteint.
/*
www.electronicwings.com
*/
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
else
{
return 0;
}
Comprendre les broches d'E / S
Toutes les broches du port ont des résistances de tirage sélectionnables individuellement avec
une résistance indépendante de la tension d'alimentation. Toutes les broches ont des diodes de
protection sur VCC et sur la terre.
États Pin
Une broche de port peut avoir quatre états différents en fonction de l'état des bits
correspondant à cette broche dans le registre de direction des données (DDRx) et le
registre de données (PORTx) de ce port spécifique.
0 0 E Non État (Z )
Sortie haute
1 1 S Non
(Source)
Comme indiqué dans le schéma équivalent des broches d'E / S, chaque broche de port
possède une résistance de tirage interne. Cette résistance interne à toutes les broches
peut être désactivée en écrivant 1 dans le bit PUD du registre SFIOR. Lorsque cela est
fait, les broches sont à (états à haute impédance) si DDRxn = 0 et PORTxn = 1.
Lors de la configuration de broches en tant que broches de sortie avec la logique HIGH,
assurez-vous que la broche n'est pas directement connectée à la terre.
Lors de la configuration de broches en tant que broches de sortie avec une logique LOW,
assurez-vous que la broche n'est pas directement connectée à Vcc.
Lors de la configuration des broches en tant que broches d'entrée, il faut garder à l'esprit
la structure de tension interne et effectuer les connexions en conséquence.
Chapitre 4 : ADC dans AVR ATmega16 / ATmega32
Introduction
Le convertisseur analogique-numérique (ADC) est l’appareil le plus largement utilisé dans les
systèmes intégrés spécialement conçu pour l’acquisition de données. Dans la série AVR
ATmega, un contrôleur ADC 10 bits est normalement intégré au microcontrôleur.
ATmega16 / 32 prend en charge huit canaux ADC, ce qui signifie que nous pouvons connecter
huit entrées analogiques à la fois. Les canaux ADC 0 à 7 sont présents sur PORTA. c'est-à-dire
les broches n ° 33 à 40.
C'est-à-dire que lorsque l'entrée est 0V, la sortie numérique sera 0V et quand l'entrée sera 5V
(Vref = 5V), nous obtiendrons la sortie numérique la plus élevée correspondant à 1023 pas, ce
qui correspond à 5V.
Donc,
ATmega16 / 32 ADC
Registre ADC
Les deux premiers registres contiennent les données numériques converties, sur 10 bits.
ADMUX Inscrivez-vous
0 0 Broche AREF
1 0 Réservé
1 1 Interne 2.56v
Nous pouvons sélectionner le canal d'entrée ADC0 à ADC7 en utilisant ces bits. Ces bits sont
également utilisés pour sélectionner des entrées de comparateur (intégrées dans AVR) avec un
gain différent. Nous couvrirons ces opérations de comparaison dans une autre partie.
La sélection du canal est très facile, il suffit de mettre le numéro du canal dans MUX4: 0.
Supposons que vous connectiez une entrée au canal ADC 2, alors mettez 00010 dans MUX4: 0.
Supposons que vous connectiez une entrée au canal ADC 5, alors insérez 00101 dans MUX4: 0.
Registre ADCSRA:
Bit 7 - ADEN: Activer ADC
L'écriture de 1 sur ce bit active le CAN. En l'écrivant à zéro, le CAN est désactivé. La mise hors
tension de l’ADC pendant qu’une conversion est en cours met fin à cette conversion.
Ce bit est activé lorsqu'une conversion ADC est terminée et que les registres de données sont
mis à jour.
Ces bits déterminent le facteur de division entre la fréquence XTAL et l’horloge d’entrée du CAN.
Pour notre AVR, Nous devons toujours veiller à ne pas dépasser la fréquence ADC supérieure à
200 KHz. Supposons que votre fréquence d'horloge de l'AVR soit de 8 MHz, alors nous devons
utiliser le scrutateur 64 ou 128. Parce que cela donne 8 MHz / 64 = 125 KHz, ce qui est inférieur
à 200 KHz.
Schéma
Programme
}
ADC_Read(char channel)
{
int Ain,AinLow;
int main()
{
char String[5];
char String[5];
int value;
ADC_Init();
LCD_Init(); /* Initialization of LCD */
LCD_String("ADC value"); /* Write string on 1st line of LCD */
while(1)
{
2/ www.electronicwings.com
3/
CHAPITRE 5 :
ATmega328 est équipé d’un complément puissant et flexible de 26 sources d’interruption. Deux des
interruptions proviennent de sources d'interruption externes, tandis que les 24 autres interruptions prennent
en charge le fonctionnement des périphériques embarqués sur le microcontrôleur.
Les sources d'interruption ATmega328 sont illustrées à la figure 1.
Le RESET a la priorité la plus élevée, suivi des broches externe INT0 (pin4) et INT1 (pin5). Les sources
d'interruption restantes sont internes à l'ATmega328.
Quand une interruption se produit, le microcontrôleur termine l’instruction en cours, stocke l’adresse de la
prochaine instruction sur la pile et commence à exécuter les instructions dans le répertoire désigné le
programme de service d’interruption (ISR) correspondant à la source d’interruption particulière.
Le système d’interruption empêche d’autres interruptions en cours. L'exécution du L’ISR est exécuté en
chargeant l’adresse de début de la routine de service d’interruption spécifique à cet événement.
Après avoir déterminé les pins d’interruption Il faut encore savoir le nom de la fonction
d’interruption associée à une cause d'IT,( associer au vecteur d'interruption: ISR(INT0_vect) {
nos instructions }) Figure 5.1 .
Exemple :
Chaque fois que le bouton poussoir fait passer le niveau de 1 a 0 sur l'entree INT0(PD2),la fonction
d''interruption associee a INT0 est executee. Cette action a pour effet d'inverser l'etat de la LED et
de revenir au programme principal. Il est important de comprendre que l'interruption ne dure que
quelques microsecondes. En dehors de ces interruptions, le programme principal (fonction loop())
envoie chaque seconde la valeur de la variable cpt.
Exemple : exploitation IT Externe 0
Le microcontrôleur ATmega328 accepte des interruptions possibles sur toute entrée TOR (Interruptions
"Pin Change")
Chaque front, montant ou descendant, conduit à une interruption Pin Change (PCINT0_vect, PCINT1_vect,
PCINT2_vect) permettent d'associer une fonction (ISR) à un changement d'état d'une entrée.
Donc les broches PCINT0 à PCINT23 sont configurables pour déclencher des interruptions suite à des
changements d'état ("Pin Change") Les broches sont séparées en 3 sous-groupes, il y a une source
d'interruption par sous-groupe, et pour chaque broche on peut activer ou non le système "Pin Change
Interrupt"
PCINT0 – PCINT7 <-> broches PB0 à PB7 groupe lié à IT PCINT0_vect
PCINT8 – PCINT15 <-> broches PC0 à PC7 groupe lié à IT PCINT1_vect
PCINT16 – PCINT23<-> broches PD0 à PD7 groupe lié à IT PCINT2_vect
Les registres PCMSK0, PCMSK1 et PCMSK2 contrôlent, pour chacun de ces groupes (donc pour chaque
port B, C D), quelle(s) broche(s) peut(vent) conduire (ou non) à une interruption de type "pin change".
Pour les autre type d’interruption comme les timers on va les exploiter dans les prochaines sections.
Les interruptions arduino :
3/ attachInterrupt(interrupt, function, mode). This function links the interrupt to the appropriate
• mode. Mode specifies what activity on the interrupt pin will initiate the interrupt:LOW level
void setup()
{
attachInterrupt(0, int0_ISR, RISING);
}
void loop()
{
//wait for interrupts
}
//*************************************************************************
//int0_ISR: interrupt service routine for INT0
//*************************************************************************
void int0_ISR(void)
{
//Insert interrupt specific actions here.
}
Référencées :
1/ Fiche technique ATmega16 et ATmega32
2/ www.arduino.cc
Généralement, nous utilisons les Timer/Counter pour générer des retards, des formes d’onde, pour
compter les événements ou pour la génération PWM, etc.
La valeur de ce registre est comparée au contenu du registre TCNTn. Quand ils sont égaux, le
drapeau OCFn sera activé.
Configuration du Timer/Counter 0
Le choix du mode se fait via les bits WGM02:00 (bits TCR0A et TCR0B)
Clear Timer on Compare Match (CTC) Mode :
En mode CTC (WGM02:0 = 2), le registre OCR0A regle la resolution. Le compteur TCTN0 est
remis a zero apres l'egalite (match) TCTN0=OCR0A. Le registre OCR0A definit la valeur
Prescaler : en fonction temporisateur, le registre de comptage TCNT0 est incremente en fonction des
cycles horloge. L'increment peut etre a chaque cycle horloge (pas de prescaler) ou bien a une frequence
moindre. Rappelons que le cycle horologe est de 1/16 micro-secondes.
Exemple :
Pour le Timer 0, a chaque debordement de TCNT0 (passage de 0xFF a 0x00) une interruption
et configurer le Timer 0.
cpt=0;
}}
void setup(){
//Configuration PORTB.5
DDRB |= 0x20; // PB5 en sortie
PORTB &= ~0x20; // PORTB.5 <-0
cli();
// Configuration Timer 0
TCCR0A=0; // Mode Normal (pas PWM)
TCCR0B=0x07; // Prescaler 1024 (Clock/1024)
TIMSK0=0x01; // IT Timer0 Over Flow Active
sei(); // activation des IT (SREG.7=1)
}
Introduction :
La modulation de largeur d'impulsion (PWM) est une technique qui permet de faire varier la largeur
d'une impulsion tout en maintenant la fréquence constante.
Une période d'impulsion comprend un cycle ON (5V) et un cycle OFF (0V). La fraction pour laquelle
le signal est activé sur une période est appelée cycle de travail.
Par exemple, considérons une impulsion avec une période de 10 ms qui reste activée (haute) pendant
2 ms. Le cycle de service de cette impulsion sera
Grâce à la technique PWM, nous pouvons contrôler la puissance fournie à la charge en utilisant le
signal ON-OFF.
Les signaux modulés en largeur d'impulsion avec différents rapports cycliques sont indiqués ci-dessous
Nous devons configurer le registre du timer pour générer des PWM. La sortie PWM sera générée sur
la broche de comparaison de sortie du programmateur (OCx) correspondante.
La sortie PWM est en quelque sorte proche de la sortie analogique. Nous pouvons l'utiliser comme
sortie analogique pour générer une onde sinusoïdale, des signaux audio, etc.
Référencées :
1/ Fiche technique ATmega16 et ATmega32
2/ www.arduino.cc
3/ B. Cottenceau : Carte ARDUINO UNO Microcontrôleur ATMega328 - 2016-2017.
4/ http://www.electronicwings.com
CHAPITRE 7 EEPROM dans AVR ATmega16 / ATmega32
Introduction
L'EEPROM est une mémoire à lecture seule programmable effaçable électriquement. Il s'agit
d'une mémoire de type non volatile car elle contient les données même lorsque l'ordinateur est
hors tension.
Le principal avantage de cette mémoire est que le contrôleur peut lire, modifier / écrire cette
mémoire dans une application d'exécution. Ainsi, la mémoire EEPROM peut être utilisée pour
stocker des valeurs de capteur, des paramètres importants, etc. sans craindre de perte, même
en cas de panne de courant.
L'ATMEGA32 contient 1024 octets de données dans la mémoire EEPROM. Elle est
organisée comme un espace de donné séparé, dans lequel des octets simples peuvent être lus
et écrits. L'EEPROM a une endurance d'au moins 100,000 cycles d’écriture/effacement. Il est
organisé comme un espace de données séparé dans lequel un seul octet peut être lu et écrit.
L'EEDR contient des données à écrire / lire à l'emplacement adressé par EEAR lors d'une
opération d'écriture / lecture.
EECR contient des bits de contrôle permettant d’avoir accès via EEPROM.
Bit 7: 4:
Ces bits sont réservés et toujours lus à zéro.
1 = autorisation d'écriture.
0 = écriture désactivée.
Si vous définissez EEWE alors que EEAR et EEDR contiennent l'adresse et les données
correctes et que le bit EEMWE est activé, effectuez une opération d'écriture.
1 = autorisation de lecture.
0 = lecture désactivée.
Le réglage de EERE alors que EEAR contient l’adresse appropriée permet la lecture.
Pour éviter les écritures EEPROM non intentionnelles, vous devez suivre cette procédure, car
EEWE doit être écrit dans l'un au cours du prochain cycle, après la définition de EEMWE sur
1
Le fichier d’en-tête contient toutes les fonctions d’accès EEPROM indiquées ci-dessous,
uint8_t eeprom_read_byte (const uint8_t *__p); /* Read one byte from EEPROM address */
uint16_t eeprom_read_word (const uint16_t *__p); /* Read one 16-bit word from EEPROM address */
uint32_t eeprom_read_dword (const uint32_t *__p); /* Read one 32-bit double word from EEPROM address*/
float eeprom_read_float (const float *__p); /* Read one float value from EEPROM address */
void eeprom_read_block (void *__dst, const void *__src, size_t __n);/* Read a block of n bytes from EEPROM address
to SRAM */
void eeprom_write_byte (uint8_t *__p, uint8_t __value); /* Write a byte value to EEPROM address */
void eeprom_write_word (uint16_t *__p, uint16_t __value);/* Write a word to EEPROM address */
void eeprom_write_dword (uint32_t *__p, uint32_t __value);/* Write a 32-bit double word to EEPROM address */
void eeprom_write_float (float *__p, float __value); /* Write float value to EEPROM address */
void eeprom_write_block (const void *__src, void *__dst, size_t __n);/* Write a block of bytes to EEPROM address */
void eeprom_update_byte (uint8_t *__p, uint8_t __value);/* Update byte value to EEPROM address */
void eeprom_update_word (uint16_t *__p, uint16_t __value);/* Update word val to EEPROM address */
void eeprom_update_dword (uint32_t *__p, uint32_t __value);/* Update a 32-bit double word value to EEPROM address */
void eeprom_update_float (float *__p, float __value); /* Update float value to EEPROM address */
void eeprom_update_block (const void *__src, void *__dst, size_t __n);/* Up- date a block of bytes to EEPROM address */
Les fonctions ci-dessus sont utilisées pour écrire / lire une EEPROM. Il existe également une
prise en charge des opérations de données 8, 16 et 32 bits avec différents types de données
tels que integer, float, double.
La fonction de mise à jour est principalement recommandée pour l'écriture (mise à jour) de
l'EEPROM,
#include <EEPROM.h>
1
Écrire dans la mémoire EEPROM
Écrire un octet en mémoire ce fait au moyen de la fonction EEPROM.write().
1#include <EEPROM.h>
2
3void setup() {
4 Serial.begin(9600);
5
6 for (int i = 0; i < 256; i++) {
7 byte valeur = EEPROM.read(i);
8 Serial.print(i);
9 Serial.print(" = ");
10 Serial.println(valeur);
11 }
12}
13void loop() {
14}
Mettre à jour les données efficacement
Imaginons que la mémoire EEPROM de votre carte Arduino contient la suite d'octets suivante
: 1 2 3 4 5 6.
Le temps passe et vous voulez maintenant changer ces valeurs par 1 2 3 7 8 9, comme vous
pouvez le remarquer, certaines valeurs sont identiques, il serait donc idiot de perdre un cycle
d'écriture pour écrire une valeur identique à la précédente.
C'est pourquoi il existe la fonction EEPROM.update(). Celle-ci est identique à la
fonction EEPROM.write() mais vérifie d'abord la valeur en mémoire avant de faire une
écriture. Si la valeur est différente, l'écriture est réalisée, sinon, la fonction ne fait rien.
PS : Idéalement, cette fonction devrait toujours être utilisée, en remplacement
de EEPROM.write(), car celle-ci fonctionne de manière identique, mais évite les écritures
inutiles.
1#include <EEPROM.h>
2
3void setup() {
4 Serial.begin(9600);
5
6 Serial.print("Taille EEPROM : ");
7 Serial.println(EEPROM.length());
8}
9
1 void loop() {}
Référencées :
1/ Fiche technique ATmega16 et ATmega32
2/ www.arduino.cc
3/ https://www.carnetdumaker.net/articles/stocker-des-donnees-en-memoire-eeprom-avec-une-
carte-arduino-genuino/
4/ http://www.electronicwings.com
CHAPITRE 8
USART dans AVR ATmega16 / ATmega32
Introduction
L'AVR ATmega dispose d'un système USART flexible, qui peut être utilisé pour la communication
série avec d'autres périphériques tels qu'un ordinateur, des modules série GSM, des modules GPS,
etc.
La communication série :
Lors de l’envoi / réception de données, certains bits sont ajoutés afin de connaître le début / la fin des
données, etc. La structure couramment utilisée est la suivante : 8 bits de données, 1 bit de départ (0
logique) et 1 bit d’arrêt (logique 1), comme indiqué :
Il existe également d'autres formats de trame pris en charge disponibles dans UART, tels que le bit de
parité, les bits de données variables (5 à 9 bits de données).
Connexion matérielle :
Normalement, dans USART, nous n’avons besoin que des fils Tx (transmission), Rx (réception) et
GND.
AVR ATmega USART a un niveau de tension TTL qui est 0 v pour la logique 0 et 5 v pour la
logique 1.
Dans les ordinateurs et la plupart des anciens périphériques, le protocole RS232 est utilisé pour
la communication série, où un connecteur 9 broches est normalement utilisé. La
communication série RS232 a des niveaux de tension différents de ceux de la communication
série ATmega, à savoir +3 v à +25 v pour le zéro logique et -3 v à -25 v pour la logique 1.
Donc, pour communiquer avec le protocole RS232, nous devons utiliser un convertisseur de
niveau de tension comme le MAX232 IC.
Comme indiqué dans la fiche technique ATmega 16 USART présente les caractéristiques suivantes
Il a essentiellement deux registres, l’un est Tx. Byte et autre est Rx Byte. Les deux partage le même
registre UDR. N'oubliez pas que lorsque nous écrivons au registre UDR. Le tampon Tx sera écrit et
lorsque nous lirons à partir de ce registre, le tampon Rx sera lu. Le tampon utilise un registre à décalage
FIFO pour transmettre les données.
2. UCSRA : Registre de contrôle et d'état USART A. Comme son nom l'indique, est utilisé pour
les indicateurs de contrôle et d'état. De manière similaire, il existe deux autres registres de contrôle et
de statut USART, à savoir UCSRB et UCSRC.
3. UBRR : USART Baud Rate Register, il s’agit d’un registre 16 bits utilisé pour définir le débit
en bauds.
Ce bit de drapeau est défini l’orsqu'il y a des données non lues dans UDR. Le drapeau RXC peut être
utilisé pour générer une interruption de réception complète.
Ce bit indicateur est défini lorsque la trame entière de la mémoire tampon Tx est décalée et qu’aucune
nouvelle donnée n’est actuellement présente dans la mémoire tampon de transmission (UDR). Le bit
de drapeau TXC est automatiquement effacé lorsqu’une interruption de transmission complète est
exécutée ou peut être effacé en écrivant un 1 dans son emplacement de bit. L'indicateur TXC peut
générer une interruption de transmission terminée.
Si UDRE est 1, le tampon est vide, ce qui indique que le tampon de transmission (UDR) est prêt à
recevoir de nouvelles données. L'indicateur UDRE peut générer une interruption vide du registre de
données. UDRE est défini après une réinitialisation pour indiquer que le transmetteur est prêt.
Ce bit est activé si une condition de dépassement de données est détectée. Une surcharge de données
se produit lorsque le tampon de réception est plein (deux caractères) et qu'un nouveau caractère est en
attente dans le registre à décalage de réception.
Les bits UCSZ2 combinés avec le bit UCSZ 1: 0 dans UCSRC définissent le nombre de bits de données
(taille de caractère) dans une trame utilisée par le récepteur et l'émetteur.
Ce bit sélectionne l'accès au registre UCSRC ou au registre UBRRH , car les deux registres partagent
la même adresse. L'URSEL doit être un lors de l'écriture de l'UCSRC, sinon les données seront écrites
dans le registre UBRRH.
0 = fonctionnement asynchrone
1 = fonctionnement synchrone
Ces bits permettent d'activer et de définir le type de génération et de contrôle de parité. Si une non-
concordance est détectée, l'indicateur PE dans UCSRA sera défini.
UPM1 UPM0 Mode Parité
0 0 désactivé
0 1 Réservé
Ce bit sélectionne le nombre de bits d'arrêt à insérer par le transmetteur. Le récepteur ignore ce
paramètre. 0 = 1 bit ; 1 = 2 bits
Les bits UCSZ1: 0 combinés avec le bit UCSZ2 dans UCSRB définissent le nombre de bits de données
(taille de caractère) dans une trame utilisée par le récepteur et l'émetteur.
0 0 0 5 bits
0 0 1 6 bits
0 1 0 7 bits
0 1 1 8 bits
1 0 0 Réservé
1 0 1 Réservé
1 1 0 Réservé
1 1 1 9 bits
Ce bit est utilisé uniquement pour le mode synchrone. Ecrivez ce bit à zéro lorsque le mode asynchrone
est utilisé.
Ce bit sélectionne l'accès au registre UCSRC ou au registre UBRRH , car les deux registres partagent
la même adresse. L'URSEL doit être un lors de l'écriture de l'UCSRC, sinon les données seront écrites
dans le registre UBRRH.
Exemple: supposons que Fosc = 8 MHz et le débit en bauds requis = 9600 bps.
Nous pouvons également définir cette valeur avec du code c en utilisant une macro pré-processeur
comme suit.
BAUD_PRESCALE est la valeur que nous devons charger dans le registre UBRR pour définir le débit
en bauds défini.
Étapes de programmation
Initialisation de USART
Arduino prend en charge la communication série (UART). Avec cela, on peut communiquer avec un
PC ou avec d'autres modules Arduino prenant en charge l'interface de communication série.
Avec la carte Arduino, vous pouvez envoyer toutes les données du PC à la carte Arduino ou de la carte
Arduino au PC en utilisant la communication série. Mais vous n'avez pas besoin de port serila séparé
(par exemple, port RS 232) pour cette communication. Vous pouvez utiliser le port USB que vous
utilisez pour programmer Arduino afin d’effectuer une communication série comme indiqué ci-
dessous.
En termes de logiciel, la communication série va comme ci-dessous. Comme vous le savez, si vous
téléchargez le programme, celui-ci est exécuté sur un chipset Arduino. Lorsque le programme exécute
la bibliothèque Serial, il communique avec le programme Arudio Serial Monitor comme indiqué ci-
dessous.
Lorsque la fonction Serial.read () est exécutée, elle reçoit les données envoyées par Arduino Serial
Monitor. Lorsque la fonction Serial.pring () est exécutée, la carte Arduino envoie les données au port
série du PC et est éventuellement acheminée au moniteur série Arduino.
Command Description
Serialn.end() Disables serial communication. Allows Digital 1(TX) and Digital (0) RX
to be used for digital input and output.
Serialn.available() Determines how many bytes have already been received and stored in the
128 byte buffer.
Serialn.print() Prints data to the serial port as ASCII text. An optional second parameter
specifies the format for printing (BYTE, BIN, OCT, DEC, HEX).
Serialn.println() Prints data to the serial port as ASCII text followed by a carriage return.
Serialn.write() Writes binary data to the serial port. A single byte, a series of bytes, or an
array of bytes may be sent.
SPI dans AVR ATmega16 / ATmega32
Introduction
L'interface de périphérique série (SPI) est un protocole de connexion d'interface de bus lancé à l'origine
par Motorola Corp. Il utilise quatre broches pour la communication.
Il possède deux broches pour le transfert de données appelées SDI (entrée de données série) et SDO
(sortie de données série). La broche SCLK (horloge série) est utilisée pour synchroniser le transfert de
données et le maître fournit cette horloge. La broche CS (Chip Select) est utilisée par le maître pour
sélectionner un périphérique esclave.
Les périphériques SPI ont des registres à décalage de 8 bits pour envoyer et recevoir des
données. Chaque fois que le maître doit envoyer des données, il place les données dans un registre à
décalage et génère l'horloge requise. Chaque fois que le maître veut lire des données, l'esclave place
les données dans un registre à décalage et le maître génère l'horloge requise. Notez que SPI est un
protocole de communication en duplex intégral, c’est-à-dire que les données des registres à décalage
maître et esclave sont échangées en même temps.
Le maître reçoit les données et l'esclave transmet les données via cette broche.
Le maître transmet les données et l'esclave reçoit les données via cette broche.
SS (Slave Select)
L'interconnexion entre maître et esclave à l'aide de SPI est illustrée dans la figure ci-dessous.
AVR ATmega32 utilise trois registres pour configurer la communication SPI, à savoir Registre de
contrôle SPI, Registre d'état SPI et Registre de données SPI.
1 = Activer SPI.
0 = Désactiver SPI.
1 = mode maître.
0 = mode esclave.
0 0 0 Fosc / 4
0 0 1 Fosc / 16
0 1 0 Fosc / 64
0 1 1 Fosc / 128
1 0 0 Fosc / 2
1 0 1 Fosc / 8
1 1 0 Fosc / 32
1 1 1 Fosc / 64
Ce bit est activé lors de l'écriture dans le registre de données SPI lors du transfert de données
précédent.
Registre de données SPI utilisé pour transférer des données entre le fichier de registre et le
registre à décalage SPI.
L'écriture dans le SPDR initie la transmission de données.
Le maître écrit un octet de données dans SPDR. L'écriture sur SPDR démarre la transmission
de données.
Les données 8 bits commencent à être décalées vers l'esclave et, après le décalage de l'octet
complet, le générateur d'horloge SPI s'arrête et le bit SPIF est activé.
L'interface SPI esclave reste en veille tant que la broche SS est maintenue au niveau haut par
le maître.
Il s'active uniquement lorsque la broche SS est enfoncée bas. Les données sont décalées avec
l'horloge SCK entrante depuis le maître pendant l'opération d'écriture.
SPIF est défini après le décalage complet d'un octet.
Schéma d'interface
Fonction SPI_Init
}
Étapes d'écriture du maître SPI
Étant donné que l'écriture dans SPDR génère un SCK pour la transmission, écrivez des données
factices dans le registre SPDR.
Attendez la fin de la transmission, c’est-à-dire le drapeau SPIF d’enquête, jusqu’à ce qu’il
devienne élevé.
Lorsque l'indicateur SPIF est défini, lisez les données reçues demandées dans SPDR.
Fonction SPI_Read
/*
* ATmega16_Master.c
* http://www.electronicwings.com
*/
#define F_CPU 8000000UL /* Define CPU Frequency 8MHz */
#include <avr/io.h> /* Include AVR std. library file */
#include <util/delay.h> /* Include Delay header file */
#include <stdio.h> /* Include Std. i/p o/p file */
#include <string.h> /* Include String header file */
#include "LCD_16x2_H_file.h" /* Include LCD header file */
#include "SPI_Master_H_file.h" /* Include SPI master header file */
int main(void)
{
uint8_t count;
char buffer[5];
LCD_Init();
SPI_Init();
LCD_String_xy(1, 0, "Master Device");
LCD_String_xy(2, 0, "Sending Data: ");
SS_Enable;
count = 0;
while (1) /* Send Continuous count */
{
SPI_Write(count);
sprintf(buffer, "%d ", count);
LCD_String_xy(2, 13, buffer);
count++;
_delay_ms(500);
}
Fonction SPI_Init
Il a la même fonction et les mêmes étapes que nous utilisons SPI Write en mode Master.
Fonction SPI_Receive
* ATmega32_SPI_Slave.c
* http://www.electronicwings.com
*/
#define F_CPU 8000000UL /* Define CPU Frequency 8MHz */
#include <avr/io.h> /* Include AVR std. library file */
#include <util/delay.h> /* Include Delay header file */
#include <stdio.h> /* Include std. i/p o/p file */
#include <string.h> /* Include string header file */
#include "LCD_16x2_H_file.h" /* Include LCD header file */
#include "SPI_Slave_H_file.h" /* Include SPI slave header file */
int main(void)
{
uint8_t count;
char buffer[5];
LCD_Init();
SPI_Init();
}
Arduino SPI
L'interface série périphérique (SPI) est un protocole de données série synchrone utilisé par les
microcontrôleurs pour communiquer rapidement avec un ou plusieurs périphériques sur de courtes
distances. Il peut également être utilisé pour la communication entre deux microcontrôleurs.
MISO (Master In Slave Out) - La ligne Slave pour l’envoi de données au maître,
MOSI (Master Out Slave In) - La ligne Master d’envoi de données aux périphériques,
SCK (Serial Clock) - Les impulsions d'horloge qui synchronisent la transmission de données
générée par le maître
SS (Slave Select) - la broche sur chaque périphérique que le maître peut utiliser pour activer et
désactiver des périphériques spécifiques.
Lorsque la broche Slave Select d’un périphérique est faible, il communique avec le maître. Quand
il est haut, il ignore le maître. Cela vous permet d'avoir plusieurs périphériques SPI partageant les
mêmes lignes MISO, MOSI et CLK.
Pour écrire du code pour un nouveau périphérique SPI, vous devez noter quelques points:
Arduino utilisera automatiquement la meilleure vitesse, qui est égale ou inférieure au nombre que
vous utilisez avec SPISettings .
Les données sont-elles décalées en premier (MSB) ou au bit le moins significatif (LSB)? Ceci est
contrôlé par le deuxième paramètre SPISettings , MSBFIRST ou LSBFIRST. La plupart des puces
SPI utilisent le premier ordre de données MSB.
L'horloge de données est-elle inactive à l'état haut ou bas? Les échantillons sont-ils sur le front
montant ou descendant des impulsions d'horloge? Ces modes sont contrôlés par le troisième
paramètre de SPISettings .
De manière générale, il existe quatre modes de transmission. Ces modes contrôlent si les données
entrent et sortent sur le front montant ou descendant du signal d'horloge de données (appelé phase
d' horloge ) et si l'horloge est inactive à l'état haut ou bas (appelée polarité de l'horloge ). Les quatre
modes combinent la polarité et la phase en fonction de ce tableau:
Clock Polarity Clock Phase Output Data
Mode
(CPOL) (CPHA) Edge Capture
SPI_MODE0 0 0 Falling Rising
SPI_MODE1 0 1 Rising Falling
SPI_MODE2 1 0 Rising Falling
SPI_MODE3 1 1 Falling Rising
Une fois que vous avez défini vos paramètres SPI, utilisez SPI.beginTransaction () pour
commencer à utiliser le port SPI. Le port SPI sera configuré avec tous vos paramètres. Le moyen
le plus simple et le plus efficace d'utiliser SPISettings se trouve directement dans
SPI.beginTransaction ().
Par exemple:
Si d'autres bibliothèques utilisent SPI à partir d'interruptions, elles ne pourront pas accéder à SPI
jusqu'à ce que vous appeliez SPI.endTransaction(). Les paramètres SPI sont appliqués
au début de la transaction et SPI.endTransaction() ne modifient pas lesparamètres
SPI. Sauf si vous ou une bibliothèque appelez beginTransaction une seconde fois, les paramètres
sont conservés . Vous devriez essayer de minimiser le temps qui s'écoule avant
d'appeler SPI.endTransaction(), pour une meilleure compatibilité si votre programme est
utilisé avec d'autres bibliothèques qui utilisent SPI.
Exemples
Vdd est connecté au 5 V, Vss à la masse GND, /CS au connecteur D10, SCK au connecteur D13, SDI au
connecteur D11 et enfin SDO au connecteur D12 de l'Arduino Uno. Maintenant, on fait varier la sortie
du MCP4162 avec le programme suivant :
/*
Example 34.1 - SPI bus demo using a Microchip MCP4162 digital potentiometer
http://tronixstuff.com/tutorials > chapter 34 | CC by-sa-nc | John Boxall
*/
void setup()
{
pinMode(ss, OUTPUT); // we use this for SS pin
SPI.begin(); // wake up the SPI bus.
SPI.setBitOrder(MSBFIRST);
// our MCP4162 requires data to be sent MSB (most significant byte) first
}
void loop()
{
for (int a = 0; a < 256; a++)
{
setValue(a);
delay(del);
}
for (int a = 255; a >= 0; --a)
{
setValue(a);
delay(del);
}
}
I2C dans AVR ATmega16 / ATmega32
Introduction
I2C (Inter Integrated Circuit) est un protocole de connexion d'interface de bus série. Il est également
appelé TWI (interface à deux fils) car il utilise seulement deux fils pour la communication, deux fils
appelés SDA (données série) et SCL (horloge série). L’ATmega16 / ATmega32 à base d’AVR possède
un module TWI composé de plusieurs sous-modules, comme indiqué sur la figure.
Mode maître
Mode esclave
Ces broches sont utilisées pour interfacer les périphériques externes et le microcontrôleur basés
sur TWI.
Les pilotes de sortie contiennent un limiteur de vitesse de balayage. Les étages d’entrée
contiennent une unité de suppression de pointes qui supprime les pointes inférieures à 50 ns.
Unité de contrôle
L'unité de contrôle contient TWSR (registre d'état TWI), TWCR (registre de contrôle TWI).
Il contrôle le processus global d'attention pour les événements nécessaires, identifiant les
événements qui se produisent, l'assertion d'interruption TWINT et la mise à jour de TWSR.
Tant que le drapeau TWINT est réglé, SCL est maintenu bas. TWINT défini chaque fois que
TWI termine la tâche en cours.
Ce bit est activé chaque fois que TWI termine son événement actuel (comme démarrer, arrêter,
transmettre, recevoir, etc.).
Tandis que le bit I dans SREG et le bit TWIE dans TWCR sont activés, le vecteur d'interruption
TWI est appelé chaque fois qu'une interruption TWI se produit.
L'indicateur d'interruption TWI doit être effacé par le logiciel en y écrivant une
logique. Ce bit n'est pas automatiquement effacé par le matériel.
Bit 6 - TWEA: bit d'accusé de réception d'activation TWI
Il s'agit du bit d'activation de l'accusé de réception TWI. Il est défini en mode récepteur pour
générer un accusé de réception et effacé en mode émission.
Le dispositif maître a activé ce bit pour générer la condition START en surveillant l’état du
bus libre afin de prendre le contrôle sur le bus TWI.
Le dispositif maître a activé ce bit pour générer une condition STOP afin de laisser le contrôle
sur le bus TWI.
Ce bit est activé lors de l'écriture dans le registre TWDR avant la fin de la transmission actuelle,
c.-à-d. Que TWINT est faible.
Ce bit est activé pour activer l'interface TWI dans le périphérique et prend le contrôle des
broches d'E / S.
Bit 1 - Réservé
Ce bit est utilisé pour activer la routine d'interruption TWI alors que le bit I de SREG est défini
tant que l'indicateur TWINT est élevé.
TWI bits de pré-détartreur utilisés dans la formule de débit pour calculer la fréquence SCL
TWPS1 TWPS0 Exposant Valeur du détartreur
0 0 0 1
0 1 1 4
1 0 2 16
1 1 3 64
Les bits d'adresse TWI contiennent une adresse TWI de 7 bits avec laquelle il peut être appelé
par d'autres maîtres en mode esclave.
Le bit d'activation d'appel général TWI, lorsqu'il est activé, permet la reconnaissance de l'appel
général sur le bus TWI
Il existe quatre modes de transmission dans I2C dans lesquels le périphérique I2C fonctionne.
1 Émetteur maître (MT) Le dispositif maître écrit des données sur SDA.
2 Maître Récepteur (MR) Le dispositif maître lit les données à partir de SDA.
3 Émetteur Esclave (ST) Le périphérique esclave écrit des données sur SDA.
4 Récepteur esclave (SR) Le périphérique esclave lit les données à partir de SDA.
Pour programmer l'AVR ATmega32 I2C en mode maître, vous devez d'abord initialiser le module I2C
avec une fréquence SCL, puis exécuter une opération de lecture et d'écriture à l'aide des événements
START, REPEATED START, STOP. Commençons par initialiser le module TWI dans ATmega16.
Initialisation I2C
Pour initialiserATmega16 TWI en mode maître, nous devons définir la fréquence d'horloge SCL en
définissant les valeurs dans le registre TWBR et les bits TWPS dans le registre TWSR.
La valeur TWBR est définie par la formule de fréquence SCL ci-dessus. par exemple
Événements I2C
Comme l’AVR I2C est orienté octet et basé sur des interruptions, c’est-à-dire des interruptions émises
après chaque événement de bus. Des événements tels que Démarrer, Écrire, Lire, Arrêter. Le statut est
également mis à jour après chaque événement de bus. Voyons donc les événements et conditions I2C
avec leurs codes de fonction.
DÉPARTS)
Argument d'entrée: - il a l'argument d'entrée de l'adresse d'écriture du périphérique esclave (SLA + W).
{
uint8_t status; /* Declare variable */
else
return3; /* Else return 3 to indicate SLA+W failed */
}
Fonction I2C_Repeated_Start
Cette fonction génère une condition de démarrage répété pour l'opération de lecture.
Argument d'entrée: - il a l'argument d'entrée de l'adresse de lecture du dispositif esclave (SLA + R).
else
ÉCRIRE (W)
L'événement de données / adresse WRITE est émis par le maître après l'acquittement réussi de
START reçu du périphérique esclave.
Fonction I2C_Write
else
LIRE (R)
L'événement de lecture de données est émis par le maître après la réussite de la condition de
répétition du démarrage.
Fonction I2C_Read_Ack
Cette fonction lit les données disponibles sur la ligne SDA et renvoie son accusé de réception au
périphérique esclave lorsque les données ont été lues avec succès. Elle demande également à l'esclave
de transmettre d'autres données.
Fonction I2C_Read_Nack
Cette fonction lit le dernier octet de données nécessaire disponible sur la ligne SDA mais ne renvoie
pas d'accusé de réception. Auparavant, il indiquait à un esclave que son maître ne voulait pas de
données à venir et voulait arrêter la communication.
STOP (P)
Événement STOP émis par le maître pour indiquer qu’il doit s’arrêter.
Il est généré par une transition faible à élevée sur SDA alors que SCL est élevé.
Fonction I2C_Stop
Exemple
Prenons l'exemple du premier transmetteur principal (MT) et des modes de récepteur maître
(MR). Considérez ATmega16 en tant que mémoire maître et mémoire EEPROM en tant qu'esclave.
Nous pouvons écrire des données sur EEPROM en mode émetteur principal (MT) et les lire à partir de
EEPROM en mode récepteur maître (MR).
1. Initialiser I2C.
2. Générer une condition START.
3. Envoyez l'adresse d'écriture du périphérique esclave (SLA + W) et vérifiez l'accusé de
réception.
4. Écrivez l'adresse de l'emplacement de la mémoire pour les périphériques de mémoire sur
lesquels nous voulons écrire.
5. Ecrire les données jusqu'au dernier octet.
6. Générer une condition STOP.
1. Initialiser I2C.
2. Générer une condition START.
3. Écrire l'adresse du périphérique (SLA + W) et vérifier l'accusé de réception.
4. Écrire l'adresse de l'emplacement de la mémoire pour les périphériques de mémoire.
5. Génère une condition de démarrage répété.
6. Lire les données et renvoyer l'accusé de réception.
7. Retour Pas d'accusé de réception pour le dernier octet.
8. Générer une condition STOP.
Programme
/*
* ATmega16_Master_I2C.c
* http://www.electronicwings.com
*/
int main(void)
I2C_Write(array[i]);
_delay_ms(10);
LCD_Char(I2C_Read_Ack());
return 0;
Ici, pour initialiser ATmega16 en mode esclave, nous devons attribuer une adresse de périphérique à
7 bits dans le registre TWAR. Après l'attribution de l'adresse, nous devons activer TWI et le bit d'accusé
de réception dans TWCR. Et effacez le drapeau d’interruption TWI en y écrivant la logique 1.
void I2C_Slave_Init(uint8_tslave_address)
Écoutez le bus
Le périphérique esclave doit toujours écouter le bus TWI pour vérifier s’il est adressé par un
maître quelconque.
Quand il est adressé, le bit TWINT est activé. Donc besoin de surveiller le bit TWINT.
Fonction I2C_Slave_Listen
int8_t I2C_Slave_Listen()
{ while(1)
else
}}
Transmettre des données
Après avoir été adressé par le maître avec l'adresse SLA + R, l'esclave doit envoyer les données
demandées.
Les données à envoyer doivent être écrites dans le registre TWDR.
Après l’écriture des données, activez TWI avec accusé de réception et désactivez le drapeau
d’interruption.
Si l'accusé de réception n'a pas été reçu du maître, l'appareil esclave effacera l'indicateur
TWINT et écoutera à nouveau le bus.
De même, si REPEATED START / STOP est reçu, le dispositif esclave effacera le drapeau
TWINT et écoutera à nouveau le bus.
Fonction I2C_Slave_Transmit
int8_t I2C_Slave_Transmit(chardata)
{ uint8_t status;
return -1;
return -2; }
return -4;
Une fois adressé par le maître avec l'adresse SLA + W, l'esclave doit recevoir les données
envoyées par le maître.
Après chaque octet reçu, l’esclave doit renvoyer un accusé de réception à son sujet.
Si REPEATED START / STOP est reçu, l’appareil esclave effacera le drapeau TWINT et
écoutera à nouveau le bus.
Fonction I2C_Slave_Recieve
char I2C_Slave_Receive()
/* Check for data received, nack returned & switched to not addressed slave mode */
if(status==0x88||status==0x98)
return -1; }
else
Exemple
Prenons un exemple, ici ATmega16 en tant que périphérique maître et ATmega32 en tant que
périphérique esclave. Le premier appareil maître envoie le compte à l’appareil esclave, puis le même
maître lit l’appareil esclave.
Schéma d'interface
Communication maître esclave ATmega I2C
1. Initialiser I2C.
2. Générer une condition START.
3. Écrire l'adresse du périphérique (SLA + W) et vérifier l'accusé de réception.
4. Après l'accusé de réception, écrivez les données sur l'esclave.
5. Générez une condition de démarrage répété avec SLA + R.
6. Recevoir des données de l'appareil esclave.
/*
* ATmega16_Master.c
* http://www.electronicwings.com
*
*/
#define count 10
int main()
{ char buffer[10];
while (1)
_delay_ms(5);
_delay_ms(500);
_delay_ms(5);
else
_delay_ms(500);
}
Programme pour appareil esclave
/*
* ATmega32_Slave.c
* http://www.electronicwings.com
*/
int main(void)
char buffer[10];
int8_t count = 0;
LCD_Init();
I2C_Slave_Init(Slave_Address);
while (1)
{ case 0:{
do
break;
case 1:
{ int8_t Ack_status;
do
{
count++;
break;
default:
break;
}
Arduino I2C
Intoduction
I2C (Inter-Integrated Circuit) est un protocole de connexion d'interface de bus série. Il est également
appelé TWI (interface à deux fils) car il utilise seulement deux fils pour la communication. Ces deux
fils sont SDA (données série) et SCL (horloge série).
I2C est un protocole de communication basé sur les accusés de réception, c’est-à-dire que l’émetteur
recherche un accusé de réception du récepteur après la transmission des données pour savoir si les
données ont été reçues correctement par le récepteur.
Mode maître
Mode esclave
Le fil SDA (données série) est utilisé pour l’échange de données entre les appareils maître et esclave.
SCL (horloge série) est utilisée pour l’horloge synchrone entre le maître et l’esclave.
L'appareil maître établit la communication avec un appareil esclave. L'adresse d'un appareil esclave
est nécessaire pour engager la conversation. Le périphérique esclave répond à un périphérique maître
lorsqu'il est adressé par un périphérique maître.
Le périphérique I2C a une adresse unique 7 bits ou 10 bits. Ainsi, pour accéder à ces périphériques, un
maître doit les adresser par l’adresse unique 7 bits ou 10 bits.
I2C est utilisé dans de nombreuses applications telles que la lecture de l'horloge temps réel (RTC),
l'accès à la mémoire externe EEPROM. Il est également utilisé dans des modules de capteurs tels qu'un
gyroscope, un magnétomètre, etc.
1. Horloge série (SCL): C'est un signal d'horloge. Les données seront envoyées à d'autres
appareils lors d'un événement d'horloge. Seul le périphérique maître a le contrôle de cette ligne
SCL.
2. Données série (SDA): Il s'agit d'une ligne de données série utilisée pour échanger des
données entre un appareil maître et un appareil esclave.
Il est utilisé pour écrire (transmettre) des données sur le périphérique maître ou esclave.
Paramètre
data il peut s'agir d'une valeur à un octet, d'une chaîne de caractères, d'un tableau de données.
Wire.available ()
Cette fonction est utilisée par un maître ou un esclave pour vérifier si les données demandées sont
disponibles ou non. Il retourne le no. d'octets disponibles.
Wire.read ()
Il est utilisé pour lire les données demandées par le maître à partir de l'esclave ou pour lire les données
transmises d'un maître à un esclave.
Remarque: chaque périphérique esclave I2C a une adresse unique. Lors de la communication via le
protocole I2C, cette adresse esclave doit être utilisée par le maître.
Arduino a Wire Library qui nous permet de communiquer avec des périphériques I2C.
Cette fonction commence une transmission avec le périphérique esclave I2C ayant une adresse
esclave spécifiée.
slave address Adresse 7 bits du périphérique avec lequel nous souhaitons communiquer.
Cette fonction est utilisée par le maître pour demander ou recevoir des données d'un périphérique
esclave. Les données demandées peuvent être lues à l’aide de Wire.read ().
Paramètres
par exemple, Wire.requestFrom (50, 4) // request 4 no. d'octets d'esclave ayant l'adresse 50
Wire.requestFrom (50, 4, true) // cessera de recevoir des données après 4 octets, libérant le bus
Wire.endTransmission ()
Il met fin à une transmission vers un périphérique esclave commencée par beginTransmission () et
transmet les octets mis en file d'attente par write ().
Il initie la bibliothèque Wire et rejoint le bus I2C en tant qu'esclave avec l'adresse spécifiée.
Paramètre : Address Adresse d'esclave 7 bits, si elle n'est pas spécifiée, rejoignez le bus en
tant que maître
Wire.onReceive (gestionnaire)
La fonction de gestionnaire à appeler lorsqu'un périphérique esclave reçoit une donnée transmise d'un
maître.
par exemple
void setup() {
Wire.onRequest (gestionnaire)
par exemple
void setup() {
void loop() {
delay(100);
void requestEvent() {
// as expected by master
Référencées :
2/ www.arduino.cc
3/ http://www.electronicwings.com
Servo Motor
Les servomoteurs sont d'excellents appareils qui peuvent tourner dans une
position spécifiée.
Habituellement, ils ont un bras servo qui peut tourner à 180 degrés. Un
servomoteur a tout intégré : un moteur, un circuit de rétroaction et, plus
important encore, un pilote de moteur. Il a juste besoin d'une ligne
d'alimentation, la GND et d'une broche de contrôle.
Le code suivant fera tourner un servomoteur à 0 degrés, attendez 2 seconde, puis tournez-le à
90, attendez encore 2 seconde, tournez-le à 180, puis revenez en arrière.
Comment ça marche
Les servos sont des appareils intelligents. En utilisant une seule broche d'entrée, ils
reçoivent
la position de l'Arduino et ils y vont. En interne, ils ont un pilote de moteur et un
circuit de rétroaction qui s'assure que le bras du servo atteint la position souhaitée. Mais quel
type de signal reçoivent-ils sur la broche d'entrée?
Il s'agit d'une onde carrée similaire à PWM. Chaque cycle du signal dure 20
millisecondes et la plupart du temps, la valeur est FAIBLE. Au début de chaque cycle, le signal
est ÉLEVÉ pendant un temps compris entre 1 et 2 millisecondes. À 1 milliseconde, il représente
0 degré et à 2 millisecondes, il représente 180 degrés. Entre les deux, il représente la valeur de
0 à 180. Il s'agit d'une méthode très bonne et fiable. Le graphique le rend un peu plus facile à
comprendre.
Exemple 2 :