J'ai ajouté le jeu **FALL** sur la console stm8 gamepad. Comme le jeu TETRIS est bien connu ça se passe d'explication.
vidéo démonstration
Oui je sais, je joue très mal.
J'ai ajouté le jeu **FALL** sur la console stm8 gamepad. Comme le jeu TETRIS est bien connu ça se passe d'explication.
Oui je sais, je joue très mal.
J'ai ajouté le langage Forth à l'ordinateur pomme-I.
Dans ce démo je fait une comparaison entre la vitesse d'éxécution du p1BASIC versus p1Forth.
Le projet complet POMME-I comprend 3 modules, l'ordinateur proprement dit basé sur une carte NUCLEO-8S207K8, le terminal basé aussi sur une carte NUCLEO-8S207K8 et enfin l'alimentation 5VDC. Cependant il est possible d'expérimenter le POMME-I simplement en construisant le premier module. J'ai dessiné le schéma de base de ce module.
La carte NUCLEO-8S207K8 comprend un programmeur STLINK-V2.1 donc tout ce qu'il faut pour la programmer c'est un cable USB pour la relier à l'ordinateur. Lorsque la carte est reliée à l'ordinateur. Un lecteur apparaît ainsi qu'un port série virtuel qui peut-être utilisé avec un émulateur de terminal pour communiquer avec le POMME-I. Pour programmer le mcu il suffit de copier le fichier pomme_1.bin sur le lecteur créé par l'insertion de la carte.
Pour un montage permanent le circuit peut-être transféré sur une carte comme cell-ci
Steve Wozniak le créateur du Apple-I a programmé le moniteur de celui-ci sans utiliser d'assembleur. Quelque années après lui j'ai fait la même chose sur le premier micro-ordinateur que j'ai acheté. Ce dernier était basé sur un processeur RCA CDP1802. Pour le programmer il n'y avait qu'un clavier hexadécimal et l'affichage était constitué de LEDs. Dans la vidéo suivante j'utilise le POMME-I pour montrer comment on programmait sans assembleur.
À travailler de cette façon on mémorise assez rapidement les codes machines ce qui évite d'avoir à consulter le manuel de référence fréquemment. De plus en ce qui concerne l'ordinateur que j'avais le clavier était hexadécimal mais l'affichage LED était binaire donc j'ai aussi appris à traduire les codes binaires en hexadécimal au premier coup d'oeil.
Ces derniers jours j'ai apporté plusieurs améliorations au projet.
Dans le vidéo suivant je montre comment:
Dans la version précédente du moniteur, assembler le code pour les appels système était un peu compliqué et encore plus compliqué lorsqu'il s'agissait d'opérations sur les fichiers. J'ai simplifié tout ça en ajoutant la commande S. De plus j'ai ajouté la commande ] pour assembler l'instruction machine RET qui indique la fin du programme en langage machine et le retour vers le moniteur.
En MS-DOS il y avait un programme appellé debug.exe qui était un moniteur avec un assembleur et un désassembleur ainsi que d'autre fonctions pour examiner et modifier la mémoire RAM. Il y avait 2 types de fichiers exécutables en MS-DOS, les fichiers *.COM et les fichiers *.EXE. L'application debug.exe permettait de créer des fichiers *.COM. Avec le p1Monitor mon objectif est de m'approcher des fonctionnalités de debug.exe en permettant de créer des fichiers en assembleur qui pourront être chargés et exécuter à partir de p1Monitor. Le désassembleur existe déjà puisque je l'avait créé en 2019 avec le projet MONA, ce ne sera pas trop compliqué d'intégrer ce désassembleur à p1Monitor et ensuite il ne me restera qu'à créer l'assembleur.
Le moniteur possède maintenant un désassembleur accessible avec la commande @. L'affichage pause à chaque page et il faut appuyer sur la barre d'espacement pour voir la page suivante. Toute autre touche revient à la ligne de commande du moniteur. Le STM8S207K8 possède un boot loader en ROM à l'adresse 0x6000. Voici les premières lignes de code tel que désasssemblées par stm8_dasm.
#6000@
6000: 9B
6000 9B SIM
6001 AD 0C CALLR 600F
6003 25 19 JRC 601E
6005 CE 48 7E LDW X,487E
6008 A3 55 AA CPW X,#55AA
600B 27 11 JREQ 601E
600D 20 16 JRA 6025
600F C6 80 00 LD A,8000
6012 A1 82 CP A,#82
6014 27 06 JREQ 601C
6016 A1 AC CP A,#AC
6018 27 02 JREQ 601C
601A 99 SCF
601B 81 RET
601C 98 RCF
601D 81 RET
601E C6 48 00 LD A,4800
6021 A1 AA CP A,#AA
6023 26 09 JRNE 602E
6025 5F CLRW X
6026 4F CLR A
6027 4B 28 PUSH #28
6029 86 POP CC
602A AC 00 80 00 JPF 8000
La prochaine étape est l'écriture d'un assembleur simple. Lorsque l'assembleur sera intégré au moniteur je vais changer les commandes du moniteur. Toutes les fonctions qui ne font pas parti du moniteur de base comme S,] et @ seront accessible par une interface de commande dérivée accessibles par la lettre X. X pour extension puisque que ces fonctionnalités ne faisait pas partie du p1Monitorà lorigine.
Cette version V1.3R0 est disponible sur le github mais je vais attendre que l'assembleur soit complété avant de présenter un vidéo de démonstration.
Après avoir ouvert le boitier et extrait le circuit imprimé il est apparut évident que le fusible était brulé. Il ne suffit pas de le remplacer, il faut se demander pourquoi il a brûlé? Même si on ne possède aucune information sur le circuit on peut figurer que la cause la plus probable est une déficience dans le circuit de puissance. Il y a 2 composants montés sur des dissipateurs de chaleur. Il faut donc chercher à identifier ces composants et vérifier si l'un d'eux ou les 2 ne serait pas la cause de la défectuosité.
J'ai d'abord porté mon attention sur le composant au format TO-220 monté sur le plus gros dissipateur de chaleur. Sur le circuit imprimé c'est inscrit in sur la broche de gauche, out sur la broche du centre et g sur la broche de droite. Je croyais qu'il s'agissait d'un régulateur de tension pour alimenter le circuit intégré. l'ohmètre indiquait un court circuit entre les broches in et out. Je l'ai donc retiré du circuit. L'indication ne me disait rien, je m'attendais à quelque chose comme 7805 pour un régulateur linéaire de 5 volt, mais ce n'était pas ça.
Je suis donc au prise avec un TRIAC inconnu que je dois remplacer. L'étiquette à l'arrière de la déchiqueteuse indique que l'appareil consomme 3 ampères. Le fusible est de 5 ampères. Donc un TRIAC capable de passer un courant 8 ampères (paramètre It(rms)) et d'un voltage de coupure répétif maximum (paramètre Vdrm) de 600VAC devrait faire l'affaire. Il me reste à vérifier comment est alimenté le gate du TRIAC. Reverse ingeneering du circuit. Je constate qu'il est alimenté directement par le micro-contrôleur HT46R47 par la broche GPIO PA5à travers la résistance R4 de 200 ohm. J'ai trouvé le feuillet de spécification du microntrôleur dans l'internet et j'ai pu vérifier que les GPIOs peuvent sourcer un courant (paramètre Ioh) maximum de 10mA lorsque le MCU est alimenté à 5Volt. Donc il me fallait un TRIAC avec les paramètres suivants:
Un coup parti je n'allais pas m'arrêter là. Comme le circuit imprimé est simple face qu'il y a peu de composants j'ai décidé de faire le reverse engineering du circuit.
Il s'agit d'un appareil conçu pour l'Amérique du nord et fonctionne donc sur une alimentation secteur de 120VAC. Il y a 2 protections contre les accidents réalisées par les microswitch SW1 et SW2. La première (schredder on bin) coupe l'alimentation lorsque la déchiqueteuse est soulevée du bac de réception. La deuxième (emergency key) coupe l'alimention lorsque la clé rouge est retirée de sa fente.
Au point de vue électrique, il y a 2 protections:
Il y a 2 opto-coupleurs.
Le relais avec contacts DPDT sert à inverser la rotation du moteur lorsque l'appareil et en mode REV. Cette fonction est ulitisée lorsqu'il y a bloquage de l'appareil et qu'on veut faire ressortir les feuilles bloquées.
L'alimentation du MCU est régulée par la zener diode ZD3. Une seule diode 1N4007redresse la tension AC, donc le redresseur fonctionne en demi-phase ce qui nécessite un bon filtrage assuré par plusieurs condensateurs. Il y a les 2 électrolytics E3 et E4 de 470µF/16V ainsi que les condensateurs céramiques montés en surface C5 et C6.
Le relais nécessite 24VDC pour contrôler sa bobine. Cette alimentation est fournie par les composants D5 diode redresseuse. E2électrolytique de 220µF/35V et régulé par 2 zener en série ZD1 et ZD2.
La bobine du relais est contrôlée à travers le transistor Q3 de type PNP qui lui-même est contrôlé par le transistor Q1 de type NPN. C'est la sortie GPIO PA2 du MCU qui contrôle la base de Q1.
Le MCU possède 4 entrées de convertion analogique/numérique.
Par Auteur inconnu — Source inconnue, Domaine public, Lien
By <a href="//commons.wikimedia.org/wiki/User:Krishnavedala" title="User:Krishnavedala">Krishnavedala</a> - <span class="int-own-work" lang="en">Own work</span>, CC0, Lien
Cette image nous montre la polarité du gate et de A2 par rapport à l'électrode A1, aussi nommée MT1. selon les différents modes d'opérations. Dans le cas de cette déchiqueteuse le TRIAC est utilisé dans les modes (cadrants) 2,3. Si on regarde la schématique on constate que le Vdd du MCU est connecté au neutre de l'alimentation secteur et que Vss est négatif par rapport au neutre. Bien que j'ai oublié de l'indiqué sur la schématique l'électrode du TRIAC du côté de la résistance est A1 et celle du côté de F2 est A2. Ceci est nécessaire pour que le MCU puisse contrôler le TRIAC car comme on le voie sur l'image dans les cadrants 2 et 3 G doit-être négatif par rapport à A1 pour faire entrer le TRIAC en conduction. Donc lorsque le MCU veut bloquer le TRIAC il met la GPIO PA5à Vdd et lorsqu'il veut déclencher la conduction du TRIAC il envoie une impulsion négative sur la broche.
Pour qu'un TRIAC demeure en conduction il faut qu'un courant minimum circule entre A1 et A2. Comme en courant alternatif le voltage repasse à zéro à toutes les demi-période il faut que le MCU envoie une impulsion sur le gate au début de chaque demi-cycle, c'est à dire 120 fois par seconde. Dans le but de synchroniser ces impulsions avec le fréquence du secteur la ligne est monitorée au point A par le MCU sur l'entrée PA4à travers les résistances R10 et R11.
J'ai recommencé à travailler sur le moniteur du pomme I en ajoutant des fonctions au moniteur. Il s'agit de la version 1.4R0 Dans cette version j'ai ajouter les commandes:
Le traceur de cable est un outil très utile lorsqu'on travaille sur les réseaux cablés ou les systèmes téléphoniques. On s'en sert pour identifier un cable dans le panneau de jonction à partir de la prise murale dans un local. Comme tous les fils des prises murales aboutissent dans ce panneau et que la plupart du temps ils ne sont pas indentifiés cet outil a été inventé dans le but de simplifier cette identification. Il est constitué de 2 modules.
Ce module est très simple à réaliser avec une minuterie double TLC556 (2 minuteries 555 dans le même boitier 14 broches).
La première minuterie fonctionne en basse fréquence et est utilisée pour commuter les tonalités. Dans ce montage la période est d'environ 0,65 seconde. La sortie de cette minuterie est branchée à travers la résistance R10à l'entrée CV de la deuxième minuterie. Cette entrée contrôle la fréquence en modifiant le point de bascule des 2 comparateurs de la minuterie. Dans mon montage les tonalités sont d'environ 570 et 630 hertz.
Le montage est fait sur une plaquette à pastille de 5x7cm. Les pastilles de cuivre sont sur une seule face. La plaquette est montée dans un petit boitier en plastique de 98H x 58L x 22P mm.
La sonde se compose d'un amplificateur et d'un préamplicateur contenu dans des boitiers différents. L'ampli est basé sur un LM386-N.
Le préamplificateur est contenu dans un tube d'aluminium de 21mm de diamètre intérieur et de 10cm de long. Le préamplificateur est branché à l'amplificateur par un connecteur mini-DIN 3 broches.
J'ai utilisé un transistor NJFETà l'entrée du préamplificateur pour avoir une impédance d'entrée maximale puisque le couplage avec le signal se fait par couplage capacitif il est important que l'impédance d'entrée soit très élevée. Un circuit avec transistor bijonction n'aurait pas une impédance d'entrée suffisante.
Les condensateurs C4, C5 ainsi que la résistance R5 forme un filtre passe-bande. J'ai utilisé ltSpice pour simuler le circuit du préamplificateur et obtenir sa courbe de réponse.
Le gain en voltage du préamplifcateur est d'environ 5DBv selon la simulation.
Une carte identique de 5x7cm a été utilisée pour le montage de l'amplificateur. Celui-ci nécéssitant un boitier plus gros de 120H x 65L x 38P mm.
Le tube d'aluminium est récupéré d'un balais à neige pour auto et il est bouché à chaque extrémité par 2 morceaux de liège coupés dans un bouchon de bouteille de vin. Une languette de 21mm de largeur a été découpé dans une carte 5x7cm pour le préamplificateur inséré dans le tube d'aluminium. L'antenne de la sonde est un fil de cuivre calibre 14 AWG recouvert d'une gaine thermorétrécicante (shrink tubing). La longueur est arbitraire.
Ce petit circuit simple permet de détecter une inondation et de déclencher une alarme sonore.
Ce multivibrateur utilise 2 transistors, Q12N3904 qui est un petit transistor NPN d'usage général dans un boitier TO-92 et Q2 TIP32C qui est un transistor de puissance PNP dans un boitier TO-220 qui alimente le haut-parleur.
Lorsque les 2 électrodes sont mise en contact à travers un milieu conducteur comme l'eau, Q1 reçoit un courant dans sa base et entre en conduction. Le collecteur de Q1 fournie à son tour du courant à la base de Q2 qui lui aussi entre en conduction. Cependant à travers C1 et R2 il y a une rétro-action positive qui fait entrer les 2 transistors en saturation rapidement. C1 se charge et lorsqu'il a atteint sa pleine charge le courant dans la base de Q1 dimininue donc sa conduction aussi et entraîne Q2 dans la même direction. La conséquence est que le courant dans le collecteur de Q2 diminue et donc le voltage sur le haut-parleur. Encore une fois par rétro-action positive à travers C1 et R2 le voltage à la base de Q1 diminue rapidement et les 2 transistors coupent rapidement. À ce moment la tension à la base de Q1 est négative à cause de la charge qui s'est accumulée dans C1 durant la phase 1. Cependant C1 va se décharger à travers R1, R2 et les sondes. Lorsque le voltage aux bornes de C1 deviendra légèrement positif Q1 va se remettre à conduire pour débuter un nouveau cycle. La durée de la première phase est déterminée par la constante de temps (R2+résistance de la base de Q1)*C1 et la durée de la seconde phase est déterminée par la constante de temps (R1+R2+résistance entre les sondes)*C1. Avec les valeurs des composants choisis on on obtient une fréquence d'environ 990 Hertz lorsqu'on met les 2 fils de sonde en court-circuit. Cependant dans l'eau la conduction entre les 2 fils est moins bonne donc la fréquence diminue.
Dans cette capture de l'image à l'oscilloscope la courbe en jaune est le signal sur la base de Q1 et celle en bleu est le signal aux bornes du haut-parleur. Cette capture a étée réalisé avec C1 de 4,7nF et les sondes en court-circuit. L'oscilloscope indique une fréquence 990 Hertz et un rapport cyclique près de 50%. Lorsque les sondes sont dans l'eau la résistance de décharge de C1 augmente donc la phase 2 rallonge, ce qui diminue la fréquence ainsi que le rapport cyclique.
La phase 1 est lorsque les transistors sont en saturation et que C1 se charge et la phase 2 celle ou ils sont bloqués et C1 se décharge.Dans ces conditions l'alimentation draine 100ma à 3 volts.
Dans ce démo on voit que la fréquence lorsque les 2 fils sont en court-circuit est plus élevée que lorsque les fils sont dans l'eau. Ceci est du au fait que la résistance de l'eau s'ajoute à celles de R1 et R2.