vendredi 30 décembre 2022

Installation de STM8 Tiny BASIC sur carte NUCLEO-8S207K8

Le vidéo suivant monntre comment programmer la carte NUCLEO-8S207K8 avec le binaire de STM8 Tiny BASIC. Cette vidéo est destinée aux utilisateurs de Windows. La procédure sur Linux est très semblable.

STM8 Tiny BASIC Version 3.1

Je viens de créer une pré-release pour la version 3.1 de STM8 Tiny BASIC. Cette version ajoute des commandes pour le contrôle PWM ainsi que pour le contrôle des servo-moteurs. En fait puisque les servo-moteurs sont contrôlés par PWM il s'agit du même périphérique et des même sorties. La seule différence est que les commandes SERVO configure la minuterie avec les paramètres spécifiques au servo-moteurs.

Les manuels de référence français et anglais sont maintenant disponibles en format PDF dans le dossier docs.

Commandes ajoutées

  • PWM.EN Pour activer ou désactiver le contrôle PWM.
  • PWM.CH.EN Pour activer ou désactiver un canal spécifique. Il y en a 4.
  • PWM.OUT Pour contrôler la largeur d'impulsion sur un canal.

  • SERVO.EN Pour activer ou désactiver le contrôle servo-moteur.
  • SERVO.CH.EN Pour activer ou désactiver un canal spécifique. Il y en a 4.
  • SERVO.POS Pour envoyer une commande de position au servo-moteur.

En plus de ça, une réécriture assesz importante du code a étée effectuée pour réduire la taille et améliorer la performance de l'évaluation des expressions arithmétiques.

dimanche 27 novembre 2022

Tiny BASIC version 2.5

Une nouvelle version de Tiny BASIC sur carte NUCLEO-8S20X est maintenant en ligne. Cette version supporte maintenant 2 cartes NUCLEO

  • NUCLEO-8S208RB
  • NUCLEO-8S207K8

    Cette petite carte a moins de broches mais elle est pratique car elle s'enfiche dans une carte de prototypage sans soudure.

Installation du firmware sur la carte.

Lorsqu'une de ces cartes est branchée sur le PC le programmeur STLINK inclus sur ces cartes crée à la fois un disque virtuel qui apparait sous le nom NOD_8S207 ou NODE_8S208 selon la carte choisie et ajoute un port sériel. Pour l'installation du firware sur la carte

  1. Clonez le dépôt https://github.com/Picatout/stm8_tbi ou bien téléchargez le fichier zip du dépôt. Pour télécharger ce fichier cliquez sur le bouton vert CODE ensuite dans le menu sur download zip.
  2. Dans le répertoire build il y a un sous-répertoire pour chaque carte. Il suffit de copier le fichier TinyBasic.bin sur le disque virtuel NOD_20x.

Connecxion avec TeraTerm

Suppossons que vous utilisez Teraterm sur Windows. En lançant Teraterm la fenêtre nouvelle connexion s'ouvre. Il faut choisir Série avec le port identifié COMx STMicroelectronics STLink Virtual COM Port.


Ensuite dans le menu Configuration choisir port série, mettez la vitesse à 115200 et fermez la fenêtre en cliquant sur le bouton New setting


Encore dans le menu Configuration, choisir Terminal et dans la boite aller à la ligne mettez réception sur auto.

Si vous trouvez la police de caractères trop petite allez dans Configuration et sélectionnez Police.
Vous voudrez sûrement sauvegarder votre configuration pour ne pas avoir à recommencer à chaque fois. C'est encore dans le menu Configuration en sélectionnant sauvegarder setup.... Lors de la réouverture fermez la fenêtre nouvelle connexion et allez dans Configuration et faite restaurer setup... Ensuite, ce qui n'est pas évident, il faut allez dans Configuration, port série et cliquer sur le bouton new setting pour activer la connexion.
Finalement cliquez sur le bouton RESET de la carte pour redémarrer TinyBASIC.

samedi 25 juin 2022

Tiny BASIC sur carte NUCLEO-8S208RB, version 2.1

je viens de compléter la version 2.1 du projet STM8_TBI. Cette version voit l'ajout de 5 commandes et fonctions.
  1. BUFFER pour l'allocation d'un tamppon d'octets en mémoire RAM.
  2. I2C.OPEN permet d'ouvrir le périphérique I2C du MCU.
  3. I2C.CLOSE ferme le périphérique I2C.
  4. I2C.READ pour recevoir des données d'un dispositif I2C.
  5. I2C.WRITE pour envoyé des données à un dispositiv I2C.

Regardez sur Youtube pour un plus grand affichage.

vendredi 10 juin 2022

TinyBASIC sur carte NUCLEO-8S208RB , version 2.0

J'ai continuer le développement stm8_tbi. J'ai fait beaucoup de changement ce qui explique que le numéro de version passe de 1.x à 2.0. Le système est de moins en moins un TinyBASIC et ressemble de plus en plus à Microsoft BASIC tel qu'on le retrouvait sur de nombreux ordinateurs 8 bits des années 80, tel que les Apple II, Commodore C64,VIC-20,PET et les Tandy TRS-80. Je n'ai cependant pas implémenter les calculs sur virgule flottante mais les entiers sont passés de 16 bits à 24 bits.

Pour connaître tous les changements il faut consulter le manuel de référence.

Démonstration des nouvelles fonctionnalités

Il y a 2 erreurs dans le vidéo.

  1. On peut mettre un commentaire après l'étiquette sur la première ligne. Ce commentaire n'apparaît pas dans l'affichage de la commande DIR. J'avais oublier que j'avais fais ce changement.
  2. Pour éditer une ligne d'un programme BASIC on entre le numéro de la ligne suivit de CTRL+E et non CTRL+I. La confusion vient du fait que j'utilise les 2 langues dans ce travail, le français et l'anglais. E en anglais se prononce I.

samedi 15 janvier 2022

analyse de circuit du PDP-8

Dernièrement je me suis intéressé à l'électronique utilisée dans le célèbre ordinateur PDP-8 (Programmable Data Processor) première génération de Digital Equipment Corporation (DEC). Le premier PDP-8 a été mis en marché en 1965 et il a été produit jusqu'en 1978, sur plusieurs générations technologiques. La première génération utilisait des circuit logiques DRL (Diode-Resistor-Logic) et DTL (Diode-Transistor-Logic) et une mémoire à tores magnétiques.

PDP-8 (1)
PDP-8 au musé de Bletchley Park, Angleterre.

Puis lorsque les circuits intégrés TTL (Transistor Transistor Logic) ont été mis en marché Digital a fabriqué une version dont les circuits étaient conçu avec cette technologie. Cependant il a fallu attendre les dernières années de sa production pour que la mémoire à tore magnétique soit remplacée par de la mémoire silicium RAM en circuits intégrés. Lors de ma dernière année de collège (1977-78) j'avais un cours consacré au PDP-8. On apprenait à le programmer en assembleur et on étudiait ses circuits logiques. Ceux de la version TTL.

En 1975 la compagnie Intersil a mis en marché un microprocesseur en technologie CMOS le IM6100 qui répliquait le CPU du PDP-8. Il a été utilisé dans certaines machine comme le VT78.

VT78
VT78 de Digital utilisant le IM6100 d'Intersil.

De 1965 à 1977 la technologie a donc permis de passer d'un mini ordinateur pesant 113Kg à un micro-ordinateur pesant sans doute moins de 30Kg et qui tenait dans le boitier d'un terminial vidéo VT521. Et la plus grosse part de ces 30Kg revenait au tube cathotique utilisé pour l'affichage.

Analyse de circuits DTL

Mes recherches m'ont permises de retrouver plusieurs manuels publiés par DEC à cette époque sur le site bitsavers.org

J'ai donc entrepris d'étudier les circuits en question pour en comprendre le fonctionnement. Selon le site suivant https://www.pdp8online.com/straight8/functional_restore.shtml le PDP8 qu'ils ont restauré contenait

  • 230 cartes de circuits imprimés.
  • aproximativement 10,148 diodes
  • 1409 transistors
  • 1674 condensateurs
  • 5615 résistances
Seulement 1409 transistors pour un ordinateur basé sur des mots de 12 bits alors que le microprocesseur MOS 6502 avec des mots de 8 bits utilisé dans le Apple II en contenait plus de 3000. Ça s'explique par l'utilisation de circuit DRL. On peut faire simplement avec une résistance et des diodes des portes logiques comme je vais le montrer plus bas.

Mon intention dans cet article est d'analyser le fonctionnement de ces circuits logiques. Non pas dans leur complexité mais seulement les circuits de base. Car l'ordinateur était construit à partir d'un petit nombre de cartes logiques de base utilisées en grand nombre et interconnectées entre elles pour former la complexité de l'ordinateur. Comme mentionné plus haut il y en avait 320. C'est un peu comme si aujourd'hui on voulait reconstruire le PDP-8 avec des circuits intégrés de la série 74HCxxx et qu'on utilisait seulement des AND, OR et NON en les combinants ensemble pour former des flipflops, des latchs, des décodeurs, un ALU, etc. C'est d'ailleurs ce qu'ils ont fait dans les dernières générations en utilisant des circuits intégrés TTL au lieu d'assemblage DTL.

architecture du PDP-8

L'objectif principal de Digital en concevant le PDP-8 était de réduire le coût au minimum. Ils devaient donc choisir une architecture très simple appellée architecture à une adresse.


Une architecture à une adresse signifie que les instructions machines n'ont besoins que d'une adresse pour spécifier les opérantes. Habituellement il s'agit d'une adresse mémoire. Par exemple pour les opérations logique et arithmétiques l'une des opérandes est l'accumulateur (AC) avec le contenu d'une adresse mémoire. Le résultat est déposé dans l'accumulateur. Donc l'instruction n'a besoin que d'un paramètre soit l'adresse où se trouve la seconde opérande.

Comme on le voit il n'y a que 4 registres de 12 bits et 1 registre de 1 bit LINK. Comme vous le voyez il n'y a pas de pointeur de pile. Lors d'un appel de sous-routine l'adresse de retour était enregistrée à la première adresse de la sous-routine. Les programmeurs devaient donc réserver cette adresse dans ce but. Ceci exclus la possibilité de faire des appels récursifs. En comparaison le MOS 6502 avait 5 registres 8 bits et 1 de 16 bits pour le compteur ordinal.

De plus le PDP-8 n'avait qu'un seul bus de 12 bits pour lire et écrire dans les registres. Comme on le voit le compteur ordinal n'avait que 12 bits lui aussi donc ne pouvait adresser que 4096 mots de mémoires. De base le système se vendait donc avec 4096 mots de mémoire mais grâce à un système de sélection de plan (bank) mémoire il était possible d'ajouter des plans de mémoire en tranche de 4096 mots. Évidemment 1 seul plan (bank) était visible à la fois. En étudiant cet ordinateur je ne pouvais m'empêcher de faire le rapprochement avec le CPU de la ligne de base des microcontrôleurs PIC qui eux aussi codent les instructions sur 12 bits et divisent la mémoire RAM en plans (banks) de 128 mots. Car sur les PIC les instructions qui accèdent la mémoire code l'adresse sur 7 bits.

Ceci dit je ne m'attarderai pas plus que ça sur l'architecture de programmation du PDP-8. Voici la schématique d'une carte comprenant 7 inverseurs et une autre comprenant 3 flipflops.


Si on s'attarde à la carte des inverseurs (fonction logique NON) on constate qu'il y a 2 alimentations, l'une de +10 volts et l'autre de -15 volts. L'alimentation de +10 volts est reliée à la base de chaque transistor par une résistance de 100Kohm. Cette alimentation ne joue aucun rôle dans le fonctionnement logique des portes. Son seul rôle est de réduire le temps de commutation des transistors lors du cutoff. En effet lorsqu'un transistor est en conduction une charge électrique est accumulée dans la jonction base-émetteur. Au moment où le courant de la base est coupé cette charge doit-être dissipée. Grâce à l'alimentation +10 volts et la résistance de 100Kohm cette charge est draînée plus rapidement donc le transistor commute plus rapidement vers le cutoff. Puisque cete partie du circuit n'est pas utile à l'analyse de la fonction logique elle sera ignorée ultérieurement.

À droite du circuit on note la présence des diodes D8-D11 ainsi que le la résistance R15 branchées en série entre le GND et le -15 volts. La tension au point 6 est d'environ 4*-0,7=-2,8 volts. À partir du point 6 les diodes D1-D7 se branche au collecteur de chaque transistor. Le rôle de ce circuit est de limiter la tension au collecteur lorsque le transistor est en cutoff à environ 5*-0,7=-3,5 volts. Donc lorsque le transistor est en saturation le voltage au collecteur s'approche de 0 volts et lorsqu'il est bloqué elle s'approche de -3,5 volts. Ces valeurs correspondent aux niveaux logiques de fonctionnement de l'ordinateur. On retrouvre le même circuit sur toutes les cartes qui implémentent des fonctions logiques. Pour l'analyse du fonctionnement logique des circuits on peut ignorer ce limiteur de tension.

En éliminant de notre analyse le circuit +10 volts et le limiteur de tension au collecteur on va pouvoir redessiner un forme simplifié des circuits logiques pour fin d'analyse.

Une fois épuré un inverseur, ou si vous préférez la fonction logique NON correspond au circuit suivant:

Si l'entrée (Input) est mise au GND le transistor Q1 bloque car le courant ne circule plus dans la base. En effet pour que le courant circule dans la base de Q1 il faut 3*-0,7=-2,1 volts au point jct1. Hors si l'anode de D1 est à GND il n'y a que -0,7 volts au point jct1. Le transistor étant bloqué on retrouve -3 volts à la sortie (Out). Par contre si on laisse flotter l'anode de D1 ou si on la met à un voltage inférieur à -2,8 volts le courant peut circuler à travers R1,D2 et D3 dans la base de Q1. Le transistor entre alors en saturation et le voltage à sortie monte à 0 volts. En terme logique on obtient donc la fonction NON.

On peut obtenir une fonction NON ET en ajoutant des diodes aux points de jonctions jct1 comme ceci.

On peut ajouter d'autres diodes si on a besoin de plus d'entrées. Avec des portes NON et NON ET on peut construire n'importe quel circuit logique aussi complexe soit-il. On dit que ces 2 fonctions combinées ensemble sont Turing complete2. On pourrait dire que ce sont les briques LEGO de l'informatique3.

En ce qui concerne la carte de 3 flipflops (bascule bistable). Ça a l'air compliqué n'est-ce pas? Il n'y a que 6 transistors mais 46 diodes. Vous comprenez maintenant pourquoi il y avait tant de diodes dans cet ordinateur. Ce type de circuit ne s'appelle pas DTL pour rien. Le D vient en premier. Première constatation les transistors sont de type PNP et l'alimentation principale est donc négative à -15 volts.

Puisque la carte comprend 3 circuits identiques et une partie commune j'ai simplifié en extrayant un seul flipflop. J'ai aussi enlevé le circuit à +10 volts.

La ligne verticale grise sépare la partie du circuit commune aux 3 flipflops. Cet arrangement de diodes ne sert qu'à limiter le voltage au collecteur des transistors à -3.5 volts environ (clamping) à travers les diodes D1 et D6. Les deux valeurs logiques était donc représentées par des tenstions de 0 volt et -3 volt.

Le flipflop le plus simple est le RS-flipflop. On le construit en utilisant 2 portes NAND (NON ET) comme ceci.


Lorsqu'il y a un barre au dessus d'un symbole logique ça signifit que l'entrée est active à 0 logique. Si on met l'entrée ~S à 0 volt (0 logique) on force la sortie Q1 à -3 volts (1 logique) et si on met l'entrée ~R à 0 volt on force la sortie Q2 à -3 volt. La sortie ~Q est le complément de la sortie Q.
Sur le schéma du PDP-8 le point F représente la sortie Q et le point E représente la sortie ~Q. Le point D représente l'entrée ~S du flipflop. Il n'y a pas d'entrée ~R sur le schéma du PDP-8 cette entrée a étée remplacée par un circuit DCD expliqué ci-bas.

Diode-Capacitor-Diode

Cependant ce RS flipflop a été modifié quelque peu. Le NAND de droite a été modifié pour ajouter une entrée spéciale constituée des composants C1,R7,R8,D10..D14,D47,D48. Selon la terminologie de Digital ce circuit spécial s'appelle un DCD (Diode-Capacitor-Diode). Ça fonction est de changer l'état du flipflop mais avec un délais et sous contrôle d'une impulsion.

Voici une représentation séparée du circuit pour analyse.

Le circuit a donc 3 entrées et une seule sortie qui va à la base d'un transistor Q2 du flipflop en passant par la diode D10.

  • conditionning input, Si cette entrée est maintenue à 0 volt la condensateur ne peut se charger et le DCD ne passera aucun signal au flipflop.
  • pulse input, Pour que cette impulsion soit transmise au flipflop il faut que le condensateur est été chargé en maintenant level input à 0 volt alors que les 2 autres entrées sont à -3 volts.
  • Level input, Tandis que les 2 autres entrées sont à -3 volts et que celle-ci est à 0 volt le condensateur C1 se charge à travers D11 et R7 puisque la jonction de D11-R8 est plus positive que la jonction D13-D14-R7. Le rôle de D12 est d'empêcher C1 de se charger dans l'autre sens advenant que les entrées conditionning et pulse seraient à 0 volt alors que level serait à -3 volts.
Avant d'envoyer une impulsion ascendante à pulse input il faut laisser le temps à C1 de se charger. Lorsque la tension passe de -3 volts à 0 volt à l'entrée de pulse si le condensateur C1 est chargé le voltage à l'anode de D5 devient suffisamment positif pour que le transistor Q1 bloque s'il n'est pas déjà bloqué. Le flipflop va donc basculer dans son état complémentaire. Comme le collecteur de Q1 est connectée à l'entrée conditionning et que cette sortie passe à 0 volt par basculment du flipflop, le circuit DCD est bloqué pour les impulsions suivantes quel que soit l'état de l'entrée level. On a donc un latch. Pour réinitialiser le latch il faut mettre l'entrée au point D du flipflop à 0 volt.

toggle flipflop

Si on installe un circuit DCD sur chacun des transistors du flipflop on peut configurer celui-ci pour fonctionner comme un toggle flipflop.

Si on branche les points d'entrrées E et L à 0 volt et qu'on branche les points d'entrées D et K ensemble en les maintenant à -3 volts. Chaque fois qu'une impulsion positive sera envoyée aux points D,K le flipflop va basculer d'état. C'est ce qu'on appelle un toggle flipflop. Si un train d'impulsions de fréquence Fi est envoyée sur l'entrée D,K on retrouve à la sortie du flipflop un train d'impulsion de fréquence Fo=Fi/2.

Démonstration pratique

Pour m'assurer que j'avais bien compris le fonctionnement du DCD j'ai fait un montage sur carte sans soudure. Ce montage comprend un multivibrateur astable qui fonctionne à 1,5 Hertz. La sortie Q du multivibrateur sert d'impulsion pour faire basculer un premier toggle flipflop dont la sortie Q et utilisée pour faire basculer un deuxième toggle flipflop. De cette façon j'obtiens un compteur binaire à 3 bits. Le compte binaire est envoyé à un décodeur qui sélectionne la sortie LED à allumer en fonction du code binaire. On a donc 8 LEDs de sortie.

Schématiques du montage

Le multivibrateur astable est utilisé comme bit de poids 0 du compteur binaire.


Le circuit suivit comprends 2 toggle flipflops pour les bits de poids 1 et 2. La sortie Q0 du multivibrateur sert d'impulsion pour faire basculer le flipflop de poids 1 et la sortie Q1 de ce flipflop sert d'impulsion pour faire basculer le deuxième flipflop.

Le décodeur sélectionne la LED à allumer en fonction du code binaire du compteur. Le circuit utilise 6 entrées puisque les sorties complémentaires doivent-être aussi utilisées par le décodeur.

En conclusion de ce long article je vous laisse l'opportunité d'étudier le circuit du décodeur pour en comprendre le fonctionnement qui somme toute est simple. Par exemple pour allumer la LED qui correspond au compte 0 la fonction booléenne est ~Q0*~Q1*~Q24.


NOTES:

  1. Les terminaux vidéos VT52,VT100, etc étaient aussi des produits de Digital.
  2. Référence au mathématicien Alan Turing.
  3. Les lois de De Morgan démontrent ~A*~B=~(A+B) et l'inverse ~A+~B=~(A*B) ce qui revient à dire que la combinaison des fonctions NON et OU sont aussi Turing complete.
  4. le caractère '~' représente la négation logique. Exemple: ~0=1 et ~1=0.Le caractère '*' représente la fonction ET et le caractère '+' la fonction OU.
  5. Manuel de maintenance du PDP8S dans lequel j'ai pris les schématiques présentées dans cet article.

samedi 1 janvier 2022

Boardview-laz version 1.1.4 et démo.

Je viens de mettre à jour le dépôt git avec la version 1.1.4

Nouveauté de cette version

Dans les versions antérieures pour faire appaître le menu surgissant il fallait cliquer bouton droit sur un élément de circuit. Maintenant on peut cliquez avec le bouton droit à n'importe quel endroit sur l'espace de travail de boardview pour le faire surgir. De plus 2 nouveaux éléments sont ajoutés et toujours actifs:

  • Add tag... Pour ouvrir la boite de dialogue tag.
  • Add component... Pour ouvrir la boite de dialogue components.
Ces 2 items permettent de réduire le déplacement de la souris. Plus besoin de se rendre à la barre d'outils pour ajouter un de ces éléments.

Une autre nouveauté est qu'on peut maintenant repositionner un fil en le tirant par l'une de ses extrémmité en gardant le bouton gauche de la souris enfoncé.

NOTE: Les projets créés avec les versions antérieures ne peuvent plus être réouvert dans cette version. En effet les composants ne seront pas situés au bon endroit.

Vidéo de démonstration