Les microcontrôleurs de la série 8051 disposent tous de différentes mémoires de programme et de données. La taille maximale de la mémoire de programme est de 64 Koctets. C'est là que le contrôleur va chercher ses instructions. Il est également possible d'utiliser cette mémoire pour stocker des constantes et des tableaux de variables. Supposons qu'on n'utilise le contrôleur qu'avec des mémoires externes (cas du µC 8031 ou simplement parce que vous avez pu récupérer un 8051) . Pour sélectionner une mémoire de programme externe, la broche 31 (/EA, External Access) du contrôleur doit se trouver à l'état bas. Un accès à la mémoire de programme est signalé physiquement par un signal /PSEN =0 (broche 29 au niveau logique bas). Voilà pour la mémoire de programme (physiquement contenue dans une EPROM style 27C64 ou supérieure voire même dans une EEPROM du genre 28C64)
Outre les 64 Koctets de mémoire de programme, le contrôleur peut également adresser 64 Koctets en mémoire de données externes, que ce soit pour une opération d'écriture ou de lecture, peut importe. La mémoire de données sert à stocker des quantités plus importantes de données (difficilement stockables dans l'espace restreint de la RAM interne).
Le tout devient de plus en plus attractif si l'on fusionne l'espace de mémoire de données avec l'espace de mémoire de programme. En effet, rien de plus rébarbatif pour l'amateur de devoir "griller" une nouvelle EPROM à chaque fois qu'il veut tester un nouveau programme.
Supposons donc devoir réaliser une carte de dévellopement à base de 8031. Nous allons ajouter à notre µC (microcontrôleur) une EPROM 27C64 et une RAM du type HM6264. Commençons par la connexion de l'EPROM qui comprendra le programme de base. Outre les 8 broches de sortie (D0-D7) et les 13 broches d'adresses (A0-A12), on remarquera les broches /CE et /OE permettant respectivement au composant d'être activé ou de sortir ses données. Si on souhaite un accès rapide, on active le composant de manière continue (/CE=0) et on contrôle la sortie des données par /OE. Si on préfère une consommation moindre, on contrôle tout par /CE et on place l'entrée /OE à la masse. Mais attention, la deuxième solution même si elle consomme moins peut ne pas convenir si la valeur du quartz du µC est trop élevée ( temps d'accès de l'EPROM à vérifier sur les datasheets ! ).
Pour ce qui est de la RAM, nous avons opté pour une RAM statique CMOS. Ce qui évite de devoir prévoir un rafraîchissement et qui limite fortement la consommation (celle-ci devient négligeable). Le composant HM6264 a également une capacité de 8 Kilo-octets. Les broches de contrôle sont /CS1, /CS2, /OE et /WE. Les trois premières ont des rôles similaires à celles de l'EPROM. La quatrième doit être à l'état bas pour une écriture.
De par sa construction, le microcontrôleur a des bancs d'adressage séparés pour le programme (via /PSEN) et pour les données (via /RD et /WR). Dans le banc de programme, l'EPROM doit nécessairement se trouver à l'adresse 0000H. En effet, comme le compteur de programme pointe vers cette adresse lors du reset, c'est là que le microcontrôleur ira chercher la toute première instruction à exécuter. Nous pouvons placer la RAM aux adresses qui suivent directement celles de l'EPROM. La RAM peut conserver ces mêmes adresses dans le banc de données.
| Banc de programme | Banc de donnée |
|---|---|
| EPROM 0000H-1FFFH | Périf suplémentaires |
| RAM 2000H-3FFFH | RAM 2000H-3FFFH |
Quels sont les bits d'adresses à décoder ? Nous constatons que les accès à la RAM et à l'EPROM se différencient par l'état du bit A13. Si celui-ci est à l'état 1, nous pouvons accéder à la RAM tandis que s'il est à l'état 0, nous accédons à l'EPROM ou à l'ADC. Les autres bits d'adresses ne sont pas nécessaires pour distinguer les composants accessibles, par conséquent, leur décodage est inutile (sauf si vous voulez utiliser des périfériques supplémentaires comme un ADC par exemple). Ceci signifie par exemple que les adresses 0000H à 1FFFH, 4000H à 5FFFH, 8000H à 9FFFH et 0C000H à 0DFFFH du banc de données donneront toutes accès à la même " case mémoire " que représente le périférique supplémentaire.Il faut que l'EPROM sorte sa donnée (/OE=0 et /CE=0) lorsque le 80C31 lit un octet de programme (/PSEN=0) à une des adresses 0000H à 1FFFH (A13). Pour la connexion de l'EPROM, le plus simple consiste à raccorder chaque sortie du 80C31 à chaque entrée de l'EPROM. Il y a alors deux possibilités (comme expliqué plus haut) : dans un cas, l'accès est plus rapide et dans l'autre cas, la consommation est faible.

Pour la connexion de la RAM : En écriture, la RAM doit être activée, c'est-à-dire (/CS1=0 et CS2=1 et /WE=0) si (/WR=0 et A13=1) tandis qu'en lecture, on doit avoir (/CS1=0 et CS2=1 et /OE=0) si ((/PSEN ou /RD=0) et A13=1). Le plus simple est de relier CS2 et A13, ce qui réalise le décodage d'adresse. Relier /WE et /WR règle le problème spécifique à l'écriture. Nous pouvons alors activer /CS1 dans tous les cas d'écriture ou de lecture, soit lorsque /PSEN=0 ou /RD=0 ou /WR=0. L'entrée /OE n'est pas indispensable et peut être mise à la masse. A présent, il s'agit de s'assurer de la compatibilité des diagrammes. Nous trouvons pour la RAM un temps d'accès de 150 ns pour la version la plus lente. Il faut y ajouter le délai de la porte (20 ns) et nous constatons qu'on est bien en dessous du maximum exigé. Néanmoins, en fin d'écriture, lorsque le signal /WR remonte, la RAM est toujours sélectionnée tant que la sortie de la porte ET n'a pas rebasculé. Nous pouvons imaginer qu'à ce moment, la RAM puisse passer furtivement du mode écriture au mode lecture. Elle sortirait alors simplement sur le bus la donnée qu'elle viendrait d'y lire, ce qui ne serait pas gênant.

Voilà, vous possédez maintenant un moyen radical pour tester tous vos nouveaux programmes sans devoir griller une EPROM à chaque fois ! Il vous suffit de télécharger le programme dans la RAM via un PC, une liaison série et un bon moniteur (un exemple de moniteur dans les pages download bientôt).