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.

 

 

 

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