Projet à microcontrôleur PIC 16F84A / PIC 16F628A
Métronome à son programmable
Un métronome est un instrument permettant de marquer le tempo, vitesse à laquelle doit être jouée une musique.
Il s'agit ici d'une version électronique, avec un son programmable.
Le son est stocké dans une mémoire EEPROM de type 9386 (2048 x 8 bits) : il suffit donc de reprogrammer l'EEPROM pour changer de son.
Le tempo est réglable par un potentiomètre (30 à 230 coups par minute).
Un second potentiomètre ajuste le niveau sonore disponible sur le haut-parleur.
Voici un rappel succinct.
Consulter les data sheets des différents fabriquants (Atmel, Microchip ...) pour plus d'informations.
Nom |
Type |
CS
(Chip Select) |
entrée |
CLK
(Serial data clock) |
entrée |
DI
(Serial Data Input) |
entrée |
DO
(Serial Data Output) |
sortie
3 états (avec un état haute-impédance High-Z) |
Vss
(Ground) |
alimentation |
Vcc
(Power supply) |
alimentation |
ORG*
(Memory Configuration) |
entrée |
PE*
(Program Enable) |
entrée |
* fonction non disponible sur certaines EEPROM
Référence |
Organisation
interne |
9346 |
128
x 8 bits ou 64 x 16 bits |
9356 |
256
x 8 bits ou 128 x 16 bits |
9366 |
512
x 8 bits ou 256 x 16 bits |
9376 |
1024
x 8 bits ou 512 x 16 bits |
9386 |
2048
x 8 bits ou 1024 x 16 bits |
Prenons l'exemple de l'EEPROM 93xx86x de Microchip :
93xx86A : 2048 x 8 bits
93xx86B : 1024 x 16 bits
93xx86C : 2048 x 8 bits ou 1024 x 16 bits
Le choix se fait par le niveau de la broche d'entrée ORG :
PE = 1 : Ecriture et effacement autorisés
PE = 0 : Ecriture et effacement interdits
Instruction |
Description |
EWEN
(Erase/Write enable) |
Autorise les instructions d'écriture (WRITE, WRAL) et d'effacement (ERAL, ERASE) |
EWDS
(Erase/Write disable) |
Interdit les instructions d'écriture (WRITE, WRAL) et d'effacement (ERAL, ERASE). C'est une sécurité contre les écritures ou les effacements intempestifs ... |
WRITE |
Ecrit la donnée spécifiée à l'adresse spécifiée |
WRAL
(Write all) |
Ecrit la donnée spécifiée à toutes les adresses de la mémoire |
ERASE |
Ecrit la donnée 0xFF (ou 0xFFFF en configuration 16 bits) à l'adresse spécifiée (l'effacement est une forme d'écriture) |
ERAL
(Erase all) |
Ecrit la donnée 0xFF (ou 0xFFFF en configuration 16 bits) à toutes les adresses de la mémoire |
READ |
Lecture de la donnée de l'adresse spécifiée. Remarque : certaines EEPROM permette la lecture séquentielle (lecture de toute la mémoire en une seule instruction) |
L'EEPROM utilise un protocole de communication de type série, synchronisé par une horloge (broche CLK).
Fréquence maximale de l'horloge : de l'ordre 2 MHz (pour Vcc = 5 V).
Durée des instructions :
EWEN, EWDS, READ : une dizaine de microsecondes à 2 MHz (durée proportionnelle à la période de l'horloge)
WRITE, WRAL, ERAL, ERASE : quelques millisecondes (indépendant de la fréquence d'horloge)
Prenons l'exemple de l'EEPROM 93LC86C de Microchip (en configuration 8 bits, ORG = 0).
L'EEPROM est pilotée par un microcontrôleur PIC.
On veut écrire la donnée 0x5E à l'adresse 0x1CF :
Initialement, l'EEPROM est en mode Stand-by (CS = 0, DI = 0 , CLK = 0).
Le PIC met CS à 1, DI à 1 (Start bit), puis CLK à 1.
Le bit DI est pris en compte par l'EEPROM sur le front montant de CLK.
Le PIC transmet ensuite l'opcode de l'instruction WRITE : bit 0, puis bit 1
Le PIC transmet ensuite les 11 bits de l'adresse : 0x1CF = 001 1100 1111
Le PIC transmet enfin les 8 bits de données : 0x5E = 0101 1110
Cela fait 22 bits (et donc 22 cycles d'horloge, 11 µs à 2 MHz) : 101001 11001111 01011110
Le PIC met CS à 0 puis rapidement CS à 1.
La sortie DO qui était jusqu'ici dans l'état haute impédance, passe au niveau logique 0, ce qui signifie que le processus d'écriture est en cours (le signal d'horloge est alors inutile).
La sortie DO passe à 1 en fin d'écriture (3,3 ms plus tard).
Le PIC place alors CS à 0 : l'EEPROM est en stand-by, en attente d'une nouvelle instruction.
Noter que la phase la plus longue est la phase d'écriture : 3,3 ms !
3-6-2- Instruction READ
C'est l'instruction la plus utilisée.
On veut lire la donnée de l'adresse 0x759 :
22 cycles d'horloge sont nécessaires :
14 cycles d'horloge pour transmettre 14 bits sur la broche DI :
8 cycles d'horloge pour lire les 8 bits de données disponibles sur la broche DO : 1001 0101 (0x95)
N.B. Les bits de données sont précédés d'un bit 0 ("dummy bit").
Le PIC place CS à 0 : l'EEPROM est en stand-by, en attente d'une nouvelle instruction.
N.B. Avec une fréquence d'horloge de 2 MHz, l'instruction READ dure 11 µs (à comparer avec les 3,3 ms de l'instruction WRITE).
3-6-3- Instruction EWEN
14 cycles d'horloge sont nécessaires pour transmettre 14 bits sur la broche DI :
3-6-4- Instruction EWDS
14 cycles d'horloge sont nécessaires pour transmettre 14 bits sur la broche DI :
3-6-5- Instruction ERAL
14 cycles d'horloge sont nécessaires pour transmettre 14 bits sur la broche DI :
La phase d'effacement est ensuite lancée (durée : quelques millisecondes).
3-6-6- Instruction ERASE
14 cycles d'horloge sont nécessaires pour transmettre 14 bits sur la broche DI :
La phase d'effacement est ensuite lancée (durée : quelques millisecondes).
3-6-7- Instruction WRAL
22 cycles d'horloge sont nécessaires pour transmettre 22 bits sur la broche DI :
La phase d'écriture est ensuite lancée (durée : quelques millisecondes).
4-1- Le son numérique contenu dans l'EEPROM 9386
Avant toutes choses, il faut programmer l'EEPROM 9386 (si vous n'avez pas le programmateur adéquat, cliquez ici).
L'EEPROM doit contenir 2048 échantillons de 8 bits, correspondant à un son numérique mono échantillonné à 11,025 kHz.
Cela donne un son de durée 2048 / 11025 = 186 ms (ce qui est suffisant pour un métronome).
4-2- Création du fichier de données du son
Vous pouvez enregistrer un son (avec l'application Magnétophone de Windows par exemple).
N'oubliez pas de sauvegarder le fichier au format .wav (PCM) avec les paramètres :
Vous pouvez aussi récupérer un fichier son existant (de durée max. 186 ms).
S'il n'est pas au bon format (.mp3 par exemple), il vous faudra le convertir au format .wav (de nombreuses applications savent le faire) avec les paramètres :
Puis, avec un éditeur de fichier hexadécimal (Winhex ou autres), il faut supprimer l'en-tête du fichier (ce sont les premiers octets du fichier qui permettent de l'identifier) de manière à ne garder que les données utiles.
(Il y a très certainement des applications qui permettent de faire cette opération automatiquement : contactez-moi si vous en connaissez une).
Il faut enfin compléter la fin du fichier avec des 0x80 (128 en décimal, soit 0 V et niveau sonore nul) pour avoir exactement 2048 octets.
Vous pouvez maintenant programmer l'EEPROM à partir de ce fichier de données.
- Exemple d'édition d'un fichier son (click1.wav) avec l'éditeur audio libre et gratuit Audacity :
- Fichier de données click1.dat (obtenu à partir du fichier click1.wav) :
Le premier octet de ce fichier correspond au premier échantillon, le deuxième octet correspond au deuxième échantillon, etc ...
4-3- Le multibrateur astable
Un montage astable à base du célèbre timer NE555 définit la fréquence de fonctionnement du métronome, que l'on règle avec un potentiomètre :
- fréquence minimun (potentiomètre au maximum) :
1,44/((15k + 100k) + 2 x 1k)x 22µ) = 0,56 Hz = 34 coups par minute
- fréquence maximum (potentiomètre au minimum) :
1,44/((15k + 0k) + 2 x 1k)x 22µ) = 3,85 Hz = 230 coups par minute
4-4- Le convertisseur numérique / analogique
On utilise un convertisseur 8 bits suffisamment rapide (DAC08C).
Le nombre de 8 bits présent en entrée du DAC est converti en un courant qui lui est proportionnel.
L'amplificateur opérationnel (TL071) convertit ce courant en une tension :
4-5- L'amplificateur audio TBA820M
La sortie u5 est reliée à l'entrée d'un amplificateur audio mono TBA820M (2 watts max. avec un haut-parleur d'impédance 8 ohms).
Un potentiomètre câblé en diviseur de tension règle le niveau sonore.
4-6- Le microcontrôleur PIC
Finissons par le chef d'orchestre.
A chaque front montant de l'horloge de l'astable (disponible sur la broche RA4 du PIC), le PIC lance la lecture complète de l'EEPROM Microwire 9386.
Au départ, le PIC lit (avec une instruction READ) la donnée (8 bits) située à l'adresse 0x000 de l'EEPROM.
Cette donnée est aussitôt transmise au DAC08 (via le port B du PIC) pour la restitution sonore (haut-parleur).
1 / 11025 = 90,70 µs plus tard, le PIC lit la donnée suivante (adresse 0x001), donnée aussitôt transmise au DAC08.
De la même manière, toute la mémoire EEPROM sera lue (2048 octets, adresse de fin 0x7FF) à la cadence de 11025 Hz.
Le PIC attend maintenant le prochain front montant, et la boucle est bouclée.
N.B. Le PIC doit être suffisamment rapide.
C'est le cas (oscillateur à quartz de 20 MHz) : environ 30 µs sont nécessaires pour faire la lecture d'un octet de l'EEPROM.
Ce qui laisse 60 µs pour faire les autres tâches : c'est largement suffisant.
6- Codes sources des microcontrôleurs PIC
Le code source a été écrit en langage assembleur avec l'environnement de développement gratuit MPLAB IDE de Microchip.
(C) Fabrice Sincère ; révision 02