mercredi 24 décembre 2014

ATmega168pb, le 8 bits à la fête! Aperçu du kit Atmel ATmega168 X PLAINED.

And now for something completely different…

Après avoir posté quelques billets sur différents micro-contrôleurs, notamment ceux de la famille Z8F de Zilog, les circuits 32 bits de chez Microchip dans une application bien pensée que sont les produits Maximite et Micromite, ou encore les circuits compatibles ARM0 de NXP, aujourd'hui je propose un très petit aperçu des composants 8 bits de chez Atmel. En l’occurrence le processeur ATmega168pb, nouvellement présenté et dont la découverte est facilitée par un kit d'évaluation nommé 'ATmega168 X PLAINED Mini'.


Ce qui est intéressant avec ce nouveau micro-contrôleur, bien que ce soit un processeur 8 bits, c'est qu'il propose une architecture RISC rapide, un prix très réduit malgré la présence d'un nombre assez important de périphériques embarqués, et la mise à disposition de la part d'Atmel d'un logiciel de développement/programmation intégré de bonne facture. En un mot, Ce circuit se présente un peu de la même façon que les Z8F de Zilog.

En résumé, voici ce que nous propose un ATmega168pb (extrait de la documentation Atmel):

  • Up to 20 MIPS Throughput at 20MHz
  • On-chip 2-cycle Multiplier
  • 16KBytes of In-System Self-Programmable Flash program memory
  • 512Bytes EEPROM
  • 1KBytes Internal SRAM
  • Two 8-bit Timer/Counters with Separate Prescaler and Compare Mode
  • 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode
  • Real Time Counter with Separate Oscillator
  • Six PWM Channels
  • 8-channel 10-bit ADC with Temperature Measurement
  • Programmable Serial USART with Start of Frame Detection
  • Master/Slave SPI Serial Interface
  • Byte-oriented 2-wire Serial Interface (Phillips I 2 C compatible)
  • Programmable Watchdog Timer with Separate On-chip Oscillator
  • On-chip Analog Comparator
  • Interrupt and Wake-up on Pin Change
  • Six Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, Standby, and Extended Standby
  • 27 Programmable I/O Lines

...pour les caractéristiques essentielles, ce qui présente tout de même un certain potentiel de flexibilité dans un très petit circuit. Il pourrait se placer entre les micros de chez Zilog avec plus de rapidité d'exécution et plus de périphériques embarqués, et les 32 bits de chez Microchip en présentant certes moins de puissance de calcul, mais aussi une bien plus grande facilité dans la gestion du placement des périphériques sur les pattes de sorties.

La page du site d'Atmel ou il est possible de commander le kit d'évaluation :

http://store.atmel.com/PartDetail.aspx?q=p:10500404#tc:description
Avant toute tentative d'utilisation de ce kit, il convient de télécharger le logiciel de développement Atmel Studio 6. Et de constater que le package d'installation constitue un joli pavé de près de 700Moctets de données, auxquelles il conviendra de rajouter 200Moctets de mises à jours diverses et variées à la date de ce billet. Bien plus que ce que Propose Zilog avec son logiciel de développement. Point intéressant : l'application de programmation en Flash du micro-contrôleur fait parti du logiciel de développement. Inutile donc de chercher sur la toile, une solution tierce 'gratuite' susceptible de ne pas fonctionner correctement, comme ce qui aurait pu être mon cas avec le logiciel FlashMagic si les développeurs de cet utilitaire n'avaient pas réagi très rapidement à ma demande de correction pour son bon fonctionnement avec le processeur NXP LPC810.

Une fois Studio 6 installé et la carte d'évaluation connectée dans un port USB libre de la machine de développement, le premier lancement de Studio 6 fait apparaître l'environnement de développement ainsi qu'un onglet affichant le matériel compatible Studio découvert :

http://synthelectro-fr.blogspot.com
Rapidement, l'envie d'en savoir un peu plus sur le fonctionnement de l'environnement de développement et sur le micro-contrôleur pousse à tenter une première programmation. Sur le site d'Atmel, se trouve un programme d'exemple appelé 'Morse' censé présenter par le clignotement de la LED utilisateur présente sur la carte d'évaluation, le code Morse correspondant à ce que l'on aura fournit au processeur par l'intermédiaire de son port Série. C'est d'ailleurs cette application qui est programmée dans le kit d'évaluation permettant, à défaut de savoir dans un premier temps de quoi il s'agit, de constater qu'il y a de la vie lorsque l'on connecte la carte au PC. C'est déjà ça.

Une constatation intéressante concernant le mode de programmation de la Flash du micro-contrôleur, concerne le fait que celui-ci s'effectue par le port SPI du circuit. Laissant ainsi libre le port série pour tout type d'expérimentations. Cela peut peut-être paraître anodin, mais il m'est arrivé quelques mésaventures avec un circuit LPC1114 répondant 'synchronized' à une suite d'octets envoyés sur son port série, alors qu'il n'était nullement en mode programmation, le système de détection automatique de 'baud rate' du LPC1114 se déclenchant à 'l’insu de mon plein gré' !!!

Plutôt que de compiler de nouveau cette application et de la re-programmer dans le processeur, j'ai préféré partir de zéro et écrire un programme simple envoyant quelques caractères par le port série.

Et voici le 'programme du siècle', ou plus simplement un 'Hello World' un peu plus évolué que l'habituel clignotement d'une LED :
/*
 * TestCom.c
 *
 * Created: 23/12/2014 10:34:39
 *  Author: eric
 */ 

#include <avr/io.h>

#define F_CPU                   16000000UL  // Oscillateur interne à 16MHz
#define LED_ON                  PORTB |=  (1<<PORTB5)
#define LED_OFF                 PORTB &= ~(1<<PORTB5)
#define USART_BAUDRATE          9600
#define BAUD_PRESCALE           (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

void InitSystem(void);

int main(void)
{
unsigned long Temp;
 
 InitSystem();
 
    while(1)
    {
     //TODO:: Please write your application code 
        while (!(UCSR0A & (1<<UDRE0)));
        UDR0 = 'D';
        for (Temp = 10000000; Temp; Temp--);
        while (!(UCSR0A & (1<<UDRE0)));
        UDR0 = 'F';
    }
}

void InitSystem(void)
{
 DDRB |= (1<<PORTB5);                   // PB5 en sortie (LED0)
 PORTB |= (1<<PORTB5);                  // PB5 pullUp
 LED_OFF;                               // start with the LED off

 UCSR0B = (1 << RXEN0)  | (1 << TXEN0); // Autorisation RX/TX
 UCSR0C = (1 << UCSZ00) | (1 << UCSZ01);// Mode 8 bits

 UBRR0H = (BAUD_PRESCALE >> 8);         // Baud rate LSB du registre UBRR
 UBRR0L = BAUD_PRESCALE;                // Baud rate MSB du registre UBRR
}
Rien de bien compliqué en somme si ce n'est qu'en guise de clignotement de LED, le caractère 'D' est envoyé par le port série puis, après une boucle vide comptant jusqu'à 10.000.000, le caractère 'F' est envoyé à la console, le tout, dans une boucle sans fin. Ce simple programme m'a permis de constater que la boucle de comptage s'effectue en 6 secondes.

Une fois ce programme compilé, un simple démarrage de session de débogage permet de lancer la programmation de la flash du composant puis de démarrer le programme interne. Il est tout à fait plaisant de constater que dès lors, toutes les opérations permettant l'évolution en pas à pas du programme ainsi que la visualisation des variables et des mémoires internes au processeur sont accessibles simplement, et en temps réel, ainsi que la gestion des points d'arrêts. Je retrouve ici tout ce qui fait l'efficacité de la solution Zilog.

Session typique de débogage sous Studio 6. 
Un petit mot sur le processeur lui-même : il s'agit, donc, d'un processeur 8 bits. De ce fait, il ne présente pas la complexité d'un circuit même 'simple' de type ARM comme le LPC1114FN28 de NXP. Les mnémoniques assembleur utilisées sont très simples ainsi que l'architecture des registres. Lors de l'élaboration du programme ci-dessus, je n'ai absolument pas utilisé quelque librairie Atmel que ce soit. J'ai programmé directement les registres concernés par mon 'application', tout simplement. Je retrouve avec ce système, comme je l'ai rappelé précédemment, toute la facilité et la rapidité de développement que propose les circuits Zilog, tout en offrant un peu plus de puissance et de périphériques embarqués, notamment l'EEPROM, totalement absente des circuits Z8F.

Et puisque j'évoque la 'puissance' de ce processeur, j'ai comparé le résultat de ce programme avec ceux obtenus lors d'un test précédent sur des machines fonctionnant sous interpréteur Basic. En 'force brute', l'ATmega168pb exécute un simple comptage à une vitesse supérieure à 350 fois le même type de test effectué sur un processeur PIC32 à 50MHz sous interpréteur Basic, le Micromite. Le Micromite étant lui-même 130 fois plus rapide que le bon vieux Tandy PC-2. L'ATmega168pb est donc près de 50 000 fois plus rapide que le PC-2. Évidement, cette comparaison est 'tendancieuse', les environnements de ces trois processeurs étant très différents les uns des autres.

Cependant, si l'on considère les outils disponibles aujourd'hui pour une personne désireuse de se lancer dans la réalisation de matériels embarqués, force est de constater qu'il y a vraiment de quoi faire petit, économe en énergie, tout en étant vraiment très performant. Le tout pour un budget minimal puisqu'à considérer que la phase la plus lente dans tout le processus d'élaboration est celle du chargement du logiciel Studio 6, il est tout à fait possible d'imaginer utiliser cette chaîne de développement sur un portable équipé d'un simple processeur Core 2 Duo. C'est mon cas, avec un Core 2 à 2.10 MHz. Ce type de Portable se trouve aujourd'hui en occasion à moins de 200€, à comparer aux 3500 Francs nécessaires pour acquérir un Sharp PC 1500 (TRS80-PC2) à l'époque de sa sortie. Les outils de développement sont fournis gracieusement par Atmel.

Le tout pour moins de 200€ ?....
Conclusion : je me suis laissé tenter par une publicité Atmel,vantant tous les avantages du circuit ATmega168pb, proposé sur une carte de développement minimale mais pratique au prix de de 8,88$ hors frais de port (24/12/2014). Je pensais être en présence d'un circuit minimaliste, il n'en est rien. Bien qu'en version 8 bits, et sous réserve que le besoin en calculs intensifs ne soit pas l'objectif, ce circuit est très flexible, puissant et pratique à programmer/debugger avec les outils Atmel. Au delà de la découverte, il serait dommage de ne pas l'utiliser dans une application concrète…

mardi 9 décembre 2014

ZigBee ou la chronique d'une mort annoncée?...

Ah, ZigBee !... Et la révolution révolutionnaire qui allait tout révolutionner dans la façon de contrôler l'habitat. Enfin, tout allait devenir simple et efficace, c'était le début de l'Internet Of Things, l'IoT d'aujourd'hui !

Un des premiers modèles de modules type ZigBee disponibles pour le grand public.

Puisque je m'intéresse entre autres sujets, à l’automatisation des bâtiments, je viens de découvrir un article sur le site de Batirama intitulé : "ZigBee 3.0 : fin de la cacophonie en 2015". Je serais tenté de traduire ce titre d'article en 'ZigBee : fin du sketch' !

Mais reprenons depuis le début... Je ne sais plus exactement en quelle année fût annoncée la 'révolution' ZigBee, mais il me semble que c'était vers 2007, Peu importe. Intéressé par les possibilités présentées, j'acquis un kit de démonstration chez Radiocrafts à un prix pas spécialement donné. Les deux cartes contenues dans la boîte semblaient tout droit sorties d'un atelier de bricolage, avec 'bouts de fils' soudés à même le circuit imprimé, destinés à configurer les quelques 'bornes' de configuration des modules ZigBee. Les deux cartes étaient équipées d'une antenne extérieur et non pas d'une antenne intégrée, soit par un composant, soit directement gravé sur le circuit imprimé.

Origine : Radiocrafts.
A noter que j'ai récupéré l'image ci-dessus le 09 décembre 2014 et que je ne sais pas si elle correspond toujours au kit que j'ai reçu à l'époque. Je ne possède plus ce kit, l'ayant fait passé depuis longtemps par la case déchèterie rubrique 'produits électroniques'!

Très rapidement, la déception : J'effectue les premiers tests de liaison, point à point. Inutile de préciser que la configuration des modules par commande de type 'AT' n'était pas spécialement des plus conviviale, le module renvoyant juste un 'OK' laconique en guide de confirmation. En configurant les deux modules en puissance maximale, j'obtins une distance de communication d' à peine 10 mètres en vis à vis, seulement 'obturé' par la fenêtre double vitrage de mon bureau.

Après d'énormes recherches sur Internet, je ne parvins jamais à être en mesure de me faire une idée précise sur les distances atteignables avec le protocol ZigBee. Je me souviens avoir vu quelques réalisations ou les exemples de distances de liaison obtenues étaient toujours réalisées en extérieur, par exemple une vidéo présenté par Texas Instruments montrant une 'certaine distance' obtenue avec ce type de circuit, dans un espace vert. Je ne sais plus si l'exemple Texas était présenté avec des modules ZigBee ou avec leur solution maison, mais peu importe, il s'agissait de la même bande de fréquence et de la même puissance de transmission. Quelle plaisanteries toutes ces démonstrations.

Parce qu'il faut être clair : ça ne fonctionne absolument pas en intérieur. Les raisons principales sont très simples et sont au nombre de trois : 

1- La puissance d'émission est RIDICULE. 
2- La bande de fréquence utilisée traverse très difficilement les obstacles. 
3- La bande de fréquence utilisée étant la même que celle du WiFi, le spectre radio est tellement bruité que même la haute sensibilité des récepteurs ZigBee ne parvient pas à palier le faible ratio S/B de la liaison.

Exemple de module ZigBee.

Vous pourriez me dire que c'est facile de critiquer, suite à un simple essai de modules peut-être pas optimaux et que etc etc etc...

Sauf que, suite à ces essais très peu convaincants, j'ai décidé d'attaquer le problème à la base et de créer des appareils de meilleur qualité. Je ne rentre pas dans les détails, mais un module ZigBee est constitué d'un frontal radio fréquence (RF) et d'un processeur faisant le lien avec l'extérieur et gérant la pile ZigBee. Inutile de préciser que chaque constructeur de module ZigBee incorpore le type de processeur qui l'intéresse dans sa solution. Se faisant, un programme développé pour un type de module d'un constructeur ne pourra certainement pas être implémenté dans un module d'un autre constructeur. Il convient donc de faire attention à la solution matérielle adoptée. Je passerai aussi sur la compatibilité des piles ZigBee implémentées ainsi que sur le choix de la chaîne de développement plus ou moins complète, plus ou moins finie, plus ou moins installable avec laquelle il m'a fallu me battre pour réussir à programmer les modules choisis : des modules Jennic, qui me semblaient à l'époque les moins pires ! 
 
Un module Jennic.
J'ai donc réalisé trois prototypes de capteurs de température et d'hygrométrie. Dans l'ordre de l'image ci-dessous, deux prototypes équipés de modules avec antenne extérieur, et un avec une antenne directement gravée sur le module.

Réalisation personnelle...

Après de longues heures de découverte, et de programmation, je réussis à configurer un prototype équipé d'une antenne extérieur en module maître, et les deux autres en modules esclaves. Ce qui m'a permis d'effectuer des tests de distances. Et je n'ai pas été déçus !!! Avec le prototype équipé d'une antenne gravée sur le module Zigbee, j'ai obtenu 1,5m et une paroi BA13 traversée. Sinon, c'était 2m. Oui, vous avez bien lu : 2m max en vis à vis. Les tests ont été effectués dans un appartement situé dans un immeuble, noyé dans les transmissions WiFi. Il y avait plus de 10 réseaux visibles à différentes puissances. Avec deux prototypes équipés d'antennes extérieur, la situation s'améliorait quelque peu puisque j'ai pu obtenir 12m (mesurés au mètre à ruban), toujours en traversant une paroi de BA13 plus un voile extérieur de 15cm, j'étais en fait sur le balcon. En un mot, dans un appartement de 75m² ayant une topologie carrée, et même en intérieur, le simple fait de devoir passer plus de deux cloisons BA13 ne me permettait pas de ponter la diagonale !!!

Je n'ai pas poussé plus avant les expérimentations sur le sujet. A titre d'exemple, des tests effectués avec de simples émetteurs récepteurs travaillant dans la bande des 433Mhz sous 10mW d'émission m'ont permis le transfert de fichiers à 2400 bauds jusque dans le sous-sol du bâtiment, l'appartement se situant au 2ième étage. J'ai même du arrêter rapidement les tests puisque je perturbais l'ouverture du portail d'entrée de la résidence.

Modules 433MHz APC220 utilisés pour les expérimentations.
Que dire de plus ?
Il est possible aujourd'hui que l’interopérabilité des modules ZigBee s'améliore. Je doute que la raison en soit uniquement la version 3.0 du protocole. Mais plutôt au fait que durant ces sept dernières années, le nombre de constructeurs ayant jeté l'éponge sur ce sujet fait que les derniers restant sur la place semblent arriver à proposer des solutions compatibles avec... eux-même !

A titre d'exemple : 
- Les modules MaxStream ont été repris par Digi.
- Les modules MeshMetics ne sont plus disponibles.
- Les modules Jennic ont été repris par NXP.
Et tant d'autres....

Mais les fondamentaux restent présents :

- Le partage du spectre de fréquence avec le WiFi ne permet pas de bonnes liaisons.
- Le spectre utilisé est très vite arrêté par les obstacles, même fins.
- Pour ponter des distances 'utilisables', il faut impérativement installer des 'répéteurs' de réseau, avec toute la complexité de configuration de ce type de réseau tant au niveau logiciel, que logistique.
- Que dire de l'autonomie électrique des appareils dans le cas d'un réseau de ce type puisqu'à minima ils doivent être constamment en réception : quelques mois ?
- Miser sur le bon fournisseur de modules parce qu'il n'y a aucune garantie sur la pérennité de l'approvisionnement. Mais heureusement, le marché semble s'être assaini, il reste de moins en moins de constructeurs de modules ZigBee, voire bientôt... plus du tout !!! 
- Considérer la difficulté de développement autour des modules choisis...

Quoi faire alors ?

Hum, je dirais que la vraie vie est ailleurs. Il existe aujourd'hui des constructeurs capables de proposer des solutions de type WiFi, très bon marché et compatibles avec le protocole de commande série de type 'AT'. 

Photo provenant du site HACKADAY, du module ESP8266 .
Je n'ai pas encore effectué de tests de distance avec ces modules Wifi mais au moins cela reste du réseau 'standard' accessible depuis n'importe quel portable équipé d'une carte de réception WiFi, c'est à dire tous maintenant, et cela ne coûte que deux à trois Euros sur eBay ! 
De plus, le processeur embarqué 'semble' programmable, bien qu'il 'semblerait' que la chaîne de compilation ne soit pas triviale à installer et que la documentation disponible soit plus que légère pour l'instant. Mais une importante communauté de développeurs se fédère autour de cette solution, permettant d'envisager une meilleur intégration de ce type de solutions dans les mois à venir. Un bon point de départ sur ce module pourrait être celui-ci : Limpkin's.

Alors plutôt que tenter une aventure professionnelle autour du ZigBee, mieux vaut passer quelques heures de loisir à expérimenter autour de ce type de solution WiFi !

Moi, ce que j'en dis....

vendredi 28 novembre 2014

NVSRAM : Sauvegarde des mémoires programme des synthétiseurs vintages et autres antiques Breloques électroniques (bis)...

La raison de ce (bis) dans le titre, est que j'ai tenté de répondre à ce problème il y a déjà quelques mois sans vraiment y parvenir du fait d'un choix technologique un tantinet inadapté : tentative. La machine destinataire de cette étude est le JX3P :

Pour ce premier essai, j'avais décidé d'utiliser un circuit mémoire spécial qui conserve ses données même en l'absence de tension d'alimentation : une FRAM.

Le problème est que ces composants ne sont disponibles qu'en tension d'alimentation de 3,3V max, ce qui les rend inutilisables dans les anciennes machines fonctionnant en 5V. Une adaptation importante des signaux doit donc être effectuée. Or, même en ne considérant que le bus de données, on en arrive vite à un circuit difficile à faire tenir sur une empreinte mémoire de type 61256.

Version à composant FRAM.
Et cela, sans même avoir traité la protection en écriture de la mémoire lors de la coupure d'alimentation du système. Dans ces conditions, essayer de produire l'équivalent d'une RAM de 2Ko de style 6116 avec de la FRAM n'est tout simplement pas raisonnable.

J'ai donc tenté de trouver une solution plus adéquate à mon problème. Et vous l'avez bien compris, si j'écris ce billet, c'est que j'ai trouvé. Effectivement, une mémoire capable de se comporter comme une SRAM standard, de fonctionner en 5V et qui gère sa protection en écriture, ça existe.

En fait, il s'agit d'un composant possédant deux mémoires dans le même boîtier. Une SRAM standard et une mémoire non volatile de même taille. On perçoit de suite le fonctionnement : il suffit de recopier la SRAM dans la partie non volatile et le tour est joué. Effectivement! Le plus fort, c'est que c'est le composant lui-même qui se charge de cette opération. Il le fait dès qu'il détecte une chute de tension de son alimentation. Dans ce cas, un condensateur de sauvegarde lui laisse le temps d'effectuer la copie. Cette opération ne s'exécute pas de façon séquentielle, mais cellule par cellule, simultanément. Le condensateur est donc nécessaire, non seulement pour permettre à la mémoire d'avoir le temps d'effectuer sa sauvegarde, mais surtout pour fournir l'énergie réclamée lors de cette opération consistant à copier simultanément des milliers de cellules EEPROM ou FLASH, peu importe la technologie non volatile employée. L'utilisation d'un tel composant permet une simplification très appréciable du circuit de substitution de SRAM conventionnelle :

Abstract :  Since a long time, I wanted to find a solution to replace the SRAM with the backup battery present in a lot of gears like many old synthesizers of the 80s, to store the internals patchs. Until now, there were a component that could done the job, the FRAM memories. But at this time, this type of memories do not accept a power voltage greater than 3,3V, that is not compatible with the 5V power supply of this old gears.

So, I tried to make a board to convert all the signals needed by the FRAM memories, from the synthesizer I wanted to equiped with. But finally, it appears to be to difficult to realize this task on a board that fit exactly à SRAM 6116 footprint. Recently I founded a component that operates at 5V and can backup its datas without any external special operation. In fact, this type of memorie contains two pages of memories : on page is a standard SRAM, the other is a NON-VOLATILE memorie intended to backup automaticly the SRAM portion of the circuit. And the best : This circuit operates at 5V!
I juste made an adaptator board that contains all the necessary componants for this new SRAM to work corectly at the original place of the 6116 SRAM.
And it works fine! I removed the backup battery, I loaded the free patchs bank with my saved patchs and the JX works as usual, but without battery : Fantastic...
I have to do this job for a 8 or 32K SRAM, that is just the same type of component, and put two of them into my Prophet VS synthesizer.
Many others machines should be able to continue their job, équiped with this new solution, but without the risque of damages caused by the leak of battery...

Version à composant spécial à double banc mémoire.
Le condensateur de 100µF fournit l'énergie nécessaire lors de la coupure d'alimentation pour effectuer la copie des donnée en mémoire non volatile. Sur l'autre face du circuit imprimé, une simple résistance de 10K Ohms permet de protéger l'entrée d'écriture du circuit. Et tout cela tient aisément sur l'emplacement d'une SRAM de type 6116.

Et dans la vraie vie? Cette fois, je n'ai même pas jugé bon d'effectuer des tests sur mon terminal télémécanique, j'ai opéré directement sur la carte mère du JX3P. Pour se faire, j'ai ôté la SRAM de type 6116 de la carte, puis placé un support de circuit intégré de type tulipe. Puis enfin, inséré la SRAM non volatile dans ce support :

Tada... Cette fois, j'y ai droit!










J'ai d'abord effectué les tests de fonctionnement en ayant laissé la pile de sauvegarde en place. Cette fois, le synthétiseur s'est correctement initialisé. La demande des patchs utilisateurs se traduisant par aucun son : normal.

J'ai donc rechargé la machine avec mes patchs précédemment sauvegardés. Tout à correctement fonctionné. Le JX3P ne présentant aucune différence de fonctionnement par rapport à précédemment, j'ai donc retiré la pile de sauvegarde.
Au rallumage du JX, les patchs utilisateurs étaient toujours présents. Par la suite, j'ai effectué des modifications de patchs et ai pu valider quelles étaient correctement sauvegardées à l'extinction de la machine.

Pour finir, j'ai du adapter quelque peu le remontage de la carte mère du JX. En effet, le 'sandwich' constitué du support de circuit intégré et de ma nouvelle SRAM non volatile ne passait plus sous les touches du clavier. J'ai donc changé tous les supports en plastic blanc de la carte du JX par des modèles plus étroits tout en vérifiant que la face 'soudure' de cette carte n'entrait pas en conctact avec la feuille métallique collée sur la caisse du synthé. Et voilà!

Fini les risques de fuite de pile de sauvegarde et de perte de données : tout simplement!

La suite? Une version 6264 de type 8Ko, qui sera en fait une 61256 de 32Ko. J'ai un Prophet VS qui n'attend que ça!

mardi 25 novembre 2014

Arithmeum

Hum... Titre de billet étrange, non? Il s'agit en fait d'un musée des mathématiques se situant à Bonn, le Wiki de cet établissement se trouve à cet endroit. Pour être plus précis, ce musée ne concerne qu'une petite partie du bâtiment dans lequel il se trouve, bâtiment hébergeant un institut de mathématique de l'Université de Bonn.

Source Wikipedia.
Que trouve-t-on dans ce musée? Des machines à calculer, diverses et variées, pratiquement depuis les origines de la création des ces outils d'aide au calcul. Je ne vais pas exposer ici ce qu'il est possible d'y voir, le mieux étant de se rendre dans cet endroit à l'occasion d'un déplacement dans cette très jolie ancienne capitale allemande. Les informations de l'établissement, en Allemand uniquement, se trouvent sur ce site. De magnifiques pièces mécaniques y sont exposées, comme celle-ci :

Source :Arithmeum © Foto: Michael Sondermann/Bundesstadt Bonn
Information : Je n'ai pas demandé à l'auteur de cette image, Michael Sondermann, l'autorisation de sa publication, bien que celle-ci soit publique puisque publiée sur le site du Musée. 

Après quelques salles de tailles diverses comportant quelques rares et magnifiques spécimens de calculatrices manuelles et automatiques, en bois en métal ou en carton, on accède à une salle très grande ou se concentre une multitude de représentantes de la 'calculatrice' telle qu'on la conçoit aujourd'hui. C'est à dire avec un clavier et un dispositif d'affichage, à 'propulsion' manuelle ou électrique, totalement mécaniques, à relais, à tubes, à transistors et enfin à processeurs.

Une superbe remontée dans le temps sur plusieurs siècles...

Informations (bis). Je publie quelques photos prises à l'occasion de ma visite de ce musée. Elles concernent les machines électriques, bien évidemment. Elles ont la qualité qu'elles ont. Je ne suis pas un professionnel de la photographie. Je n'ai demandé aucune autorisation au musée pour cette publication qui se fait de façon tout à fait gratuite.

Et pour commencer dans le symbolique :


Dans un 'mode' plus chronologique, j'ai trouvé une machine comportant des tubes électroniques, je n'ai pas noté le fabriquant, juste pour la curiosité de la construction :



J'ai recherché des machines à transistors, mais n'ai rien trouvé de vraiment parlant. En fait, la première machine que je qualifierais d'électronique telle qu'on s'imagine être une calculatrice aujourd'hui, est la 'fameuse' Busicom 141-PR. Et je l'avoue, je ne m'attendais pas à 'tomber' sur cette pièce de musée dont je n'avais vu que des représentations jusqu'à aujourd'hui! Sans doute la raison principale qui m'a incité à publier ce petit billet...


Le 'dessous des cartes' :

Distorsion du bord droit de la carte du à la paroi acrylique.
Détail de la carte mère de la machine. Un processeur 4004 pour de vrai!

Même problème sur le bord droit de la carte.
Pour plus d'informations techniques sur cette machine, il est possible de se rendre sur le site de Vintagecalculators.com ou une description matérielle précise de l'appareil est réalisée avec une superbe explication de texte concernant la carte mère dont je publie l'image :

http://www.vintagecalculators.com/html/busicom_141-pf.html
La carte comporte :
  • 4 circuits 4001 : ROM (256 octets par boîtier soit 1K octets total de mémoire programme)
  • 2 circuits 4002 : RAM (40 octets par boîtier soit 80 octets total de mémoire de données)
  • 3 circuits 4003 : registre à décalage (registre à décalage 10 bits)
  • 1 circuit  4001 : Microprocesseur 4 bits
Et pour terminer sur cette calculatrice, un gros plan de la carte mère, avec les effets indésirés de distorsion dus à la protection en plastique de la machine, qui semble être une version différente de la carte d'origine. On y remarque en effet quelques liaisons filaires câblées en l'air, ainsi qu'un circuit supplémentaire, un 4001. Ce circuit fournissant 256 octets d'espace mémoire de programme supplémentaire, on peut supposer que certaines fonctions ont été améliorées au fil du temps, ou aussi ajoutées afin d'apporter de nouvelles fonctionnalités à la machine de base :


Afin de replacer quelque peu la performance de cette Busicom dans le contexte de l'époque, voici ce à quoi pouvait ressembler un module mémoire de 64Koctets émanant d'un ordinateur IBM 360-20 sorti 6 ou 7 ans (1966) avant la sortie des puces Intel. En considérant qu'il faudrait 256 puces Intel 4002 pour arriver au même résultat, on conçoit aisément la place gagnée, la simplicité de mise en œuvre et la consommation réduite que peuvent apporter ces nouvelles puces de l'époque :


La matière première qui entre dans la fabrication des circuits intégrés et autres processeurs? Le silicium :



Il s'agit bel et bien d'une barre de silicium, celle-là même d’où, une fois débitée en tranche fines, sortiront les 'waffers' ou seront gravés toutes sortes de circuits intégrés allant des simples circuit logiques comportant quelques portes aux processeurs actuels les plus puissants.
 
Le photographe en prime!

Et pour finir, quelques images 'parlantes'...

Toujours de chez IBM, dont le soupçonne l'institution d'exposer des machines ayant servi à demeure, un superbe exemple d'unité centrale d'un S-390, ou l'art et la manière de constituer sur un support de quelques centimètres carrés le concept même d'unité centrale :


Indéniablement du grand art. Justifiant sans aucun doute les performances de la machine ainsi que son prix. Je ne peux m'empêcher de comparer cette construction d'unité centrale avec le Z1 de Conrad Zuze, entièrement mécanique, se trouvant au superbe et impressionnant musée des techniques de Berlin :

Source Wikipédia.
Dans un autre registre, la machine analytique de Charles Babbage :


Avec en bas à gauche de l'image, le portrait d'Ada de Lovelace avec laquelle Babbage semble avoir correspondu lors de la conception de sa machine sur la résolution de certains algorithmes, faisant 'considérer' Ada de Lovelace comme la toute première personne ayant développé un 'programme' pouvant être exécuté par une machine.

Un mur de machines à calculer, quasiment au sens premier du terme :


Dont une production française :


Inutile de préciser que ce musée à la thématique peut-être incongrue, mérite d'être visité. Le nombre, la variété, la technologie des machines présentées est tout simplement impressionnant. La clarté, la sobriété de la présentation, le design de l'architecture et la quiétude du lieu concourent à un moment paisible de recueillement et d'admiration face à l'inventivité créatrice... A noter qu'il est aussi possible de manipuler certaines de ces antiques pièces de très haute technologie, de l'époque!

Ce musée est impossible à rater, il se situe à l'extrémité du parc de l'Université à droite, dos à au bâtiment principal :

L'Université de Bonn. Source : Wikipédia.

mardi 21 octobre 2014

Micromite Companion : modification/mise à jour du firmware.

Tentative de passage au clavier Français.

Update 27 octobre 2014 : 

Tout d'abord une petite remarque concernant un des auteurs de ce petit système, Jeff Ledger.
Je lui ai bien posté une question concernant la compilation de l'archive compatible BST. Il n'a pas répondu à ma question, pas plus qu'à celle lui demandant la procédure utilisée pour la création du fichier umitecompanion.eeprom.

Par contre Jeff Ledger, ayant parcouru mon blog, est 'tombé' sur l'indication du problème concernant une des broches du processeur laissée en l'air. Il m'a demandé la permission d'afficher la photo que j'ai prise de ma modification, ce à quoi j'ai répondu favorablement sous réserve qu'il en indique la provenance. Il a contourné cet 'accord' en affichant sur le blog concerné une sortie graphique du logiciel de circuit imprimé, complétée par la correction à effectuer! Le monsieur n'est pas très fairplay!

Rappel : pour mettre à jour le firmware du système je n'utilise pas la méthode préconisée, à savoir un programmateur de processeur Propeller, mais une simple copie du fichier binaire en EEPROM à l'aide d'un programmateur d'EEPROM. Or, jusqu'à ce que je découvre la bonne configuration de la compilation, le système plantait systématiquement avec l' appui sur la touche F8 devant permettre l'affichage du contenu de la SDcard. Or donc, voici la bonne configuration :

Le fichier .eeprom est correctement généré avec ces paramètres.
Il suffit dès lors de demander la compilation "Compile and save EEPROM" pour obtenir le fichier adéquat.
 
Par ailleurs, j'ai modifié les codes 'premiers' des touches alphabétiques du clavier pour avoir l'équivalent du clavier Français. Et cette fois, cela fonctionne très bien. Je me contenterai de stickers pour indiquer les signes des autres touches, en particulier ceux des touches alphanumériques.

Ce système est maintenant prêt pour diverses expérimentations intéressantes avec quand même bien plus de puissance que mon Tandy TRS-80 PC2 d'origine, et la même facilité d'utilisation puisqu'il suffit d'un écran pour avoir une machine autonome. Plus besoin de PC!

Fin d'update


Mise en situation : le système fourni est tout à fait satisfaisant, mis à part le petit problème que j'ai soulevé dans mon billet précédent. Il concerne la mise en buffer des caractères en provenance du processeur MicroMite lorsque le débit de ceux-ci est rapide. Le système est livré avec la prise en compte du clavier 'qwerty'. A la longue, cela s'avère assez ennuyeux. L'idée vient donc tout naturellement de tenter la 'francisation' du système.

Avant toute chose, j'ai téléchargé le logiciel de développement adapté à l'opération visée. J'ai opté pour la suite d'outils gratuite BST que l'on peut trouver à cet endroit. Le site de développement du 'Micromite Companion' propose les sources du système directement au format BST. Le logiciel est bien fait, pratique et très facile à prendre en main : 


BST ne réclame aucune installation. Il est disponible dès son téléchargement effectué.

Les sources du système doivent aussi être récupérés à cet endroit. Une fois ces opérations effectuées, il ne reste plus qu'à étudier le code source pour juger de la faisabilité du changement de 'layout' du clavier. A priori cela ne semble pas très compliqué puisque l'ensemble des sources du système contient un fichier nommé 'Keyboard.spin'. L'extension 'spin' représentant un source assembleur spécifique au processeur Propeller. 

Une simple recherche à l'intérieur de ce fichier révèle la table des codes utilisés pour la translation des 'scan code' du clavier en code ASCII utilisables par le système : 

1:  table       word  $0000  '00  
2:              word  $00D8  '01       F9  
3:              word  $0000  '02  
4:              word  $00D4  '03       F5  
5:              word  $00D2  '04       F3  
6:              word  $00D0  '05       F1  
7:              word  $00D1  '06       F2  
8:              word  $00DB  '07       F12  
9:              word  $0000  '08  
10:             word  $00D9  '09       F10  
11:             word  $00D7  '0A       F8  
12:             word  $00D5  '0B       F6  
13:             word  $00D3  '0C       F4  
14:             word  $0009  '0D       Tab  
15:             word  $0060  '0E       `  
16:             word  $0000  '0F  
17:             word  $0000  '10  
18:             word  $F5F4  '11   Alt-R  Alt-L  
19:             word  $00F0  '12       Shift-L  
20:             word  $0000  '13  
21:             word  $F3F2  '14   Ctrl-R Ctrl-L  
22:             word  $0071  '15       q  
23:             word  $0031  '16       1  
24:             word  $0000  '17  
25:             word  $0000  '18  
26:             word  $0000  '19  
27:             word  $007A  '1A       z  
28:             word  $0073  '1B       s  
29:             word  $0061  '1C       a  
30:             word  $0077  '1D       w  
31:             word  $0032  '1E       2  
32:             word  $F600  '1F   Win-L  
33:             word  $0000  '20  
34:             word  $0063  '21       c  
35:             word  $0078  '22       x  
36:             word  $0064  '23       d  
37:             word  $0065  '24       e  
38:             word  $0034  '25       4  
39:             word  $0033  '26       3  
40:             word  $F700  '27   Win-R  
41:             word  $0000  '28  
42:             word  $0020  '29       Space  
43:             word  $0076  '2A       v  
44:             word  $0066  '2B       f  
45:             word  $0074  '2C       t  
46:             word  $0072  '2D       r  
47:             word  $0035  '2E       5  
48:             word  $CC00  '2F   Apps  
49:             word  $0000  '30  
50:             word  $006E  '31       n  
51:             word  $0062  '32       b  
52:             word  $0068  '33       h  
53:             word  $0067  '34       g  
54:             word  $0079  '35       y  
55:             word  $0036  '36       6  
56:             word  $CD00  '37   Power  
57:             word  $0000  '38  
58:             word  $0000  '39  
59:             word  $006D  '3A       m  
60:             word  $006A  '3B       j  
61:             word  $0075  '3C       u  
62:             word  $0037  '3D       7  
63:             word  $0038  '3E       8  
64:             word  $CE00  '3F   Sleep  
65:             word  $0000  '40  
66:             word  $002C  '41       ,  
67:             word  $006B  '42       k  
68:             word  $0069  '43       i  
69:             word  $006F  '44       o  
70:             word  $0030  '45       0  
71:             word  $0039  '46       9  
72:             word  $0000  '47  
73:             word  $0000  '48  
74:             word  $002E  '49       .  
75:             word  $EF2F  '4A   (/)   /  
76:             word  $006C  '4B       l  
77:             word  $003B  '4C       ;  
78:             word  $0070  '4D       p  
79:             word  $002D  '4E       -  
80:             word  $0000  '4F  
81:             word  $0000  '50  
82:             word  $0000  '51  
83:             word  $0027  '52       '  
84:             word  $0000  '53  
85:             word  $005B  '54       [  
86:             word  $003D  '55       =  
87:             word  $0000  '56  
88:             word  $0000  '57  
89:             word  $00DE  '58       CapsLock  
90:             word  $00F1  '59       Shift-R  
91:             word  $EB0D  '5A   (Enter) Enter  
92:             word  $005D  '5B       ]  
93:             word  $0000  '5C  
94:             word  $005C  '5D       \  
95:             word  $CF00  '5E   WakeUp  
96:             word  $0000  '5F  
97:             word  $0000  '60  
98:             word  $0000  '61  
99:             word  $0000  '62  
100:            word  $0000  '63  
101:            word  $0000  '64  
102:            word  $0000  '65  
103:            word  $00C8  '66       BackSpace  
104:            word  $0000  '67  
105:            word  $0000  '68  
106:            word  $C5E1  '69   End   (1)  
107:            word  $0000  '6A  
108:            Word  $C0E4  '6B   Left  (4)  
109:            word  $C4E7  '6C   Home  (7)  
110:            word  $0000  '6D  
111:            word  $0000  '6E  
112:            word  $0000  '6F  
113:            word  $CAE0  '70   Insert (0)  
114:            word  $C9EA  '71   Delete (.)  
115:            word  $C3E2  '72   Down  (2)  
116:            word  $00E5  '73       (5)  
117:            word  $C1E6  '74   Right  (6)  
118:            word  $C2E8  '75   Up   (8)  
119:            word  $00CB  '76       Esc  
120:            word  $00DF  '77       NumLock  
121:            word  $00DA  '78       F11  
122:            word  $00EC  '79       (+)  
123:            word  $C7E3  '7A   PageDn (3)  
124:            word  $00ED  '7B       (-)  
125:            word  $DCEE  '7C   PrScr  (*)  
126:            word  $C6E9  '7D   PageUp (9)  
127:            word  $00DD  '7E       ScrLock  
128:            word  $0000  '7F  
129:            word  $0000  '80  
130:            word  $0000  '81  
131:            word  $0000  '82  
132:            word  $00D6  '83       F7  
133:    
134:  keypad1   byte  $CA, $C5, $C3, $C7, $C0, 0, $C1, $C4, $C2, $C6, $C9, $0D, "+-*/"  
135:    
136:  keypad2   byte  "0123456789.", $0D, "+-*/"  
137:    
138:  shift1    byte  "{|}", 0, 0, "~"  
139:    
140:  shift2    byte  $22, 0, 0, 0, 0, "<_>?)!@#$%^&*(", 0, ":", 0, "+"  
141:  

Rien de bien renversant. Les codes présents jusqu'aux lignes 132 représentent 'à peu près' la translation des scan codes du clavier en code ASCII lorsque aucune touche d'altération n'est utilisée (MAJ, SHIFT etc...).

Les lignes Keypadx fournissent les codes ASCII particuliers du pavé numérique en mode verrouillage numérique et en mode sans verrouillage numérique.

Les lignes Shiftx fournissent les codes de certaines touches lorsqu'une des touches Shift est utilisée.
Shift2 fournit le code 'second' des touches numériques de la partie non pavé numérique, Shift1 fournit le code de certaines autres touches ne faisant pas parti des lettre standards de l'alphabet ni de la partie numérique du clavier de base.

L'opération consistant à modifier l'affectation des touches de base est très simple. Il suffit de placer le code voulu la ou se situe le code d'origine à remplacer dans la table par exemple :

22:             word  $0071  '15       q 

à remplacer par :

22:             word  $0061  '15       a 

et ainsi de suite pour tous les code 'premiers' devant être modifiés.

Concernant le traitement des touches shift, la translation ne peut se faire sans toucher au code du programme. En effet, l'auteur s'est appuyé sur la disposition des touches numériques du clavier Américain pour modifier par ajout d'un offset, l'index pointant sur la table afin de pointer réellement sur une des deux lignes Shift1 ou Shift2. La chose est rendue possible parce que les chiffres de 0 à 9 sont présents directement sur la ligne du haut du clavier, sans avoir à utiliser la touche Shift, comme cela doit se faire sur un clavier Français. De ce fait, en considérant le mode de fonctionnement du clavier Français, il n'est plus possible de modifier l'index de code ASCII par simple ajout d'une valeur aux codes de base des chiffres, qui se suivent fort opportunément de 0x30 à 0x39 dans le cas du clavier américain. Il devient alors nécessaire de reprogrammer une partie du code traitant la translation SCAN code vers code ASCII.

Pour contourner simplement le problème, il est possible de considérer que la ligne du haut fournit les codes des chiffres sans avoir recours à la touche Shift, et que l'appui sur la touche 'seconde' fournira les autres codes comme '&~"'(-`_^@)' par exemple. Il suffit de remplacer la ligne suivante :

140:  shift2    byte  $22, 0, 0, 0, 0, "<_>?)!@#$%^&*(", 0, ":", 0, "+"  

par celle-ci :

140:  shift2    byte  $22, 0, 0, 0, 0, "<_>?)&~"'(-`_^@", 0, ":", 0, "+"  

Quelques ajustement et choix de dispositions de touches s'avère quand même nécessaire puisqu'il y aura un problème avec la séquence '()' étant donné que le caractère ')' se trouve sur la touche '°' et que cette dernière n'est pas traitée par la ligne Shift2.

Le principe de base est donc relativement simple, et moyennant quelques agencements, il est possible de 'déclarer' assez facilement un clavier 'Français' beaucoup plus facile à utiliser.

La compilation : une fois le fichier Keyboard.spin enregistré, il est nécessaire de sélectionner le fichier nommé umitecompanion.spin dans l'outil BST et d'en demander la compilation qui devrait s'effectuer sans problème après avoir sélectionné les options suivantes dans le menu 'Tools/Compiler Préférences' :


Personnellement, je compile en utilisant la fonction 'Compile and save binary'. Ce qui a pour effet de générer un fichier binaire nommé umitecompanion.binary.

Intégrer ce nouveau fichier sur le système est assez simple. Le processeur Propeller à ceci de caractéristique de charger dans sa RAM interne, le contenu de l'EEPROM présente sur le montage. En fait le processeur commence par tenter de charger sa RAM à partir de sa ROM interne mais si cette ROM interne ne contient pas de données, alors le processeur passe au chargement depuis l'EEPROM externe. Cette fonctionnalité de boot est très pratique puisqu'il suffit de modifier le contenu de l'EEPROM pour modifier le système.

Je possède depuis quelques années un programmateur spécifiquement dédié à la programmation des EEPROM diverses et variées, le EZP2010 :

Cet appareil est disponible pour quelques Euros à différents endroits, sur eBay notamment. L'appareil que je possède était livré avec les drivers pour Windows Vista, au mieux. La première tentative d'installation sous Windows 7 en version 64 bits s'est donc soldée par un échec.

J'ai donc récupéré sur le Net, le package logiciel dénommé EZP2010_V3.0 et ai installé l'appareil avec le nouveau driver. Cette installation s'est correctement déroulée mais le logiciel, aussi fourni dans le package, ne reconnaissait toujours pas le programmateur. Il m'a donc fallu effectuer la mise à jour du firmware du programmateur par la version elle aussi disponible dans le package logiciel, sur un ordinateur équipé de Windows XP.

Recommandation : avant de ne plus avoir sous la main de PC fonctionnant sous Windows XP ou Vista, mettez votre programmateur EZP2010 à jour, sinon vous le perdrez en même temps que vous vous débarrasserez de votre ancienne version de Windows! On flirte ici avec l'obsolescence programmée...

Une fois le programmateur opérationnel, et le fichier binaire disponible, la programmation de l'EEPROM s'avère triviale :


Il suffit alors de remplacer l'EEPROM nouvellement programmée sur le support équipant la carte électronique pour qu'à la mise sous tension, les modifications soient disponibles.

Note : en y regardant de plus près, vous remarquerez que j'ai programmé l'EEPROM avec le fichier umitecompanion.eeprom. J'ai récupéré ce fichier du dépôt sur le site proposant le MicroMite Companion cité plus haut.

Parce que la compilation à partir des sources génère un binaire qui ne correspond pas au binaire directement récupéré. Un possible manque de mise à jour des sources peut expliquer ce phénomène. Ceci se traduit par un plantage du système lors de l'appui sur la touche F8, sensée lister le contenu de la SD card. Ce problème est fort ennuyeux car avec les quelques modifications simples effectuées précédemment sur le positionnement des touches du clavier, l'utilisation d'un système 'presque' Français était devenu bien plus agréable.

Bilan :  mon idée initiale ne fonctionne pas vraiment, ou pas encore, du fait de l'impossibilité de compiler un système stable avec les sources disponibles. Peut-être vais-je contacter les initiateurs de ce projet pour leur faire part de ce problème, ainsi que celui de la patte du processeur restée 'en l'air'. L'idée de ce projet est tout à fait intéressante, mais elle manque peut-être d'un peu plus de finalisation.

Ceci dit, de base, le système fonctionne très bien, et si le besoin s'en fait sentir, un environnement de développement simple et efficace est disponible pour compiler du code SPIN, la mise à jour du firmware est très facile en passant par un programmateur d'EEPROM. La rapidité d'exécution du code Basic par le processeur MicroMite est tout à fait impressionnante. Le tout pour un coût de quelques Euros.

vendredi 17 octobre 2014

Micro-contrôleurs ZILOG.

Ou le retour aux sources!

Je ne vais pas faire état dans ce billet de l'histoire d'un des plus fameux micro-processeurs que fût le Z80, et de toute sa lignée. Ce circuit n'intéresse plus aujourd'hui que les nostalgiques de la 'grande époque' et les 'rétro-gamers'.

http://en.wikipedia.org/wiki/Zilog_Z80
 
Bien que ce propos puisse quand même être tempéré puisque ce circuit, simple et rapide, peut trouver très avantageusement sa place au sein d'un FPGA, implémenté en tant que module IP. Il est très facile d'en insérer un certain nombre dans un même FPGA et ainsi, de créer des systèmes multi-tâches et très performants. Ceci est une autre histoire, peut-être une publication sur ce thème dans les prochains mois... Un petit exemple de ce qu'il est possible de faire à ce sujet : zx-spectrum-on-an-fpga



Non, je vais faire ici état des micro-contrôleurs de la famille Z8F. Précisons de suite que ces micro-contrôleurs n'ont rien à voir avec la famille Z80. L'architecture est différente ainsi que le jeu d'instruction. Par contre, et c'est un avis personnel, je trouve que la philosophie Zilog reste présente dans ces circuits, à savoir la simplicité d'utilisation. Ce qui ne veut absolument pas signifier qu'ils sont 'trop' simples ou archaïques, bien que ce soit des circuits 8 bits, mais fonctionnant à 20MHz pour certains modèles.

Au début, exista les micro-contrôleurs Z8E et l'émulateur 'in-circuit' associé :

Illustration provenant du site de RS.

Ce système de développement date du début des années 90. Les trois supports vide du bas de la carte permettaient d'y connecter un câble plat en nappe dont l'autre bout s'enfichait à la place du futur processeur, sur la carte en cours de test. Le logiciel de développement, gratuit, permettait non seulement la programmation de toute la gamme de processeur, sans limitations, mais aussi le débogage en temps réel. Fonctionnalité très pratique lors du décodage d'une trame RC5 par exemple! Une fois finalisé, le programme pouvait être copié directement dans le processeur en le plaçant sur un des supports du haut de la carte.
L'ensemble de la communication entre le système de développement et le PC hébergeant la partie logicielle se faisait par l'intermédiaire d'un simple port série. J'ai longtemps utilisé cet outil qui, grâce à sa facilité d'utilisation et le très faible coût des processeurs Z8E, m'a permis de résoudre bien des problèmes avec élégance.

Le seul grief qu'il était possible d'émettre à propos de ce système de développement, concernait le fait que ces processeurs étaient des circuits OTP, autrement dit : One Time Programmale. Donc, tout changement de version de programme s'accompagnait d'une mise au rebut du circuit et de la programmation d'un nouveau spécimen.

Sont alors arrivé, vers la fin des années 90, les Z8F, 'F' pour Flash!

Derniers nés de la famille (pas encore disponible le 10/2014)

La philosophie de ces circuits reste exactement la même que les version Z8E, si ce n'est que, grâce à la flash intégrée au processeur, tout le système de programmation ET de débogage est intégré à la puce. Il n'est donc plus nécessaire de disposer d'un matériel 'conséquent' pour développer avec ces processeurs. De plus, l'ensemble de la communication avec l'outil de développement est réalisée par l'intermédiaire d'une seule connection sur le circuit, la patte DBG. Un adaptateur série, ou mieux USB, est alors requis pour relier simplement le processeur en cours de programmation à l'ensemble de l'application fournie par Zilog à savoir le logiciel 'Zilog Developer Studio II' ou ZDSII.


Interface opto-isolée de Zilog.






Le coût de développement avec ce type de micro-contrôleur est extrêmement faible puisque le logiciel de développement est toujours gratuit et qu'une interface Xtools de Zilog est facturée 24,86 € HT chez Mouser au 15 octobre 2014 (réclame gratuite), Farnell ne disposant pas d'autant de références...

Une version 'simple' de l'interface de programmation de Zilog fournie avec les premières versions du Kit de développement sur base de processeurs Z8F. L'interface proposée était alors le port RS232 :



Étant acquis qu'il est possible de développer à moindre coût avec ce type de circuit, voyons ce qu'ils proposent. Voici l'exemple du Z8F6423, gros circuit de la série Z8F :

Origine : Zilog

  • 20MHz eZ8 microprocessor core
  • 64KB Flash program memory
  • 4KB register SRAM
  • 12-channel 10-bit A/D converter
  • Four 16-bit timers with PWMs, plus capture and compare capability
  • 60 general-purpose I/Os, depending on package type
  • 24 vectored interrupts
  • Power-On Reset (POR) and Voltage Brown-Out (VBO)
  • Full-duplex SPI and I2C, plus 2 UART ports with IrDA encoder/decoder 
  • On-chip debug with break and trap capability
  • 3.0V to 3.6V voltage range
  • Standard (0°C to 70°C) and extended (-40°C to 105°C) temperature range
  • Available in 80-pin QFP package
On pourra regretter l'absence de zone de mémoire EEPROM et d'horloge temps réel. Pour des circuits spécifiquement prévus pour des applications embarquées, ces ajouts auraient pu être utiles. Mais disponible à 6,03€ HT chez Farnell (pour ne léser personne!), le choix de l'absence de ces dispositifs semble justifié. Charge au développeur d'implémenter ces fonctions de façon externe et de les relier aux différents bus du micro-contrôleur!

Par opposition, voici les caractéristiques du plus petit processeur de la gamme, le Z8F0113 :

Origine : Zilog

  • 5.5MHz eZ8 microprocessor core
  • 1KB Flash program memory
  • 1KB register SRAM
  • 5.5MHz Internal Precision Oscillator
  • Two 16-bit timers with PWMs and capture and compare capability
  • Up to 24 general-purpose I/Os
  • Power-On Reset (POR) and Voltage Brown-Out (VBO)
  • UART port with IrDA encoder/decoder
  • On-chip debug with break and trap capability
  • 2.7V to 3.6V voltage range
  • Standard (0°C to 70°C) and extended (-40°C to 105°C) temperature range
  • Available in 8-pin QFN, 8, 28 and 20-pin SOIC, 20 and 28-pin SSOP and 8, 20 and 28-pin PDIP packages

Une fois passée la découverte...

Le kit de développement est toujours produit par Zilog et est disponible sur commande chez Mouser à 33,16€ HT, mais plus chez Farnell. Ce kit est donc proposé à prix tout à fait abordable. Et, si par hasard il se trouvait à ne plus être disponible, il est très facile d'en réaliser, avec peut-être plus de périphériques intéressants que celui créé par Zilog, à savoir une horloge temps réel et une FRAM série comme sur cet exemple :

Ne cherchez pas le site http://www.electrodiy.net, il n'existe plus.
Sur cette carte, toutes les broches du processeur sont disponibles sur les connecteurs, bien que certaines d'entre elles partagent leurs signaux de bus série avec l'horloge et la FRAM. C'est la carte idéale pour le test rapide.

Une fois les solutions techniques validées et définitivement adoptées, il devient aisé de passer à la pré-production, sachant que la connection à réaliser avec l'ordinateur de développement se résume au strict minimum, le signal série et la référence :

Carte pré-ampli haute qualité commandable par signal IR et codeur rotatif.
Le connecteur de programmation se situe à gauche du processeur. Ce dispositif suffit pour permettre la programmation du circuit et le débogage en temps réel. Comparé à d'autres systèmes, cette solution est gratuite, simple, performante et très facile à mettre en œuvre!

Bilan :

Cette série de micro-contrôleurs de chez Zilog n'a jamais trouvé sa place auprès des amateurs. Personnellement, je n'ai pas d'explications à ce fait. Certes, la fréquence de fonctionnement de 20Mhz peut paraître faible, mais au début des années 90, elle se situait dans la bonne moyenne. Ces circuits sont facilement maîtrisables, comparés aux ARM par exemple. Ils possèdent relativement peu de registres, la programmation C se fait sans difficulté et l'accès aux instructions en assembleur se fait 'au fil de l'eau' avec l'aide du logiciel de développement.
Au fil des recherches sur le 'net', il est même possible de trouver des ressources permettant de programmer plus facilement les registres les plus 'délicats' du processeurs , à savoir les timers :


La ressource se situe ici : timer-calculator. Le code généré devant être éventuellement adapté au processeur utilisé.

Évidemment, d'autres familles de micro-contrôleurs existent comme les très intéressants circuits de la famille MSP430 de Texas Instruments. Mais la politique commerciale de cette entreprise concernant les outils de développement est discutable. Je peux comprendre que Texas-Instruments ne veuille pas casser le marché des société tierces fournissant des outils de programmations, mais en tant qu'utilisateur de circuits programmables de ce genre, la seule chose qui m'intéresse est de pouvoir les programmer avec le moins de contraintes possibles.

D'autres fabricants limitent les fonctionnalités de leur logiciel en possibilités d'optimisation du code. Cela peut se comprendre. Après-tout, si le besoin s'en fait sentir, le développeur peut acquérir une licence et ainsi profiter de toute la puissance de l'outil. Limiter la taille du code est une pratique que je juge archaïque et indigne, s'agissant de la considération du client.

Or donc, après une longue période d’inutilisation des ces micro-contrôleurs Zilog, j'ai décidé de m'y remettre. Ils permettent de faire tellement, de façon tellement efficace et en tellement peu de temps, que dès lors que la production rapide de matériels divers se fait sentir, ils (re)deviennent irremplaçables!