tag:blogger.com,1999:blog-65134875090106848362024-03-14T14:00:03.489-04:00PICatoutMes projets et explorations avec micro-contolleurs PIC et autres MCUUnknownnoreply@blogger.comBlogger260125tag:blogger.com,1999:blog-6513487509010684836.post-68582596858393215552024-02-25T21:44:00.001-05:002024-02-25T21:44:31.020-05:00POMME-I, le désassembleur<p>
Le moniteur possède maintenant un désassembleur accessible avec la commande <b>@</b>. 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 <b>STM8S207K8</b> possède un <b>boot loader</b> en ROM à l'adresse <b>0x6000</b>. Voici les premières lignes de code tel que désasssemblées par <b>stm8_dasm</b>.
<code><pre>
#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
</pre></code>
</p>
<p>
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 <b>S</b>,<b>]</b> et <b>@</b> seront accessible par une interface de commande dérivée accessibles par la lettre <b>X</b>. <b>X</b> pour <b>extension</b> puisque que ces fonctionnalités ne faisait pas partie du <b>p1Monitor</b> à lorigine.
</p>
<p>
Cette version <a href="https://github.com/Picatout/pomme-I">V1.3R0</a> 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.
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-29295984925679945152024-02-25T11:59:00.001-05:002024-02-25T12:48:40.608-05:00POMME-I, V1.2R4 , améliorations du moniteur<p>
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 <b>S</b>. De plus j'ai ajouté la commande <b>]</b> pour assembler l'instruction machine <b>RET</b> qui indique la fin du programme en langage machine et le retour vers le moniteur.
</p>
<p>
En <B>MS-DOS</B> il y avait un programme appellé <a href="https://en.wikipedia.org/wiki/Debug_%28command%29">debug.exe</a> 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 <B>MS-DOS</B>, les fichiers <a href="https://fr.wikipedia.org/wiki/.com_%28MS-DOS%29">*.COM</a> et les fichiers <a href="https://fr.wikipedia.org/wiki/.exe">*.EXE</a>. L'application <a href="https://en.wikipedia.org/wiki/Debug_%28command%29">debug.exe</a> permettait de créer des fichiers <a href="https://fr.wikipedia.org/wiki/.com_%28MS-DOS%29">*.COM</a>. Avec le p1Monitor mon objectif est de m'approcher des fonctionnalités de <a href="https://en.wikipedia.org/wiki/Debug_%28command%29">debug.exe</a> 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.
</p>
<h2>Démonstration de la commande <b>S</b> de p1Monitor</h2>
<p>
<iframe width="640" height="360" src="https://www.youtube.com/embed/537yjOE5MXg?si=rg37Z6YsuQVVhoBp" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-32734986708643113702024-02-18T15:10:00.005-05:002024-02-18T15:10:56.333-05:00POMME-I V1.2R2 sauvegarde d'un programme en langage machine.<p>
Dans le vidéo suivant je montre comment:
<ul>
<li>créer un programme en langage machine dans le moniteur en se servant des appels aux services noyau.</li>
<li>Comment créer un autre petit programme pour sauvegarder le premier comme fichier binaire.</li>
<li>Comment recharger dans le moniteur le fichier binaire pour l'exécuter.
</ul>
</p>
<p>
<iframe width="700" height="393" src="https://www.youtube.com/embed/E2a2wvIT0Ek?si=poQHV7U07Qjryj1I" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-75062538962828527022024-02-17T11:51:00.003-05:002024-02-17T11:51:56.112-05:00POMME-I version 1.2r0 <p>
Ces derniers jours j'ai apporté plusieurs améliorations au projet.
<ul>
<li>Dans le moniteur on peut maintenant entrer une chaîne de caractères directement dans la mémoire RAM sans avoir en convertir en codes ASCII.</li>
<li>Dans le moniteur on peut afficher une aide rapide sur les codes de service du noyau avec la commande <b>?</b>.</li>
<li>Le BASIC a maintenant accès à la mémoire RAM SPI par le tableau <b>XRAM()</b>.</li>
</ul>
</p>
<h2>Démonstration de la version 1.2</h2>
<p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/N5BVtVKXyFE?si=fwOD78Etubmp6446" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-52590022113801106672024-02-11T22:32:00.003-05:002024-02-11T22:53:16.955-05:00POMME-I: comment je programmais en 1978<p>
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 <a href="https://fr.wikipedia.org/wiki/RCA_1802">RCA CDP1802</a>. 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.
</p>
<h2>Écrire un programme en utilisant le moniteur.</h2>
<p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/wVPwDsu7_Dc?si=ieWD3ezPaqdbKJwA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
<p>
À 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.
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-36798663715398866572024-02-11T21:29:00.003-05:002024-02-12T11:37:58.557-05:00POMME-I version de base<p>
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.
</p>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL9V3BZua-cC6ah5tfFFo4PMqaEm6zGnRsOc_r6wT9dlzZD3FRyjy6wlU8Q3eTmPaRmiEozXX3L6hV8tx3Ke23DG5VBRk3BMcQHF0rEYuvZ-AqIbHhP1tkbP4LzWV4HHNX_Z4hxiF3awVEz_Tj21rajnDHbB0ChuCNjBjgdrzEccO427dx28ndnVd6LLo/s1718/pomme-IS-schematic.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="846" data-original-width="1718" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgL9V3BZua-cC6ah5tfFFo4PMqaEm6zGnRsOc_r6wT9dlzZD3FRyjy6wlU8Q3eTmPaRmiEozXX3L6hV8tx3Ke23DG5VBRk3BMcQHF0rEYuvZ-AqIbHhP1tkbP4LzWV4HHNX_Z4hxiF3awVEz_Tj21rajnDHbB0ChuCNjBjgdrzEccO427dx28ndnVd6LLo/s400/pomme-IS-schematic.png"/></a></div>
</p>
<h2>liste du matériel requis</h2>
<p>
<ul>
<li> 1 Carte <b>NUCLEO-8S207K8</b></li>
<li> 1 EEPROM SPI <b>23LC1024</b> de 128KO pour sauvegarder des fichiers programmes BASIC et Forth.</li>
<li> 1 RAM SPI <b>25LC1024</b> de 128KO pour augmenter la mémoire RAM.</li>
<li> 2 résistances de <b>10Ko 1/4 watt</b>. </li>
<li> 2 Condenstateur céramique de <b>100nF</b> </li>
<li> 1 Petit haut-parleur piézo ou électromagnétique de 130 ohm.</li>
<li> 1 condensateur électrochimique de <b>10µF/16Volt</b>.</li>
<li> 1 Cable USB avec connecteur A et micro C pour connecter la carte à l'ordinateur .</li>
</ul>
</p>
<p>
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.
</p>
<h2>Montage sur carte sans soudure</h2>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBGgaZkBN8ZPaurl-Tlg5hPvukm2BfmC3suA5Y_Zw_TEf-7cFNbRKilc1J8C9gEUzzucigEfSma9nsFBVwUzXcq_pvGUUnwtFpQUQN_cMgdMPg6eq3MEEKSLCqf4GXkVXXUQscNABX1KxD7BTH700LdTXk5AcJ_9xOoDspPlR6rjd3DSBnifOPWnRoNQ0/s1920/montage_sur_plaque_sans_soudure.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1080" data-original-width="1920" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBGgaZkBN8ZPaurl-Tlg5hPvukm2BfmC3suA5Y_Zw_TEf-7cFNbRKilc1J8C9gEUzzucigEfSma9nsFBVwUzXcq_pvGUUnwtFpQUQN_cMgdMPg6eq3MEEKSLCqf4GXkVXXUQscNABX1KxD7BTH700LdTXk5AcJ_9xOoDspPlR6rjd3DSBnifOPWnRoNQ0/s400/montage_sur_plaque_sans_soudure.png"/></a></div>
</p>
<p>
Pour un montage permanent le circuit peut-être transféré sur une carte comme cell-ci
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrSmHgV7hh-uhVJGZKMFRpEQNKTPHj1bWO1s62a9XVUhcRbKUE5DcSLXsP3fzltQpi3BWYWiFk7QYlKhr9ycNhs1VpJFIvhftuDL3axT-5m8s_QceMWzDcl-H4uE7_ZfHfi_1Kqc7tWX2Mu9zZk_eR3he-TVyANUWaJ4VCstXp9SnwrGlHv8D0q0Ku9qc/s3512/carte-pour-montage-permanent.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1176" data-original-width="3512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrSmHgV7hh-uhVJGZKMFRpEQNKTPHj1bWO1s62a9XVUhcRbKUE5DcSLXsP3fzltQpi3BWYWiFk7QYlKhr9ycNhs1VpJFIvhftuDL3axT-5m8s_QceMWzDcl-H4uE7_ZfHfi_1Kqc7tWX2Mu9zZk_eR3he-TVyANUWaJ4VCstXp9SnwrGlHv8D0q0Ku9qc/s400/carte-pour-montage-permanent.png"/></a></div>
</p>
<h2>Programmation de la carte NUCLEO-8S207K8</h2>
<p>
Dans le dossier <a href="https://github.com/Picatout/pomme-I/tree/master/dist">dist</a> il y a 2 fichiers binaires
<ol>
<li><b>pomme_1_hsi16m.bin</b>, c'est le fichier à utiliser si l'option cristal 24Mhz n'est pas utilisée. Le pomme-I fonctionne alors avec l'oscillateur interne de 16Mhz <b>HSI</b>.</li>
<li><b>pomme_1_hse24m.bin</b>, c'est le fichier à utiliser pour faire fonctionner l'ordinateur avec un cristal externe de 24Mhz.</li>
</ol>
La procédure d'installation est simple il suffit de copier ce fichier sur le lecteur représentant la carte NUCLEO-8S207K8 sur le PC.
</p>
<p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/yFxEXMiKbb8?si=E58ap0STCMf9zV43" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
<h2>Communication avec le pomme-I</h2>
<p>
Sur Linux Ubuntu j'utilise <a href="https://github.com/Jeija/gtkterm">GTKTerm</a> alors que sur Windows j'utilise <a href="https://tera-term.fr.softonic.com/">Teraterm</a>.<br/>
Il faut configurer la communication à 115200 BAUDS 8N1.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQYVNInRAUjJbsaMZDXGkm9MJZjM_uFb4wWKnOKMJNM9W5VX4ESoUyxuoGmijoibVfgcVAli3W-8RJgSwfBYwpBIGCsROKqYSDC_06n05Pl5FHpPNYMyCH8e7b6B77e_xY6jUM5gda5gaRMOsuUwHjTxQ5l2S5SZvTpO4hlwGQAtwj8KcqlYjMYsWOXYE/s651/GTKterm_port_config.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="270" data-original-width="651" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQYVNInRAUjJbsaMZDXGkm9MJZjM_uFb4wWKnOKMJNM9W5VX4ESoUyxuoGmijoibVfgcVAli3W-8RJgSwfBYwpBIGCsROKqYSDC_06n05Pl5FHpPNYMyCH8e7b6B77e_xY6jUM5gda5gaRMOsuUwHjTxQ5l2S5SZvTpO4hlwGQAtwj8KcqlYjMYsWOXYE/s400/GTKterm_port_config.png"/></a></div>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-28449265152575584442024-02-03T22:32:00.003-05:002024-02-03T22:34:30.451-05:00p1Forth sur ordinateur pomme-I<p>
J'ai ajouté le langage Forth à l'ordinateur <a href="https://github.com/Picatout/pomme-I">pomme-I.</a>
</p>
<h2>démo</h2>
<p>
Dans ce démo je fait une comparaison entre la vitesse d'éxécution du p1BASIC versus p1Forth.
<iframe width="560" height="315" src="https://www.youtube.com/embed/6s-qFrscuqU?si=2MGTA5VW93CD1qy4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-71603541246264446432024-01-24T14:53:00.004-05:002024-01-24T14:53:26.003-05:00jeu FALL sur stm8 gamepad<p>
J'ai ajouté le jeu **FALL** sur la console <a href="https://github.com/Picatout/stm8-gamepad">stm8 gamepad</a>. Comme le jeu TETRIS est bien connu ça se passe d'explication.
</p>
<h2>vidéo démonstration</h2>
<p>
Oui je sais, je joue très mal.
</p>
<p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/YbVaTBiFwqQ?si=0PKoyIsHN1PLeLEU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-70481982549323329322024-01-18T10:30:00.003-05:002024-01-18T10:30:54.805-05:00jeu CADENA sur stm8 gamepad<p>
J'ai ajouté un nouveau jeu sur la console <a href="https://github.com/picatout/stm8-gamepad">stm8-gamepad</a>. Il s'agit d'une variante du jeu Mastermind qui consiste à deviner la combinaison d'un cadena à 4 chiffres. Le joueur dispose de 12 essais et une parti dure 3 manches.
</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/ZDjsDqterX0?si=HCSDR16hRV52BGGl" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-38612929334361147292024-01-10T15:20:00.003-05:002024-01-11T11:25:03.957-05:00stm8 gamepad v1.1R0<p>
J'ai continué à travaillé sur la console <a href="https://github.com/Picatout/stm8-gamepad">stm8-gamepad</a>
<ul>
<li>Ajout d'un splash screen au démarrage.</li>
<li>Ajout du simulateur du <a href="https://fr.wikipedia.org/wiki/Jeu_de_la_vie">jeu de la vie</a> de John H. Conway.</li>
</ul>
</p>
<h2>Vidéo de démonstration</h2>
<p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/nECGD84M8bM?si=JI2x-QVEMxnn2OVJ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
<h2>Turing complete</h2>
<p>
Game of life est <b>Turing complete</b> c'est à dire qu'un ordinateur peut-être réalisé dans un univers <b>game of life</b> et ça a été fait. Dans le <a href="https://www.youtube.com/watch?v=WfuhbI8HE7s">vidéo suivant</a> réalisé par Nicolas Loizeau on voit un tel ordinateur ordinateur dessiner un carré à l'intérieur d'un cercle. L'auteur ne nous donne pas la dimension de la grille mais elle est énorme. Ce n'est pas le grenre de truc qui peut-être réalisé dans une grille de 32x22 cellules.
<iframe width="560" height="315" src="https://www.youtube.com/embed/WfuhbI8HE7s?si=QNDvNU7ns4TGNa2O" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
<h3>Game of life in Game of life</h3>
<p>
Et puisque <b>game of life</b> est <b>Turing complete</b> ça veut aussi dire qu'on peut créer un univers <b>game of life</b> à l'intérieur d'un autre. <a href="https://www.youtube.com/watch?v=xP5-iIeKXE8">Ça aussi a été fait</a>.
<iframe width="560" height="315" src="https://www.youtube.com/embed/xP5-iIeKXE8?si=ezYW5jorCruAdAlF" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>.<br/>
Imaginez on peut répéter ça à n'importe quel niveau de récursion la seule limitation étant le matériel requis. Jusqu'à quel niveau de récursion pourrait-on aller sur un super ordinateur?
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-48547207055807104802024-01-04T13:57:00.000-05:002024-01-04T13:57:35.197-05:00stm8 gamepad<p>
<p>
Il s'agit d'une petite console de jeux rétro fabriquée à partir d'un microcontrôleur STM8S207K8 ou d'une carte NUCLEO-8S207K8 qui utilise le même µC mais inclu un programmeur ST-LINK. J'ai fabriqué 2 prototypes un de chaque modèle.
</p>
<h2>Prototype 1</h2>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI5DcTMHQ9rR9U-8xUkWk5b9nuKXeG8kULgobznUar0TeVs_ZBon1_xdSNmx3qjrKs-_WNX2UyO5ESVRJZnKQruak9rc3oEtMOq-iU4cR7oaDSwL5IhfxW9lwYUCEo0wFcracRlOtr_5_kMmad4sZb0qMHC6fes-boXgo5opooxNgNI1RAR-o68aC81DQ/s3648/prototype-1.JPG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="2736" data-original-width="3648" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhI5DcTMHQ9rR9U-8xUkWk5b9nuKXeG8kULgobznUar0TeVs_ZBon1_xdSNmx3qjrKs-_WNX2UyO5ESVRJZnKQruak9rc3oEtMOq-iU4cR7oaDSwL5IhfxW9lwYUCEo0wFcracRlOtr_5_kMmad4sZb0qMHC6fes-boXgo5opooxNgNI1RAR-o68aC81DQ/s400/prototype-1.JPG"/></a></div>
</p>
<h2>Prototype 2</h2>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK3OsJZbcyzoHpG7aqXRT0l_PBBGnjxOeYWKFjscYVvBXTAjxJwDsseceVY8CaFVNXYS7nkwRLQlDVXU2z-hCOyBfofpawF-O11ILIPn5sgMcz4ye7DhleL19ntl9d4r6iiSnhzqTROB3rbn6tqIIJC0W13PChcUeT_r5EWWA7a_2HDBFf9qD5yDPSyYE/s3648/prototype-2-assembl%C3%A9.JPG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="2736" data-original-width="3648" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK3OsJZbcyzoHpG7aqXRT0l_PBBGnjxOeYWKFjscYVvBXTAjxJwDsseceVY8CaFVNXYS7nkwRLQlDVXU2z-hCOyBfofpawF-O11ILIPn5sgMcz4ye7DhleL19ntl9d4r6iiSnhzqTROB3rbn6tqIIJC0W13PChcUeT_r5EWWA7a_2HDBFf9qD5yDPSyYE/s400/prototype-2-assembl%C3%A9.JPG"/></a></div>
</p>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrl7sbaQ90H1YH4rbONL2hbaVuXcG9B9o9P5ysHJfKmeJzRu9gsP3Bj_Euw9AGpzhUQ-m4VkKub2Z7NqM-t7mY_KOSJeRqYUqjdErxyqb7A_Xpx9ZoZHBWPeFGkT6Zyqv9UnnahWQZubMemkqPmpLQUYsAYQPPvwUUruX48lbZRasYMYftNEmd8n2xJ0g/s3648/prototype-2-sans-les-boutons.JPG" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="2736" data-original-width="3648" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrl7sbaQ90H1YH4rbONL2hbaVuXcG9B9o9P5ysHJfKmeJzRu9gsP3Bj_Euw9AGpzhUQ-m4VkKub2Z7NqM-t7mY_KOSJeRqYUqjdErxyqb7A_Xpx9ZoZHBWPeFGkT6Zyqv9UnnahWQZubMemkqPmpLQUYsAYQPPvwUUruX48lbZRasYMYftNEmd8n2xJ0g/s400/prototype-2-sans-les-boutons.JPG"/></a></div>
</p>
<h2>Spécifications</h2>
<p>
<ul>
<li>Sortie vidéo composite NTSC monochrome</li>
<li>Résolution graphique de 200x192 pixels</li>
<li>Sortie son générant des tonalités ou du bruit blanc</i>
<li>Pad de 6 boutons, croix et boutons A,B.</li>
<li>Les programmes de jeux doivent-être compilés avec le projet et réside dans la mémoire flash du µC.</li>
</ul>
</p>
<h2>Source du projet</h2>
<p>
Comme tous mes projets celui-ci est sous licence GPLv3 et le dépôt est sur <a href="https://github.com/Picatout/stm8-gamepad">github</a>.
</p>
<h2>démo</h2>
<p>
Pour le moment je n'ai écris qu'un seul jeu appellé <b>SNAKE</b>. Dans la vidéo il manque un élément à droite qui a été coupé par Youtube lors de la conversion du format. Il s'agit d'une barre de chronomètre qui décroit. Lorsque cette barre arrive à zéro il y a un TIME OUT et la parti est terminé. Ce chronomètre est réinitialisé chaque fois que le serpent mange la souris.
</p>
<h2>SNAKE</h2>
<h3>règles</h3>
<p>
<ol>
<li>Si le serpent entre en collision avec un des murs la parti se termine.</li>
<li>Si le serpent se mort lui-même la parti se termine.</li>
<li>Si le serpent entre en collision avec avec une crotte la parti se termine.</li>
<li>Le serpent doit manger la souris avant que le chronomètre expire.</li>
</ol>
<h3>Contrôle</h3>
<p>
<ul>
<li><b>FLÈCHE HAUT</B> Augmente la vitesse du serpent.</li>
<li><b>FLÈCHE BAS</B> Diminue la vitesse du serpent.</li>
<li><b>FLÈCHE GAUCHE</b> Le serpent vire à gauche.</li>
<li><b>FLÈCHE DROITE</b> Le serpent vire à droite.</li>
</ul>
</p>
<h3>Pointage</h3>
<p>
Le nombre de points gagné dépend de la vitesse du serpent. Celle-ci peut-être ajustée entre <b>1</b> et <b>9</b>.<br/>
Si la souris est le long d'une barrière le nombre de points est doublé.<br/>
Si la souris est dans un coin le nombre de points est triplé.<br/>
Pour les vitesses supérieures à <b>5</b>, le serpent laisse une crotte chaque fois qu'il mange la souris. Ces crottes sont mortelles pour le serpent. La vitesse par défaut est <b>5</b>.
</p>
<h3>Vidéo</h3>
<p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Q37pyD2PJow?si=4lbcOPYaedmUby1Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-73177242890271791562024-01-01T11:52:00.009-05:002024-01-02T12:34:33.830-05:00stm8 terminal<p>
Puisque je viens de mettre à jour le projet <a href="https://github.com/Picatout/stm8_terminal">stm8 terminal</a> vers la version 1.0R14. Je vais parler de la génération d'un signal composite au standard NTSC à partir d'un microcontrolleur 8 bits.
</p>
<p>
<ul>
<li><a href="#standard">Qu'est-ce que le standard NTSC.</a></li>
<li><a href="#why_ntsc">Pourquoi NTSC plutôt que VGA</a></li>
<li><a href="#challenges">Difficultés de la génération d'un signal de qualité.</a></li>
</ul>
</p>
<h2><a id="standard">Qu'est-ce que le standard NTSC</a></h2>
<p>
Ce standard prend son origine aux U.S.A. en 1941 pour la première version noir et blanc et en 1953 pour la version couleurs. <B>NSTC</b> est l'acronyme de <b>N</b>ational <B>T</B>elevision <B>S</B>ystem <B>C</B>ommittee. Il s'agit d'un signal vidéo composite, c'est à dire que toute l'information est contenue dans un seul signal, i.e. synchronisation, luminance et chrominance. Il s'agit d'un signal analogique qui à l'origine était transmit par radiodiffusion.
</p>
<p>
Générer un signal NTSC monochrome comme pour le projet <a href="https://github.com/Picatout/stm8_terminal">stm8 terminal</a> est relativement simple et peut se faire même avec le plus petit des microcontrolleurs 8 bits. Dans le passé j'ai réalisé ce genre de signal sur un PIC12F322 pour le projet <a href="https://picatout-jd.blogspot.com/2013/08/pong-sur-pic10f322.html">pong</a>. Comme le projet <a href="https://github.com/Picatout/stm8_terminal">stm8 terminal</a> ce projet était réalisé entièrement en assembleur.
</p>
<p>
Comme à l'époque où a été créer ce standard, la télévision était entièrement analogique, l'image était recréé grâce à un <a href="https://fr.wikipedia.org/wiki/Tube_cathodique">tube cathodique</a> par balayage d'un faisceau d'électrons sur une surface phosphorencente appliquée sur la face avant du tube cathodique. Chaque image est constituée de 2 trames entrelacées de 262,5 lignes et le taux de répétition est de 30 images par seconde (60 trames).
</p>
<p>
Ce qui complique un peu la génération de ce signal est justement cet entrelacement de trames car les trames paires et impaires sont décalées d'une demi-ligne l'une rapport à l'autre.
</p>
<p>
Le balayage commence en haut à gauche de l'écran en allant vers la droite et se termine en bas à droite.
<p><a href="https://commons.wikimedia.org/wiki/File:Balayage_entrelace_affichage_trames.svg#/media/Fichier:Balayage_entrelace_affichage_trames.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/5/55/Balayage_entrelace_affichage_trames.svg" alt="Balayage entrelace affichage trames.svg" height="325" width="321"></a><br>Par <a href="//commons.wikimedia.org/wiki/User:Cdang" title="User:Cdang">Christophe Dang Ngoc Chan</a> — <span class="int-own-work" lang="fr">Travail personnel</span>, <a href="http://creativecommons.org/licenses/by-sa/3.0/" title="Creative Commons Attribution-Share Alike 3.0">CC BY-SA 3.0</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=1758640">Lien</a></p>
</p>
<p>
Chaque ligne horizontal de balayage débute par une impulsion de synchronisation qui dure 4,7µSec. La partie visible qui affiche l'information vidéo dure 52µSec.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUtyegyWys-2P4LkBjb_LmtY9XfLRtrB2Y76cA_3WASJc25VZ4kDv8MQF60s_H8WQRZWvH73vx_FNbhPRUCVg-Hj9P8AFxo9XXDVbFymmZN7IaTxpEHunmnqI5BAAxKTygmFBhvrVaJriWclahyWmTIfNnojBRXxYTG3DlJ5b3w6N5CIyTcB4pkpcP_A/s527/NTSC_HORZ_SCANLINE.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="352" data-original-width="527" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkUtyegyWys-2P4LkBjb_LmtY9XfLRtrB2Y76cA_3WASJc25VZ4kDv8MQF60s_H8WQRZWvH73vx_FNbhPRUCVg-Hj9P8AFxo9XXDVbFymmZN7IaTxpEHunmnqI5BAAxKTygmFBhvrVaJriWclahyWmTIfNnojBRXxYTG3DlJ5b3w6N5CIyTcB4pkpcP_A/s400/NTSC_HORZ_SCANLINE.gif"/></a></div>
</p>
<P>
Une autre complication est la façon dont la synchronisation verticale qui indique le début de chaque trame est générée. Habituellement j'utilise une minuterie avec sortie PWM pour générer le signal de synchronistation. Hors la synchronisation verticale oblige à reprogrammer la minuterie pour réduire la période de la minuterie de moitier lors de la synchronisation verticale. En plus cette synchronisation se fait en 3 étapes. pré-égalisation, synchronisation, post-égalisation. Et chacune de ces phase oblige une reprogrammation de la minuterie et pour finir il faut revenir à la génération pleine ligne à la fin de la synchronisation. Comme les trames sont décalées d'une demi-ligne l'une par rapport à l'autre, le signal est différent entre trame paire et impaire.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvMtEeFXZRzbiC8GZgnJXCQu4bvW9oCvUporH4UAnVCRzGw0d2EfPd_lOn7zIm9s7ZknfeIJRumUmGE5P0aYh0Pv_Z59L04wYQYx-_8hnssUE56U76eeLYm3Fj1LPtW1xGPJwYnlnpcdwRJPz9XhJjpSYNoLAk5Z0nu6PuK8PT7XBXv67ZsCKo-EaBzZM/s992/NTSC_COMPLETE_SCANNING.gif" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="502" data-original-width="992" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvMtEeFXZRzbiC8GZgnJXCQu4bvW9oCvUporH4UAnVCRzGw0d2EfPd_lOn7zIm9s7ZknfeIJRumUmGE5P0aYh0Pv_Z59L04wYQYx-_8hnssUE56U76eeLYm3Fj1LPtW1xGPJwYnlnpcdwRJPz9XhJjpSYNoLAk5Z0nu6PuK8PT7XBXv67ZsCKo-EaBzZM/s400/NTSC_COMPLETE_SCANNING.gif"/></a></div>
</P>
<h2><a id="why_ntsc">Pourquoi NTSC plutôt que VGA</a></h2>
<p>
Pourquoi ne pas utiliser le standar VGA au lieu du standard NTSC ce serait tellement plus simple à générer comme signal, signal de synchronisation plus simple, pas de trames entrelacées. En effet c'est plus simple sauf que la fréquence du signal vidéo est plus élevée. en VGA pour générer 640 pixels par ligne il faut une fréquence de 25.1Mhz (pixel clock frequency). Pour le signal VGA on ne dispose que de 25,4µSec visible pour afficher tous les pixels d'une ligne de balayage. La moitié de ce qu'on dispose en NTSC.
</p>
<p>
Le mcu du <a href="https://github.com/Picatout/stm8_terminal">stm8 terminal</a> utilise une fréquence système de 20Mhz et le périphérique SPI utilisé pour sérialiser les pixels sur la ligne vidéo fonctionne à 10Mhz ce qui permet d'afficher 496 pixels par ligne de balayage (62 caractères par lignes). En utilisant le standard VGA on ne pourrait qu'afficher 254 pixels soit 31 caractères par ligne.
</p>
<p>
Ce que j'ai dit jusqu'ici ne concerne que le NTSC noir et blanc. S'il faut ajouter la couleur à ça, c'est d'autant plus complexe même si j'ai réussi à le faire sur un microcontrôleur PIC12F1572 pour mon projet <a href="https://github.com/Picatout/breakout_1572">breakout</a>, ce qui sans me vanter m'a demander de faire preuve d'imagination avec l'utilisation des périphériques.
</p>
<p>
Donc avec un microcontrôleur à une fréquence système de 48Mhz ou plus il est plus intéressant d'utiliser le standard VGA cependant. Mais en bas de cette fréquence vaut mieux s'en tenir au NTSC malgré la difficulté de générer un tel signal.
</p>
<h2><a id="challenges">Difficultés de la génération d'un signal de qualité.</a></h2>
<p>
Je m'en tiendrai ici qu'au monochrome. La façon la plus simple que j'ai trouvé de générer un signal NTSC est d'utiliser une minuterie avec périphérique PWM (Output Compare) pour générer le signal de synchronisation et la sortie <b>MOSI</b> d'un périphérique <B>SPI</B> pour sérialiser les pixels vidéo. Évidemment cette méthode utilisant un SPI n'est valide que pour les signaux vidéo monochromes.
</p>
<h3>La gigue</h3>
<p>
La précision de la synchronisation du signal vidéo est fondamentale pour obtenir un signal de qualité. Le problème est d'obtenir un délais constant au niveaux des interruptions vidéos. En effet le temps de réponse aux interruptions, ce qu'on appelle la latence, n'est pas constant. Alors que pour les µC PIC cette latence ne varie que d'un cycle pour les STM8 elle peut variée de plusieurs cycles car l'instruction en cours d'exécution au moment ou le signal d'interruption est généré doit-être complétée avant de répondre à l'interruption. Pour les µC PIC le temps d'exécution des instructions est constant sauf pour les sauts et appels de sous-routine qui prennent un cycle de plus. Pour les µC STM8 le temps d'exécution d'une instruction varie entre 1 et 5 cycles. Il y a donc une plus grande variabilité de la latence. Ce qui génère la gigue (jitter en anglais). Dans le cas d'un signal vidéo cette gigue est très visible et embêtante. Heureusement il y a une méthode pour la contrecarrer.
</p>
<p>
Dans la routine <b>ntsc_video_interrupt</b> qui est une interruption générée par la minuterie TIM1 qui synchronise le signal vidéo. j'utilise le code suivant pour annuler la gigue.
<pre><code>
ld a,TIM1_CNTRL
and a,#7
push a
push #0
ldw x,#jitter_cancel
addw x,(1,sp)
_drop 2
jp (x)
jitter_cancel:
nop
nop
nop
nop
nop
nop
nop
</code></pre>
</p>
Le principe de fonctionnement est le suivant. Le compteur de la minuterie demeure régulié même si le temps de latence varie. Donc si au moment d'entrée dans la routine d'interruption on lit la valeur du compteur (il suffit de lire l'octet faible), le compte va varier en fonction de la latence. Si la latence prend 3 cycles supplémentaire le compte aura augmenter de 3. Comme cette latence ne variera jamais plus que de 5 cycles on ne tiens compte que des 3 derniers bits avec l'opératipon <b>and a,#7</b>. On charge le registre <b>X</b> avec l'adresse cible <b>jitter_cancel</b>. On fait un saut indirect en utilsant la valeur dans <b>X</b> indixé par la valeur des 3 bits les moins significatifs du compteur. Si le compte est nul 6 instructions <b>nop</b> seront exécutées avant de débuter l'envoie des pixels vidéo. Chaque <b>nop</b> s'exéctute en un seul cycle. Si le compte est de 7 le saut se fera après les <b>nop</b>. Il s'agit donc de créer un délais supplémentaire variable inversement proprotionnel à la durée de la latence pour annuller la variabilité de celle-ci. Ainsi l'envoie des pixels vidéo débute toujours au même point par rapport au début de la ligne de balayage.
<h3>Interférence</h3>
<p>
Un problème plus difficile à résoudre est celui des interruptions qui se produisent avant le début d'une ligne vidéo et n'ont pas le temps de se terminer avant le début de la ligne vidéo. La révision V1.0R14 de <a href="https://github.com/Picatout/stm8_terminal">stm8 terminal</a> avait pour but de corriger un tel problème causé par l'interruption de la minuterie TIM4 qui était générée à un intervalle de 1 msec.
Cette interruption se produisait donc plusieurs fois pendant la période visible du signal vidéo ce qui produisait un glissement des pixels vidéos sur les lignes affectées par cette interruption. La seule façon que j'ai trouvé de régler ce problème est de simplement ne plus utiliser la minuterie TIM4. Celle-ci ne servait qu'à synchroniser le clignotement du curseur texte. Hors cette opération pouvait tout aussi bien être réalisée en utilisant l'interruption de la minuterie TIM1 qui sert pour générer la synchronisation vidéo. J'ai donc modifier le code dans ce but.
</p>
<h3>Problèmes non résolus</h3>
<p>Il reste 2 problèmes qui interfèrent encore avec le signal vidéo et pour lesquels je n'ai pas de solution. Le premier est l'interruption de lecture du clavier PS/2 et le second est l'interruption sur réception d'un caractère sur le UART.
<ol><li>
Sur l'ordinateur <a href="https://github.com/Picatout/pomme-I">pomme I</a> qui utilise le <a href="https://github.com/Picatout/stm8_terminal">stm8 terminal</a>, si on écris un programme BASIC qui envoie en boucle des caractères au terminal sans arrêt on voit très nettement que la réception de ces caractères crée de l'interférence dans l'affichage vidéo.
</li>
<li>
Lorsqu'on saisie une ligne au clavier sur le <a href="https://github.com/Picatout/pomme-I">pomme I</a> on voit aussi que le signal vidéo est perturbé mais dans une moindre mesure.</li>
</ol>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-62093351012991324192023-07-10T20:06:00.000-04:002023-07-10T20:06:50.448-04:00STM8 terminal<p>
Dans le cadre du projet <a href="https://github.com/Picatout/pomme-I">pomme-I</a> j'ai créer un <a href="https://github.com/Picatout/stm8_terminal">terminal ASCII </a>avec une carte NUCLEO-8S207K8.
Ce terminal texte peut affiché 64 caractères par ligne et 25 lignes par écran. La sortie est un signal compositive selon le standard Nord-Américain NTSC.
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-89102028221828074492023-06-18T22:29:00.001-04:002023-06-18T22:30:01.255-04:00projet pomme I <p>
Après avoir adapter le moniteur Wozmon du Apple I sur le STM8 j'ai poursuivie sur ma lancée et créer le nouveau projet <a href="https://github.com/Picatout/pomme-I">pomme I</a>. Je veux créer un petit ordinateur 8 bits avec la carte NUCLEO-8S207K8. Cet ordinateur aura en mémoire flash le <a href="https://github.com/Picatout/pomme-I/blob/master/p1Monitor.asm">moniteur du Apple I</a> ainsi que le <a href="https://github.com/Picatout/pomme-I/blob/master/p1Basic.asm">BASIC du Apple I</a>. En plus bien que ce n'était pas nécessaire j'ai ajouter un <a href="https://github.com/Picatout/pomme-I/blob/master/p1Kernel.asm">noyau système</a>. D'ailleurs l'écriture de celui-ci m'a posé un problème auquel j'ai trouvé la solution suivante.
</p>
<h3>Pas d'interruption</h3>
<p>
Le noyau système utilise l'instruction machine <b>TRAP</b> du STM8 pour affectuer les appels <i>syscall</i>, hors cette interruption a la priorité la plus élevée. Donc quand l'ordinateur est en train d'exécuter un <i>syscall</i> les interruptions pour la minuterie des millisecondes et celle sur réception d'un charactère du UART de peuvent pas être déclenchées. Hors ces interruptions sont nécessaires à l'exécution de certaines fonctions du noyau. Comment résoudre ce problème?
</p>
<h3>La solution</h3>
<p>
Voici la solution que j'ai trouvé:
<pre><code>
TrapHandler::
ldw x,(8,sp) ; get trap return address
_strxz trap_ret
ldw x,#syscall_handler
ldw (8,sp),x
iret
.macro _syscode n, t
cp a,#n
jrne t
.endm
;---------------------------------
; must be handled outside
; of TrapHandler to enable
; interrupts
;---------------------------------
syscall_handler:
_syscode SYS_RST, 0$
_swreset
0$:
_syscode SYS_TICKS,1$
_ldxz ticks
jp syscall_exit
1$:
_syscode PUTC, 2$
ld a,xl
call uart_putc
jp syscall_exit
2$:
_syscode GETC,3$
call uart_getc
jp syscall_exit
3$:
_syscode QCHAR,4$
call qgetc
jra syscall_exit
4$:
_syscode CLS,5$
call clr_screen
jra syscall_exit
5$:
_syscode DELBK,6$
call bksp
jra syscall_exit
6$:
_syscode GETLN , 7$
call readln
jra syscall_exit
7$:
_syscode PRT_STR , 8$
call puts
jra syscall_exit
8$:
_syscode PRT_INT , 9$
call print_int
jra syscall_exit
9$:
_syscode SET_TIMER , 10$
bres sys_flags,#FSYS_TIMER
_strxz timer
jra syscall_exit
10$:
_syscode CHK_TIMOUT, 11$
clr a
btjf sys_flags,#FSYS_TIMER,syscall_exit
cpl a
jra syscall_exit
11$:
_syscode START_TONE , 12$
call tone
jra syscall_exit
12$:
_syscode GET_RND , 13$
call prng
jra syscall_exit
13$:
_syscode SEED_PRNG , 14$
call set_seed
jra syscall_exit
14$:
; bad codes ignored
syscall_exit:
jp [trap_ret]
</code></pre>
Normalement à l'exécution de l'instruction <B>IRET</B> le programme devrait continuer à l'adresse qui suis l'instruction <b>TRAP</b>. Lorsqu'une interruption est déclenchée tous les registres du STM8 sont sauvegardés sur la pile, incluant l'adresse de retour qui est située à la position <b>(8,sp)</b> sur la pile. Donc le gestionnaire d'interruption logicielle va chercher cette addresse et la sauvegarde dans la variable système <b>trap_ret</b>. Ensuite il remplace sur la pile l'adresse original par l'adresse de la sous-routine qui gère les appels <i>syscall</i> et puis il quitte avec l'instruction <b>IRET</b>. Puisque l'adresse de retour a étée modifiée le programme continue non pas à l'endroit où il aurait du mais au début de la routine <b>syscall_handler</b>.
</p>
<p>
Notez que la sous-routine <b>syscall_handler</b> se termine par un <b>jp [trap_ret]</b>. <b>trap_ret</b> est une variable pointeur et cette instruction fait un saut à l'adresse contenue dans la variable pointeur qui se trouve être l'adresse où normalement le programme aurait du continuer à la sortie de <b>TrapHandler</b>. Et voilà le problème est résolu.
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-70892466520547239742023-06-08T22:17:00.002-04:002023-06-10T22:20:33.651-04:00Wozmon sur STM8<p>
Après avoir regardé la vidéo de Ben Eater <a href="https://youtu.be/HlLCtjJzHVI">Running Apple 1 software on a breadboard computer (Wozmon)</a> je me suis intéressé à l'histoire du Apple I et j'ai fait des recherches à ce sujet. J'ai trouvé le manuel d'opération du Apple I en format<a href="http://s3data.computerhistory.org/brochures/apple.applei.1976.102646518.pdf"> pdf.</a> Dans ce manuel on retrouve le code du moniteur du Apple I
</p>
<h3>Un peu d'histoire</h3>
<p>
En 1975 Steve Jobs invite l'ingénieur Steve Wozniak à fonder une compagnie pour vendre l'ordinateur conçu par ce dernier. C'est Steve Jobs qui a eu l'idée d'appeller cette compagnie <b>Apple</b>
. Ce nom réfère à la légendre (vrai ou fausse?) selon laquelle Isaac Newton aurait eu l'inspiration de la théorie de la gravitation lorsqu'assie au pied d'un pommier il aurait reçu une pomme sur la tête. C'est pour ça qu'on retrouve cette image sur la page couverture du manuel d'opération du Apple I.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Q4cyRKaEiLwXa5WGSFwH1_Ro5gVA_8B5CXiv3YNuFI43kuBaQw5KsgV4N1pdvCLUSbN7bYMRJIs8j5AyEXMMCxrY_bdQiSyLULbcLeSD1ZpfrocBVfQwMeY09KnahbLY-wPCuMSu67Tz31OGQ-pNAAd3mRa2zugmeId2HNxzhNwMaoksDqbvxnLy/s916/a1-manual-cover.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="916" data-original-width="713" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3Q4cyRKaEiLwXa5WGSFwH1_Ro5gVA_8B5CXiv3YNuFI43kuBaQw5KsgV4N1pdvCLUSbN7bYMRJIs8j5AyEXMMCxrY_bdQiSyLULbcLeSD1ZpfrocBVfQwMeY09KnahbLY-wPCuMSu67Tz31OGQ-pNAAd3mRa2zugmeId2HNxzhNwMaoksDqbvxnLy/s400/a1-manual-cover.png"/></a></div>
Si le Apple II est célèbre il n'en va pas de même pour le Apple I. Il ne s'en est vendu qu'environ 200. Mais cette rareté même fait que les collectionneurs se les arrachent à prix d'or. Selon mes recherches en 2018 quelqu'un offrait un Apple I aux enchères pour un prix de départ de 1.5 millions US$.
</p>
<p>
Les raisons pour lesquelles le Apple I ne s'est pas très bien vendu sont d'abord qu'il ne s'agissait pas d'un produit grand public. Seul la carte mère était vendue.
</p>
<p align="center"><a href="https://commons.wikimedia.org/wiki/File:CopsonApple1_2k_cropped.jpg#/media/File:CopsonApple1_2k_cropped.jpg"><img border="0" width="400"src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/CopsonApple1_2k_cropped.jpg/1200px-CopsonApple1_2k_cropped.jpg" alt="CopsonApple1 2k cropped.jpg"></a><br>By Achim Baqué - <a rel="nofollow" class="external free" href="https://www.apple1registry.com/en/press.html">https://www.apple1registry.com/en/press.html</a>, <a href="https://creativecommons.org/licenses/by-sa/4.0" title="Creative Commons Attribution-Share Alike 4.0">CC BY-SA 4.0</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=109364693">Link</a></p>
<p>
L'acheteur devait fabriquer le bloc d'alimentation lui-même ou bien trouver quelqu'un pour le faire. De même pour le boitier. Il devait aussi trouver un clavier, et un moniteur. À ses début Apple Computer n'avait pas de réseau de distribution. C'est Steve Jobs qui faisait le démarchage pour convraincre les boutiquiers d'informatique (secteur naissant) de vendre le Apple I. Certains de ces détaillants complétaient l'offre d'Apple en vendant le Apple I dans un boitier en bois avec l'alimentation et le clavier inclus. Il y avait donc de la variété dans l'apparence.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1qjN8AjHYM4LeFlEpFNcl3d6O5tfZpxHelUHUOVhBuhn2TodvdvCWy2v2hCBv-VoRD2dtqOezfvbi1aXMz0V6losco4HX-1rR6sQsKlwLNW9smxwsz3GvLrE78-LpN4qPOzv4-vApxnZN-3O5-ME1abPICXaZ0ys2j3bbAHacZdtKv-HsuRqDjrCC/s524/apple1_1.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="365" data-original-width="524" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1qjN8AjHYM4LeFlEpFNcl3d6O5tfZpxHelUHUOVhBuhn2TodvdvCWy2v2hCBv-VoRD2dtqOezfvbi1aXMz0V6losco4HX-1rR6sQsKlwLNW9smxwsz3GvLrE78-LpN4qPOzv4-vApxnZN-3O5-ME1abPICXaZ0ys2j3bbAHacZdtKv-HsuRqDjrCC/s400/apple1_1.jpg"/></a></div>
</p>
<p>
L'autre raison est qu'Apple a mis en marché le Apple II très tôt après le Apple I et s'est désintéressé du premier laissant les acheteurs se débrouiller avec le Apple I.
</p>
<h3>Qu'est-ce que Wozmon</h3>
<p>
L'ingénieur qui a conçu les Apple I et Apple II c'est Steve Wozniak. Steve Jobs s'était un homme d'affaires pas un ingénieur. Pour en revenir au Apple I, la mémoire était coûteuse à cette époque donc pour couper dans les coûts Wozniak a fait 2 choses Il a utilisé dans le Apple I de la RAM dynamique plutôt que statique comme on retrouvait à l'époque dans la plupart des petits ordinateurs 8 bits. Ce qui lui a permit de fournir la carte mère avec 4K octets de RAM et il y avait de la place sur la carte pour en ajouter 4K de plus. Pour la mémoire ROM le Apple I ne disposait que de 256 Octets. Quoi installer comme programme dans un espace aussi réduit? À cette époque on installait un petit programme appellé un <b>moniteur</b>. Ce programme faisait peu de choses.
<ul>
<li>Examiner le contenu de la mémoire</li>
<li>Modifier le contenu de la mémoire</li>
<li>Lancer un programme écris en langage machine</li>
</ul>
Le moniteur du Apple I, qui a finit par être affublé du nom de <b>Wozmon</b> contraction de <b>Woz</b>niak et <b>mon</b>itor. ne faisait rien de plus que ça. Mais faire entrer ce programme dans moins de 256 octets est déjà difficile. D'abord le cpu 6502 du Apple I utililse 6 octets pour les vecteurs
<ul>
<li><b>NMI</b>, adresse 0xFFFA..0xFFFB, c'est l'adresse de la routine d'interruption non masquable.</li>
<li><b>RESET</b>, adresse 0xFFFC..0xFFFD, est chargée dans le compteur ordinal au démarrage.</li>
<li><b>IRQ</b>, adresse 0xFFFE..0xFFFF, c'est l'adresse de la routine d'interruption.</li>
</ul>
Donc Wozniak ne disposait que de 250 octets pour installer le moniteur il a réssie à le faire entrer dans 248 octets. Ce n'était pas une mince affaire d'autant plus qu'il ne disposait d'aucun outil de programmation dont nous disposons aujourd'hui. Il a écris le code assembleur sur des feuilles de papiers et générer lui-même le code binaire à partir de ce listing. J'ai connu cette époque sauf que moi je travaillait avec un mcu RCA CDP1802. Il faillait être vraiment passionné pour travailler de cette façon.
</p>
<h3>STM8 Wozmon</h3>
<p>
Après avoir trouver le manuel d'opération du Apple I je me suis mis à étudier le code du Wozmon qui s'y trouve et me suis demandé combien d'octets ce programme occuperait sur STM8. La question est pertinante puisque l'architecture du STM8 est une extension de celle du cpu 6502, mais le jeu d'instructions est complètement différent. J'ai d'abord écris une première version en travaillant dans mon style de programmation habituel pour voir qu'elle taille ça aurait. J'ai bâptisé ce programme <b>stm8_picmon.asm</b> et le binaire a une taille de 357 octets.
</p>
<p>
Dans un deuxième essaie j'ai collé au modèle du moniteur de Wozniak autant que possible, compte de tenu des différences entre les architectures matérielle et du jeu d'instructions plus étendu qu'offre le STM8. J'ai bâptisé ce programme <b>stm8_wozmon.asm</b>. Le binaire de ce programme a une taille de 260 octets soit 12 octets de plus que celui de Wozniak. Il serait probablement possible de supprimer quelques octets supplémentaire en faisant quelques compromis mais je n'ai pas cherché à le faire.
</p>
<p>
Le code source du programme est sur <a href="https://github.com/Picatout/stm8_wozmon">https://github.com/Picatout/stm8_wozmon</a>
</p>
<h3>Vidéo de démonstration</h3>
<p align="center">
<iframe width="560" height="315" src="https://www.youtube.com/embed/jJeNQWX2brc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-60442250583671435352023-05-13T22:13:00.003-04:002023-05-22T22:22:13.288-04:00détecteur de métal le plus simple<p>
Hier j'ai regardé sur Youtube un vidéo présentant le <a href="https://www.youtube.com/watch?v=nSpNAVKUXmM">détecteur de métal</a> le plus simple que j'ai vue. Il n'utilise qu'un seul transistor. J'ai reconstitué la schématique du circuit à partir de l'image du circuit et des sous-titres.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEExT52d2bo0lrAogPiAl1hxPtlTG6qTI2VxEBtC-PzUo-UHk_34L-kjTTdin8-ba-uf1bDwGdtjqx2834YhxUU1Be6H7ncCrauR1x5PsMW2dhY_YbJ-UyoadpMhe7lj2uAraLh4ODME7zGYxEBbWlTW-5EUh_qlkzBkLbyjpetu4K6TJaFvUTn1wC/s873/dm-creative.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="706" data-original-width="873" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEExT52d2bo0lrAogPiAl1hxPtlTG6qTI2VxEBtC-PzUo-UHk_34L-kjTTdin8-ba-uf1bDwGdtjqx2834YhxUU1Be6H7ncCrauR1x5PsMW2dhY_YbJ-UyoadpMhe7lj2uAraLh4ODME7zGYxEBbWlTW-5EUh_qlkzBkLbyjpetu4K6TJaFvUTn1wC/s400/dm-creative.png"/></a></div>
</p>
<h3>Principe de fonctionnement</h3>
<p>
Il s'agit d'un oscillateur Hartley, la rétro action se fait de l'émetteur vers la base. RV1 doit-être ajusté de sorte que le gain soit insuffisant pour déclencher l'oscillation. Cependant lorsqu'un objet métallique est approché des bobines le couplage entre celles-ci augmente ce qui permet à l'oscillation de démarrer. À ce moment le buzzer entre en action car il y a suffisamment de courant qui passe dans le collecteur pour l'activer. Même si ce courant est hachuré à la fréquence de l'oscillateur ce n'est pas perceptible au niveau auditif.
</p>
<h3>Notes personnelles</h3>
<p>
<ol>
<li>Le choix du transistor est inutilement puissant pour ce circuit. Un transistor 2N2222 ferait tout aussi bien l'affaire mais il faudrait augmenter la valeur de R1 car le gain d'un 2N2222 est plus élevé. Pour que ce circuit fonctionne correctement le courant injecté dans la base à travers RV1 et R1 doit-être juste à la limite inférieur pour permettre l'oscillation du circuit.</li>
<li>Avec les changements de température il est à prévoir que le gain du transistor change donc RV1 doit-être ajustable de l'extérieur du boitier. À ce sujet il serait préférable d'utiliser un potientiomètre plutôt qu'un trimmer.</li>
<li>Étant donné que l'ajustement du gain est critique il est préférable que le potentiomètre soit multi-tours plutôt que simple tour. Une autre solution est d'utiliser 2 potientiomètres en série. Le premier de 100K et l'autre de 1K pour l'ajustement fin.</li>
<li>Dans le vidéo l'auteur utilise une pile de 9 volts. Je l'ai remplacé par 4 piles AA. Donc une alimentation de 6 volts au lieu de 9 volts. Je n'ai pas fait le montage mais je suis confiant que ça fonctionnerait quand même en ajustant RV1 à une valeur de plus basse résistance. L'avantage est la durée de vie des piles.</li>
<li>Pour la résistance <b>R2</b> j'ai mis une résistance de 1K au lieu de 470 ohm comme dans le vidéo, question d'économiser les piles, sans diminution d'intensité lumineuse notable.</li>
</ol>
</p>
<h3>détecteur à 3 transistors</h3>
<p>
Voici un autre détecteur de métal fonctionnant sur le même principe. Celui-ci est de <a href="https://www.youtube.com/watch?v=GgLQ50Rynxw">Fabricio Henrique</a>. J'ai fait quelques changements.
<ul>
<li>J'ai remplacé les transistors BC547 par des 2N3904</li>
<li>Il place la commutateur d'alimentation sur le fil négatif de la batterie, alors que je le place sur le fil positif.</li>
</ul>
Pour qu'il est y oscillation il faut que la bobine L2 produise un champ magnétique de même polarité que la bobine L1. Si ça n'oscille pas il suffit de retourner une des 2 bobines.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdV4kWhSozW5qpz1sEJF6KJJic0oup1GnMFxiqDDpyw72EVaQAhjy4dXsWx9q3JHrknQ4KSqMRCDc7kzDF5XXJPbk8-qAPJf6S9nww7gicKTHuGVBYpEZbbKXEu9s2yFlKnu0yXixQvG42PXr09eVwBIYTxmt83emz1hOAZQAeeXNYiZTmn1Z3fcWv/s998/3-transistors-metal-detector.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="691" data-original-width="998" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdV4kWhSozW5qpz1sEJF6KJJic0oup1GnMFxiqDDpyw72EVaQAhjy4dXsWx9q3JHrknQ4KSqMRCDc7kzDF5XXJPbk8-qAPJf6S9nww7gicKTHuGVBYpEZbbKXEu9s2yFlKnu0yXixQvG42PXr09eVwBIYTxmt83emz1hOAZQAeeXNYiZTmn1Z3fcWv/s400/3-transistors-metal-detector.png"/></a></div>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-14708084402005797492023-05-13T16:32:00.002-04:002023-06-03T16:01:12.590-04:00SCR et TRIAC<p>
Dans cet article j'explique ce que sont les SCR et les TRIAC ainsi que leur utilisation.
</p>
<h3>SCR</h3>
<p>
<b>SCR</b> est l'acronyme anglphone pour <b>S</b>ilicon <b>C</b>ontrol <b>R</b>ectifier et le symbole électronique est celui-ci:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqH8a4jN6aUOrrcBv77cDii_KmzAqCkRIkCbkTZEl73NQkZT1FnDzOHaR3-gH7ytgdCiCiAnX5yT88I4K-6lJP9wSjCy3UKF-8xDthax6AshW3Zlis-icPAvte_CclO30wg0_CzgyH63I3ROphxS2BKDnVsqu6G9u_oBBbnKEoTJVslF8U1jPBxDrq/s408/SCR.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="291" data-original-width="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqH8a4jN6aUOrrcBv77cDii_KmzAqCkRIkCbkTZEl73NQkZT1FnDzOHaR3-gH7ytgdCiCiAnX5yT88I4K-6lJP9wSjCy3UKF-8xDthax6AshW3Zlis-icPAvte_CclO30wg0_CzgyH63I3ROphxS2BKDnVsqu6G9u_oBBbnKEoTJVslF8U1jPBxDrq/s320/SCR.png"/></a></div>
</p>
<p>
Comme on le voit il s'agit d'une diode dont la conduction est contrôlée par une 3ième électrode <b>Gate(2)</b>. Normalement la diode ne conduit pas du tout et ce dans aucune direction. Cependant si l'anode est positive par rapport à la cathode et qu'on applique une impulsion positive sur la <b>Gate(2)</b>. La diode entre en conduction dans le sens normal pour une diode et continue à conduire même après la fin de l'impulsion. Mais si la tension sur l'anode devient nulle par rapport à la cathode la diode cesse de conduire même si par après le voltage redevient positif. Il faudra envoyer une autre impulsion sur la <b>Gate(2)</b> pour qu'elle recommence à conduire.
</p>
<h3>Utilisation du SCR</h3>
<p>
Voici un exemple d'utilisation, la charge peut-être un élément chauffant dont on veut contrôler la température. Je ne montre pas ici le circuit de contrôle qui envoie les impulsions sur la <b>Gate</b>.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lfBnLBzZbzylR-TCzW_itVTkQew3_FfFLdtznPPJrScf4FRcoJb7TuR9N8AgYIoH9hgt6b5VrZMEZc_3Vomki6aLd8m1ZeIYI0euzMFxu1xkxUn3PZXTX5BSlZO0MIce67A1waJ7OqISn76bsfMhhDHVx299Zas_Ct77fAPh43c5EaztT2TljSbD/s1729/scr-control-sch%C3%A9ma.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="835" data-original-width="1729" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1lfBnLBzZbzylR-TCzW_itVTkQew3_FfFLdtznPPJrScf4FRcoJb7TuR9N8AgYIoH9hgt6b5VrZMEZc_3Vomki6aLd8m1ZeIYI0euzMFxu1xkxUn3PZXTX5BSlZO0MIce67A1waJ7OqISn76bsfMhhDHVx299Zas_Ct77fAPh43c5EaztT2TljSbD/s400/scr-control-sch%C3%A9ma.png"/></a></div><br/>
À la sortie du pont redresseur on a une onde sinusoïdale redressée donc l'alternance normalement négative se retrouve dans le positif. On voit que les impulsions sont envoyées avec un certain délais après le début de chaque alternance et donc la charge ne reçoit que la partie après le début de l'impulsion lorsque le SCR entre en conduction. On peut retarder les impulsions autant que l'on veut et ainsi on contrôle la quantité d'énergie transmise à la charge. On appelle ça un contrôle de phase.
</p>
<h3>Vérifier un SCR avec un multimètre</h3>
<p>
Aujourd'hui <a href="https://www.youtube.com/watch?v=64TpJGJdxAs&lc=Ugy_sKEcBqzlI0eVB2d4AaABAg">Adrian</a> se demandait comment vérifier un SCR. Voici comment faire avec un multimètre.
<ol>
<li>
En placant le multimètre sur continuité diode. Entre la <b>Gate(2)</b> et la <b>cathode(3)</b> ça doit conduire lorsque le fil rouge est sur la <b>Gate(2)</b> et le noir sur la <b>cathode(3)</b>. Ça ne doit pas conduire si on inverse les fils.
</li>
<li>
Entre l'<b>anode(1)</b> et la <b>cathode(3)</b> ça ne doit conduire dans aucun sens.
</li>
<li>
Si à travers une résistance on applique un voltage positif entre la <b>Gate(2)</b> et la <b>cathode(3)</b> alors ça devrait conduire entre l'<b>anode(1)</b> et la <b>cathode(3)</b> seulement si l'<b>anode(1)</b> est positive par rapport à la <b>cathode(3)</b>
</li>
</ol>
</p>
<h3>Rôle du SCR dans l'alimentation du Apple II</h3>
<p>
Dans le circuit d'alimentation de l'ordinateur Apple II, le SCR servait de protection contre les surtensions pour protéger l'électronique de la carte mère. Ici je n'explique que le circuit de protection d'après la schématique dessinée par <a href="http://www.appleiioz.com/AppleIIoz/Projects/Entries/2016/10/9_240V_Dyna_Comp_PSU_Circuit_Diagram.html">Mark Cummings</a>.<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRnYYHro7T_rTUcH9XOao6W7JZ6Orx8xXZk0KA8HVKIMTkQVbjRyspVUhBTh4WNPocNhDXYdxVXjLstDVgzJgFHEO6O7w_lZYb0N2H7VZN4n8uhvY7Zin-IZTJHwfmereR0axxqfeGzkMqIGb5QeY6JTVgSwyb2YRAJt0KKGpACnz5nzGMiGTWmG8b/s1008/apple-II-psu.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="656" data-original-width="1008" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRnYYHro7T_rTUcH9XOao6W7JZ6Orx8xXZk0KA8HVKIMTkQVbjRyspVUhBTh4WNPocNhDXYdxVXjLstDVgzJgFHEO6O7w_lZYb0N2H7VZN4n8uhvY7Zin-IZTJHwfmereR0axxqfeGzkMqIGb5QeY6JTVgSwyb2YRAJt0KKGpACnz5nzGMiGTWmG8b/s600/apple-II-psu.png"/></a><center>cliquez sur l'image pour l'agrandir</center></div>
</p>
<p>
Le circuit de protection avec <b>SCR1</b> se trouve au centre en bas du dessin. Comme il s'agit d'une alimentation à modulation d'impulsions le circuit est divisé en 2 parties isolées électriquement l'une de l'autre <b>PRIMARY</b> et <b>SECONDARY</b>. Le lien entre les 2 parties n'est fait qu'à travers les transformateurs <b>T1</b> pour le passage de la puissance et <b>T2</b> pour les impulsions de contrôle. La voltage à la sortie est proprotionnel à la largeur des impulsions qui sont envoyées à travers <b>T2</b>.
</p>
<p>
Sans plus de détails sur le fonctionnement de l'alimentation revenons au circuit de protection. L'anode de <b>SCR1</b> est connectée à la sortie 5 volts qui alimente la carte mère à travers la diode <b>D23</b>. On voit aussi que la diode zener <b>D24</b> est aussi connectée à la sortie <b>+5V</b> ainsi qu'à la <b>gate</b> du SCR. Cette zener a un voltage de conduction de 5.6 volts. donc si le voltage de sortie atteint 5.6 volt la zener entre en conduction et déclenche <b>SCR1</b> le faisant entré en conduction. L'anode de <b>SCR1</b> est connectée à travers <b>R15</b> et <b>D6</b> au point <b>4</b> du transformateur <b>T2</b> court-circuitant ainsi les impulsions envoyées par le transistor <b>Q6</b> à ce transformateur. Puisque le primaire ne reçoit plus les impulsions de contrôle les voltages au secondaire tombent à zéro.
</p>
<h3>TRIAC</h3>
<p>
Le problème avec les SCR est qu'il faut redresser le AC afin de contrôler les 2 alternances, positive et négative d'une alimentation AC. Imaginez maintenant qu'on utilise 2 SCR et qu'on les connecte ensemble comme suit:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv4HHP_eXhevljtz-JmfcwbNAs0BC0RedKFr_opwXWnJ3r0KDofX4S-tedFvQOE29oaI00492X6TRLp7GlmAQneQnAnrPmN6TKv2o55QKA5xg9saZSL_l_ATC_YnfyRDostjndStNS1tchRjNRx651t6UGuZfwV4oQMAXvIH_mlMUPyTr8h6O38eYH/s833/SCR-back-to-back.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="663" data-original-width="833" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv4HHP_eXhevljtz-JmfcwbNAs0BC0RedKFr_opwXWnJ3r0KDofX4S-tedFvQOE29oaI00492X6TRLp7GlmAQneQnAnrPmN6TKv2o55QKA5xg9saZSL_l_ATC_YnfyRDostjndStNS1tchRjNRx651t6UGuZfwV4oQMAXvIH_mlMUPyTr8h6O38eYH/s320/SCR-back-to-back.png"/></a></div><br/>Alors on n'a plus besoin de pont redresseur. Pendant l'alternance positive l'impulsion fait conduire le TRIAC dans un sens et pendant la négative dans l'autre sens.<br/> Inutile de se compliquer les choses car les manufacturiers de semi-conducteurs ont déjà penser à ça et vendent un composant appeller un TRIAC exactement dans ce but. Si vous ouvrez un thermostat électronique pour les plaintes chauffantes fonctionnant sur le secteur, vous allez en trouver un à l'intérieur. Le symbole du TRIAC est le suivant:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicjDKCJEsp4l6UiKZl3VIeoN3Hj5PosRqr64LU_eONiiVGG4qGx0xCLiNZahrX8L2sDzLEMS6YixZ0l6z7dRO2p_nXB6NmdeBjdbHNzJrbTwGEdul82iwg8yTnfGZeTeXiC09pnMHcI9D4pl8GKlRdC72CbtrVQXz8iQIOf0OEZvl7hKx_ah0sNAhD/s409/TRIAC.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="306" data-original-width="409" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicjDKCJEsp4l6UiKZl3VIeoN3Hj5PosRqr64LU_eONiiVGG4qGx0xCLiNZahrX8L2sDzLEMS6YixZ0l6z7dRO2p_nXB6NmdeBjdbHNzJrbTwGEdul82iwg8yTnfGZeTeXiC09pnMHcI9D4pl8GKlRdC72CbtrVQXz8iQIOf0OEZvl7hKx_ah0sNAhD/s320/TRIAC.png"/></a></div>
</p>
<p>
Pour vérifier un TRIAC avec un mulitimiètre en mode conduction diode, si on place le fil rouge sur la <b>Gate</b> ça doit conduire entre la <b>Gate</b> et <b>A1</b> ainsi que <b>A2</b> mais si c'est le fil noir qui est sur la <b>Gate</b> ni l'un ni l'autre ne doit conduire. Entre <b>A1</b> et <b>A2</b> ça ne doit pas conduire non plus.
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-49795537980493471442023-05-08T16:20:00.003-04:002023-05-08T16:21:58.148-04:00STM8 Tiny BASIC V5.0R1 disponible<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX7-nDkG2gMB8ioT8mX9N5j6IKHR4NiKDG5Y7sMPphK5TwUPpbBKC_in0_s-GJDpWzu9i1T39mrQXcWf_7mGOoiwUL8zzwbojqc2xevyVLo5f-M3B5CWJdkbPgorMLrsyFH-dfhy3Sj8HrdX3uS5aAShek8BgHu5Vu9z25bbqbq-MZBYU1KDew3tLr/s153/spider_basic_logo.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" height="200" data-original-height="153" data-original-width="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX7-nDkG2gMB8ioT8mX9N5j6IKHR4NiKDG5Y7sMPphK5TwUPpbBKC_in0_s-GJDpWzu9i1T39mrQXcWf_7mGOoiwUL8zzwbojqc2xevyVLo5f-M3B5CWJdkbPgorMLrsyFH-dfhy3Sj8HrdX3uS5aAShek8BgHu5Vu9z25bbqbq-MZBYU1KDew3tLr/s200/spider_basic_logo.png"/></a></div>
La version <a href="https://github.com/Picatout/stm8_tbi/releases/tag/V5.0R1">V5.0R1</a> de <a href="https://github.com/Picatout/stm8_tbi">STM8 Tiny BASIC</a> est maintenant disponible. Elle implique des changements au jeu de commandes, des optimisations de code et des corrections de bogues.
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-47324711139335430612023-04-29T22:07:00.005-04:002023-04-30T09:48:21.354-04:00reverse engineering crusader mini<p>
Je magasinais sur Amazon lorsque m'est apparût la présentation d'un récepteur radio AM/FM/WB de poche. Le <a href="https://www.amazon.ca/dp/B08S721JT2?ref=ppx_yo2ov_dt_b_product_details&th=1">crusader mini</a>. Il le vende maintenant 20$CAN alors qu'il y a à peine quelque semaines lorsque je l'ai commandé il était affiché à 17$CAN. L'inflation galopante. Si j'ai acheté ce petit récepteur c'est par curiosité, un affichage analogique à l'aire du tout numérique! Je me suis dit: <b>ce récepteur n'est certainement pas analogique, je veux voir ce qu'il a dans le ventre.</b>
</div><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkW7qwDnMJQjdt2lgZWkVOynLudPaWvUyC4sqSHJugIskJX36Y9s58pTtljMyCrzzZrirK-UJ9CdW55enKutPHpJpXHe7JQt7qS1ffUMLFhtqjl-Y8iN9dcIf0casYWMU9DfMQgs9J0pLKC4ypp94qVHlUj_w9g9clvo5sxcDWeKPor4qSSUcHDkpC/s2576/20230429_131117.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="2576" data-original-width="1932" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkW7qwDnMJQjdt2lgZWkVOynLudPaWvUyC4sqSHJugIskJX36Y9s58pTtljMyCrzzZrirK-UJ9CdW55enKutPHpJpXHe7JQt7qS1ffUMLFhtqjl-Y8iN9dcIf0casYWMU9DfMQgs9J0pLKC4ypp94qVHlUj_w9g9clvo5sxcDWeKPor4qSSUcHDkpC/s400/20230429_131117.jpg"/></a></div></p>
<h3>Quelques bonnes et moins bonnes surprises</h3>
<p>
La première surprise sur réception fut la qualité de l'emballage. Beau design, une jaquette noire avec la photo de la radio. Glissée à l'intérieur de cette jaquette une boite orange à penture, qui s'ouvre comme un livre. À l'intérieur la radio est bien encadrée par les replis du carton qui épousent parfaitement sa forme la protégeant ainsi des chocs lors du tansport. Je suis étonné de retrouver un tel emballage pour un appareil de si petit prix. La boite inclue une dragone et 2 piles.
</p>
<P>
Je test la réception, je capte parfaitement le transmetteur météo du gouvernement Canadien situé à plus de 100Km. La bande FM offre aussi une bonne sensibilité. Pour la bande AM j'ai du attendre la tombé de la nuit car il n'y a pas de station AM à des centaines de kilomètres à la ronde. Pas déçu de la sensibilité l'a non plus. Et l'audio est de bonne qualité.
<p>
Puisque je l'ai acheté pour voir ce qu'il a dans le ventre, je l'ai donc ouvert. Comme je m'y attendais il s'agit d'un circuit 100% numérique. Seulement 2 circuits intégrés et 6 transistors. Presque que tous les composants sont de type montage en surface.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxERKmAEL5dWb8JQsFRRiDGTFcuXTpDx9pICQ6VuuY71elMeJoG4Evde43mbPc_87ZqI0bQtzBAih8Kq9sGQXQjAMF54RTJCnuCs2mA-GOG-CbgeC9mXeulJjHnX1PaJ6jcdmiC1UwXkKybCBRLYdADmRU_4nDteCu8H9dUdv2MAMbzJ60CDx0MXq/s4608/20230411_083117.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="4608" data-original-width="3456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxERKmAEL5dWb8JQsFRRiDGTFcuXTpDx9pICQ6VuuY71elMeJoG4Evde43mbPc_87ZqI0bQtzBAih8Kq9sGQXQjAMF54RTJCnuCs2mA-GOG-CbgeC9mXeulJjHnX1PaJ6jcdmiC1UwXkKybCBRLYdADmRU_4nDteCu8H9dUdv2MAMbzJ60CDx0MXq/s400/20230411_083117.jpg"/></a></div>
<br> Sur l'autre face du circuit imprimé il n'y a que 7 composants:
<ol>
<li>Le potentiomètre de 100Kohm pour la sélection des postes.</li>
<li>Le potentiomètre de 50Kohm pour le volume.</li>
<li>Le commutateur de mise sous tension et sélection de la bande WB/FM/AM.
<li>Un condensateur électrolytique de 100µF, pour le filtrage de l'alimentation.</li>
<li>Le cristal Y1 de 32768 Hertz utilisé par AKC-6952, récepteur radio DSP.</li>
<li>La DEL rouge indicateur d'alimentation</li>
<li>La prise d'écouteur 3,5mm</li>
</ol>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZLSSE_IMFgYpEK-dTgTzEKC4TDum6mNyVDSgywasKLH9kU4LvMDSVUByw233wRuOZ65w8skx8RsE1NnJLNBPpRRNeMKui4Vv0ziQm2yt41R-IQCI1Cf0zmPA_seSkSB4BaUt4lpuTJauFPoSioX99O35mc0Ove3LpEt-nx-u8M16d95Y9-SsMcGPq/s4608/PCP-face-inf%C3%A9rieure.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="4608" data-original-width="3456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZLSSE_IMFgYpEK-dTgTzEKC4TDum6mNyVDSgywasKLH9kU4LvMDSVUByw233wRuOZ65w8skx8RsE1NnJLNBPpRRNeMKui4Vv0ziQm2yt41R-IQCI1Cf0zmPA_seSkSB4BaUt4lpuTJauFPoSioX99O35mc0Ove3LpEt-nx-u8M16d95Y9-SsMcGPq/s400/PCP-face-inf%C3%A9rieure.jpg"/></a></div>
<br>
Les fils du compartiment piles étaient tellement fragiles que le fil rouge a coupé presque immédiatement au niveau du PCB. j'ai remplacé les 2 fils par des plus robustes.
</p>
<p>
Lorsque j'ai souvelé le circuit imprimé pour voir le dessous, deuxième surprise. La méthode utilisée pour l'affichage analogique je ne l'avais jamais vue. Une chenille à crémaillère en plastique glissant dans une rainure est entrainée par un par la roulette de sélection des stations qui possède sur sa face extérieure un engrenage comme on le voit sur les 2 photos suivantes. Je trouve l'idée originale mais pour la durabilité je ne suis pas convaincu.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLtag64POs6Dw5dUQCtT2Qh1sNlC9w5gcNXU8qMXfoBA54FLaWim4cnaJ-Yfhmx6foG8HiYjjjGD7O7R8joZqISY-HrFqKnCfVBIJoD4yNWhjtJpYtXFGftkMh7Tm_bF-N2g0Ugzcc_PKHNE_CBAzI0EW4smfnEk_NTQbBuGpFSxT_39QN_ajir_Ed/s4176/chenille.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="4176" data-original-width="3328" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLtag64POs6Dw5dUQCtT2Qh1sNlC9w5gcNXU8qMXfoBA54FLaWim4cnaJ-Yfhmx6foG8HiYjjjGD7O7R8joZqISY-HrFqKnCfVBIJoD4yNWhjtJpYtXFGftkMh7Tm_bF-N2g0Ugzcc_PKHNE_CBAzI0EW4smfnEk_NTQbBuGpFSxT_39QN_ajir_Ed/s400/chenille.jpg"/></a></div>
</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpO6sFqGrrH24LY2y4vxu8IJW60pJ5YB0on9Kd808do3L2mNZUEs-Z2yQDbSyJO52Fu9oWvEkRtSWBm2K548F2UUfAekHRaJ8ZoaF520-kCoeeXn1NPP03L7ifZ5cpCXg4Z_S2CNc0GTvIfhRe2pbj6v-VmIhQAmV_YzYm-yuuar7xhnoxhBS5XNmD/s3456/roulette%20de%20s%C3%A9lection%20des%20station.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="3408" data-original-width="3456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpO6sFqGrrH24LY2y4vxu8IJW60pJ5YB0on9Kd808do3L2mNZUEs-Z2yQDbSyJO52Fu9oWvEkRtSWBm2K548F2UUfAekHRaJ8ZoaF520-kCoeeXn1NPP03L7ifZ5cpCXg4Z_S2CNc0GTvIfhRe2pbj6v-VmIhQAmV_YzYm-yuuar7xhnoxhBS5XNmD/s400/roulette%20de%20s%C3%A9lection%20des%20station.jpg"/></a></div>
</p>
<h3>reverse engineering</h3>
<p>
Lorsque j'ai regardé ce circuit imprimé avec tous les composants en surface sur la face supérieure du PCB ainsi que le tracé du circuit sur la même face je me suis dit que ce serait facile de dessiner le circuit dans KiCAD. Avec un circuit de cette complexité il est impossible de tracer le circuit au complet sur une seule face sans faire des coupures de tracé. J'ai donc compté 12 résistances de 0 ohm qui ne servent que de pont là où les traces de cuivre devait-être coupées.
</p>
<P>
La première étape a été d'identifier les circuits intégrés et les 6 transistors:
<li><b>AKC6952</b>, est un récepteur complet multibandes allant des LW aux VHF. La sélection utilise un système de diviseur de tension et de potentiomètre.</li>
<li><b>NS8002</b>, est un amplificateur audio simple canal.</li>
<li><b>Q1 RM3401</b>, est un P channel MOSFET, utilisé comme commutateur d'alimentaion.</li>
<li><b>Q2 S9018</b> est un transistor bijonction NPN, VHF utilisé comme amplificateur pour le signal radio reçu par l'antenne télescopique.</li>
<li><b>Q3,Q4,Q5,Q6 S9014</b>, sont des transistors bijonction NPN utilisé dans ce circuit comme commutateur pour la sélection de la bande de fréquence.</li>
</P>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRzMInDDM6fP5nmHITbmanoZK4cb1-EZoCvbWDTK00pZnTMVKmM0OAYzlgJlQ-mEGj53jU-_mfpn_XRTz1c6Ky5xnkTJJJcsO4w6-zjFBG_hfgj_fVIStic_MrMLyv5T8xO0P1Xr7Vf2FnVtvRRF02jkFThgoUvjNW5lgXToetlS-W4An5zuHmb1UE/s1090/crusader-mini-schematic.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="678" data-original-width="1090" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRzMInDDM6fP5nmHITbmanoZK4cb1-EZoCvbWDTK00pZnTMVKmM0OAYzlgJlQ-mEGj53jU-_mfpn_XRTz1c6Ky5xnkTJJJcsO4w6-zjFBG_hfgj_fVIStic_MrMLyv5T8xO0P1Xr7Vf2FnVtvRRF02jkFThgoUvjNW5lgXToetlS-W4An5zuHmb1UE/s600/crusader-mini-schematic.png"/></a></div><br>
</p>
<h3>En conclusion</h3>
<p>
Comme j'ai l'habitude de le dire, il ne faut pas se fier aux apparences. Ce radio multibandes AM/FM/SW1/SW2 Grunding YB-P2000 à l'air tout numérique avec son affichage LCD et son pavé de touches. Il n'y à même pas de roulette pour la sélection des postes. La sélection se fait avec les boutons <b>H</b> et <b>M</b> à droite de l'affichage. Ce récepteur date de la fin des années 90.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhinDcvjecBo_99-Jm9VFy3We-7XgF57-pfQ4ekO9RCWUZSx6TDwtGD7Bu4OMFlDG4SzYHD9C1aKdS00tTvU5ICloLIbVGou2m0dEAFwifCbe2TpMHlfa9o-PqqVM0lD0vSCICRoKzIQrKdBUU-x-18tmcO8AD0EBeyggma7_iXOJFRPNtc1NdO8EHc/s4608/vue%20face%20avant.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="3456" data-original-width="4608" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhinDcvjecBo_99-Jm9VFy3We-7XgF57-pfQ4ekO9RCWUZSx6TDwtGD7Bu4OMFlDG4SzYHD9C1aKdS00tTvU5ICloLIbVGou2m0dEAFwifCbe2TpMHlfa9o-PqqVM0lD0vSCICRoKzIQrKdBUU-x-18tmcO8AD0EBeyggma7_iXOJFRPNtc1NdO8EHc/s400/vue%20face%20avant.jpg"/></a></div>
</p>
<p>
Il s'agit pourtant d'un récepteur super-hétérodyne. La seule différence avec les récepteurs superhétérodynes des années 70 ou 80 est que le condensateur variable a été remplacé par des <b>diodes varicap</b> et les circuits sont intégrés et montés en surface. Aucun traitement numérique du signal dans ce récepteur.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6bUrHxGxj214i-u-alqrGeK08a9iB-VEjISR1WPRuUvWncwTs0ax4wYiBPU7EBH-D-gahTmYldAhG6RKV4ZMxxFJpipc_-XN99DO1elCrSLzJOqm_f9JXs8fZ77MvvLuRuMoP8YSRVMLAZhATbbB1mQxSmU8vTgAGUwh2cXM2V9mN5JXETs3KVBxs/s4176/pcb-rf-face-inf%C3%A9rieure.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="2600" data-original-width="4176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6bUrHxGxj214i-u-alqrGeK08a9iB-VEjISR1WPRuUvWncwTs0ax4wYiBPU7EBH-D-gahTmYldAhG6RKV4ZMxxFJpipc_-XN99DO1elCrSLzJOqm_f9JXs8fZ77MvvLuRuMoP8YSRVMLAZhATbbB1mQxSmU8vTgAGUwh2cXM2V9mN5JXETs3KVBxs/s400/pcb-rf-face-inf%C3%A9rieure.jpg"/></a></div>
J'ai enlevé le circuit imprimé du MCU de contrôle et on aperçois sur cette photo <i>the usual suspects</i>, si je peux dire, qu'on retrouvait sur les circuits des années 70. Transformateurs IF, condensateurs ajustable,inductances.
</p><p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTRvH7r3ntsjfLZGJo_vDjra47Qi9zUW5xSoFhdMXxV64SjUyZR2dpLzStsBf2qWlQVnM89LaS2GIcHBKtNECaJPFuU6DIJwt_KPn7UYGK2jzJ03x5nlIABroj3gtWh4aSyT96GuW6kuagShq99uTXshdXZiYSue3NGdPFlTe73Rc5LcBgh6SMmrqj/s4448/pcb-rf-face-sup%C3%A9rieure.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="2720" data-original-width="4448" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTRvH7r3ntsjfLZGJo_vDjra47Qi9zUW5xSoFhdMXxV64SjUyZR2dpLzStsBf2qWlQVnM89LaS2GIcHBKtNECaJPFuU6DIJwt_KPn7UYGK2jzJ03x5nlIABroj3gtWh4aSyT96GuW6kuagShq99uTXshdXZiYSue3NGdPFlTe73Rc5LcBgh6SMmrqj/s400/pcb-rf-face-sup%C3%A9rieure.jpg"/></a></div>
Sur l'autre face du circuit imprimé on aperçoit les composants montés en surfaces.
</p>
<p>
Voici la schématique de la partie radio-fréquence.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8oLiVo2IkZVs3YfXUHv8Ge-0ovNX5N_R20q8_yWtF_7xW1zO_gFD5kuqvY-LVTAiOBjMntx0D3Fs7_r7YQHqfLfQE2G3IBt8UOUGmkLokP9EPiuPbUVpFdJWGZD-szoQ-ICtbqg8vXa32DFWf1IE1LEJwlyhmoZSTxWW9RvHJo91pjzqV5fKSwekL/s1320/sch%C3%A9matique-rf.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="734" data-original-width="1320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8oLiVo2IkZVs3YfXUHv8Ge-0ovNX5N_R20q8_yWtF_7xW1zO_gFD5kuqvY-LVTAiOBjMntx0D3Fs7_r7YQHqfLfQE2G3IBt8UOUGmkLokP9EPiuPbUVpFdJWGZD-szoQ-ICtbqg8vXa32DFWf1IE1LEJwlyhmoZSTxWW9RvHJo91pjzqV5fKSwekL/s600/sch%C3%A9matique-rf.png"/></a></div>
La sélection des bandes est entièrement mécanique. IC1 est un <b>front end</b> pour la bande FM et <b>IC2</b> sert d'amplificateur IF et démodulateur pour le FM ainsi que de front end, ampli IF et démodulateur pour les bandes AM/SW1/SW2.
</p>
<p>
Dans ce récepteur le microcontrolleur ne sert qu'à afficher l'information, mémorisation des stations, alarmes et à contrôler le voltage qui est appliqué sur les diodes varicap. Ce voltage détermine la capacitance des diodes et donc la fréquence d'accord des circuits. Il y a 2 varicaps pour la bande FM et 2 autres pour les bandes AM/SW1/SW2.
</p>
<p>
Il serait impossible de fabriquer de nos jour un récepteur multibandes de ce type à faible coup, ce récepteur m'avait d'ailleurs coûté bien plus cher que le crusader mini. Je dirais même qu'il serait probablement impossible de les fabriquer car il n'y a plus de fabriquants pour ces anciens composants.
</p>
<p>
Franchement il n'y a rien à regretter de ce cette vieille technologie analogique. C'est vraiment étonnant ce qu'un simple petit circuit intégré peut accomplir en utilisant le traitement numérique du signal <b>(DSP)</b>.
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-58012715645532185112023-04-27T19:45:00.006-04:002023-05-01T13:42:35.898-04:00STM8 Tiny BASIC V4.0<p>
Je viens de livrer la dernière version de <a href="https://github.com/Picatout/stm8_tbi/releases/tag/V4.0R1">STM8 Tiny BASIC</a>. Il s'agit d'une révision majeure incompatible avec les versions antérieures.
<ul>
<li>La machine virtuelle a subie des transformations majeures pour la rendre plus performante.</li>
<li>la fonction <b>BIT()</b> a été retirée car la même chose peut-être accomplit avec la function <b>LSHIFT().</b></li>
<li>Les commandes <b>BRES</b>, <b>BSET</b> et <b>BTOGL</b> ont une sémantique différente incompatible avec les versions antérieures.</li>
<li>La commande <b>RANDOMIZE</b> a étée ajoutée.</li>
</ul>
Pour plus d'information il faut consulter le manuel de référence qui est dans le dossier <b>DOCS</b>.
</p>
<p>
Après avoir exécuter avec succès tous les programmes qui se trouvent dans le dossier BASIC, je considère qu'il n'y a pas de bogues majeurs donc j'ai publié cette version comme un <b>release.</b>
</p>
<h3>Réflexion</h3>
<p>
Je songe à renommer le projet, quelque chose comme <b>mcu BASIC</b> ou encore <b>spider BASIC</b>. J'ai même créé une mascotte mais je ne suis pas encore décidé.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcZgrTvQgvK6yY__776yuicdcCmqSWV8HOBX9MVJwBhVAw1aOBT7eRtleTtjPy0p3M0iKVvnZz_t1zX7sI1oOaFfVzfd74AZRsFFq8VTeBoglfpwV5ZT1y9Wokyp4Cg54KeqNe93YT_Tftq_344XCi0seNdaWx4WxMoTUEggZti_8GGjFZe2goEo2a/s153/spider_basic_logo.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="320" data-original-height="153" data-original-width="94" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcZgrTvQgvK6yY__776yuicdcCmqSWV8HOBX9MVJwBhVAw1aOBT7eRtleTtjPy0p3M0iKVvnZz_t1zX7sI1oOaFfVzfd74AZRsFFq8VTeBoglfpwV5ZT1y9Wokyp4Cg54KeqNe93YT_Tftq_344XCi0seNdaWx4WxMoTUEggZti_8GGjFZe2goEo2a/s320/spider_basic_logo.png"/></a></div><br>
Les araignées ont 8 pattes, les STM8 ont 8 bits et les plus petits sont au format SOIC-8. Juste une idée comme ça, sans doute influencé par les araignés que je rencontre occasionnellement dans la salle de bain. Voici ma source d'inspiration prise en flagrant délit d'invasion domiciliaire:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyqaicGdqCZt3vQriXMn9VYshHmLlOxMiEIK1JYiTSc9VW50gaCi0ZePPMhQ0c2MvTm4xfW0nBs-UtnR5fsQ3A8DRBhRUe_NZRAIH0fre3NcNnbanUaui0YW8Rtv42tkm8n2SWQJ8Byx3qdXJriUuun9KxIWW4mFtmE7yebAcO26BgvGhlwWcyyTbY/s574/araign%C3%A9e-salle-de-bain.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="574" data-original-width="574" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyqaicGdqCZt3vQriXMn9VYshHmLlOxMiEIK1JYiTSc9VW50gaCi0ZePPMhQ0c2MvTm4xfW0nBs-UtnR5fsQ3A8DRBhRUe_NZRAIH0fre3NcNnbanUaui0YW8Rtv42tkm8n2SWQJ8Byx3qdXJriUuun9KxIWW4mFtmE7yebAcO26BgvGhlwWcyyTbY/s320/araign%C3%A9e-salle-de-bain.jpg"/></a></div>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-87390391582360252482023-04-22T22:01:00.002-04:002023-04-22T22:01:28.663-04:00STM8 Tiny BASIC V3.2R1<p>
J'ai continué mon travail sur STM8 Tiny BASIC pour l'améliorer. Cette révision consiste simplement en la continuation de la modification de la machine virtuelle pour améliorer sa performance. Ce changement de modèle d'exécution a entraîné son lot de bogues régressifs. J'ai corrigés tous ceux qui se sont manifestés lors de mes tests. Maintenant tous les programmes dans le répertoire BASIC fonctionnent correctement. Suivre le lien suivant pour télécharger la <a href="https://github.com/Picatout/stm8_tbi/releases/tag/V3.2R1">dernière révision</a>.
<br><a href="https://github.com/Picatout/stm8_tbi/tree/V3.2R1">dépôt du projet</a>.
</p>
<h3>Démonstration conversion de la lecture ADC en voltage</h3>
<p>
Le programme suivant démontre comment faire une lecture analogique et la convertir en voltage. Bien que Tiny BASIC ne supporte que les entiers il est tout fait possible de convertir la lecture en voltage avec 3 décimales fractionnaires. Le voltage de référence est de 3,3 volts et puisque qu'il s'agit d'un convertisseur à 10 bits la lecture maximale est de 1023.
<pre><code>
1 ADC.TO.DEC
2 ' CONVERT ADC READING TO 3 DIGITS DECIMAL
10 CONST VREF=33,ADC.RES=10240
14 ADCON 1
20 DO
30 LET V=ADCREAD(0)
40 ? char(27);"c";V,; :GOSUB CONVERT
50 PAUSE 50:GET K : UNTIL K
60 ADCON 0
90 END
99 ' D digit to print {0..9}
100 PRT.DIGIT
110 ? D;CHAR(8);
120 RETURN
199 FRAC.DIGIT' get next digit from remainder R
200 LET R=R*10, D=R/ADC.RES,R=R%ADC.RES
210 RETURN
299 CONVERT ' ADC READ VALUE V
300 LET D=V*VREF/ADC.RES, R=V*VREF%ADC.RES
310 GOSUB PRT.DIGIT:?".";
320 GOSUB FRAC.DIGIT: GOSUB PRT.DIGIT
330 GOSUB FRAC.DIGIT: GOSUB PRT.DIGIT
340 GOSUB FRAC.DIGIT: GOSUB PRT.DIGIT
350 ?
360 RETURN
</code></pre>
</p>
<p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/tyYWHSDcJ8M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-80081461965669424372023-04-19T16:15:00.010-04:002023-04-22T04:56:32.246-04:00vérificateur de continuité<p>
<b>Projet éducatif sans microcontrolleur</b>
<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOVJrn7amjO24fK80mnXrA7fpDDzh7Ahp4syudxNxtceclFn5WGcadvYr0z6ynk7riRRoZAlqgBgWGtoE3SEoZSBxNNE4GLTWLcn0ht7BW-2AmXWqkN_LXU_Y882apBqW9xdrrb7we-PR7EbwdM1qxCvUMZFpUfDhCjAc-tgU5GMoZNKUkTpI9XKXb/s125/sans-mcu.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="200" data-original-height="109" data-original-width="125" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOVJrn7amjO24fK80mnXrA7fpDDzh7Ahp4syudxNxtceclFn5WGcadvYr0z6ynk7riRRoZAlqgBgWGtoE3SEoZSBxNNE4GLTWLcn0ht7BW-2AmXWqkN_LXU_Y882apBqW9xdrrb7we-PR7EbwdM1qxCvUMZFpUfDhCjAc-tgU5GMoZNKUkTpI9XKXb/s200/sans-mcu.png"/></a></div>
</p>
<h3>Vérificateur de continuité</h3>
<p>
Voici un petit projet simple à réaliser pour un débutant en électronique. Il ne requiert que 2 transistors d'usage général facilement disponible ainsi que quelques composants passifs.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xYCjUwUbpLDBhVjN-Sa-7L8w6k-FXJTQ9JXqD_TmOaT83hlUAtqsT_3ZjMMEsv3nZVMZRvezQmMI8Qvpv3JgOZCNYlV0SRDeMaFrAuA57MPUbCo_hfCXXLnT05_i7YJNuKH4aUJJcUVHQ3yezd2lgJL-AM4mB5Xubkh4UkOHq-xVIVQsw6s-Fkg8/s1658/schematic.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="864" data-original-width="1658" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7xYCjUwUbpLDBhVjN-Sa-7L8w6k-FXJTQ9JXqD_TmOaT83hlUAtqsT_3ZjMMEsv3nZVMZRvezQmMI8Qvpv3JgOZCNYlV0SRDeMaFrAuA57MPUbCo_hfCXXLnT05_i7YJNuKH4aUJJcUVHQ3yezd2lgJL-AM4mB5Xubkh4UkOHq-xVIVQsw6s-Fkg8/s400/schematic.png"/></a></div>
</p>
<h3>Matériel requis</h3>
<p>
<ul>
<li>1 petite plaquette de bakélite pour le montage. <div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOnfienrJ0JBasYQaj4F1sbVgyXbmTy_CrIr5IfUyw986OetfXVRsZqeV3jlil2-A2llR0XBR_ZUGUXkUnu_tZl3DtDv8-DsQ_GspJm9eNZSMrzDqHPhFqtw8XWxQW9l8KCajyWGP9oBJkntsZ_Fi_vycHUkc_L9zym9OQUusfGz9gGXbebdtEsNrU/s425/pcb-5x7cm.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="200" data-original-height="311" data-original-width="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOnfienrJ0JBasYQaj4F1sbVgyXbmTy_CrIr5IfUyw986OetfXVRsZqeV3jlil2-A2llR0XBR_ZUGUXkUnu_tZl3DtDv8-DsQ_GspJm9eNZSMrzDqHPhFqtw8XWxQW9l8KCajyWGP9oBJkntsZ_Fi_vycHUkc_L9zym9OQUusfGz9gGXbebdtEsNrU/s200/pcb-5x7cm.jpg"/></a></div></li>
<li>1 transistor NPN 2N3904 </li>
<li>1 transistor PNP 2N3906</li>
<li>1 transistor céramique de 10nF</li>
<li>1 résistance 1/4 watt 100 ohm</li>
<li>1 résistance 1/4 watt 1Kohm</li>
<li>2 résistances 1/4 watt 10Kohm</li>
<li>1 résistance 1/4 watt 18Kohm</li>
<li>1 résistance 1/4 watt 51Kohm</li>
<li>1 DEL rouge 3mm ou 5mm, <b>pas bleu ou blanche, voir texte.</b></li>
<li>1 petit haut-parleur 8 ohm</li>
<li>1 petit commutateur simple pôle</li>
<li>1 pile 9 volt</li>
<li>1 porte pile</li>
<li>1 petit-boitier</li>
</ul>
</p>
<h3>montage sur plaquette sans soudure</h3>
<p>
Je n'ai pas fait de montage permanent mais voici le schéma de montage sur une plaquette sans soudure.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIkNxk565G6RbywhePFp4ZO9PSFGa6sa6oyemeB_5kosuuxOlaMvB7efkPDdtbumtMiLxwq38mqR3nBi3WR7K63hMUmt9rWem_QTH2j0BIbn-5An1XHs31YRyvocU8LDBcTboFKSiLSs9wYcSdI2iL3JcTgcWjatdQUh8xUT2_TtLcXPGJUiU20aLA/s1600/v%C3%A9rificateur-continuit%C3%A9-montage-sans-soudure.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="402" data-original-width="738" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIkNxk565G6RbywhePFp4ZO9PSFGa6sa6oyemeB_5kosuuxOlaMvB7efkPDdtbumtMiLxwq38mqR3nBi3WR7K63hMUmt9rWem_QTH2j0BIbn-5An1XHs31YRyvocU8LDBcTboFKSiLSs9wYcSdI2iL3JcTgcWjatdQUh8xUT2_TtLcXPGJUiU20aLA/s1600/v%C3%A9rificateur-continuit%C3%A9-montage-sans-soudure.png"/></a></div>
</p>
<h3>Principe de fonctionnement</h3><p>
Le circuit est basé sur 2 transistors bijonction, <b>Q1</b> de type <b>NPN</b> et <b>Q2</b> de type <b>PNP</b>. Les transistors <b>NPN</b> fonctionnent avec le collecteur positif par rapport à l'émetteur alors que les <b>PNP</b> fonctionnent avec le collecteur négatif par rapport à l'émetteur. C'est pour ça que <b>Q1</b> est monté avec l'émetteur à <b>V-</b> de l'alimentation alors que <b>Q2</b> est monté avec l'émetteur au <b>V+</b> de l'alimentation.
</p>
<p>
Ce type de circuit porte plusieurs noms, <i>bascule astable</i>, <i>oscillateur RC</i> ou <i>multivibrateur</i>. Il existe plusieurs façons de réaliser ce type de circuit, Il aurait pu être réalisé avec 2 transistors <b>NPN</b>. Je préfère ce modèle qui ne requiert qu'un seul condensateur.<br>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLc10pAanxpY6CFpDig5w52LUO8MLbfF-3-TFtl-I761ibWTxI0qmnNtgDJXHW6f52SPFb7toeStkpXzgkqr8LNV5iYadMKLurMAgulVie_OAWCX6iMLb99PGB7MnemDNu-CUDVKpUG7ZyXVeeOl4O1Ur4Tw6jJ-9uOaOvDn1QBCMB-G2uzyUypii_/s1218/sch%C3%A9matique.2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="869" data-original-width="1218" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLc10pAanxpY6CFpDig5w52LUO8MLbfF-3-TFtl-I761ibWTxI0qmnNtgDJXHW6f52SPFb7toeStkpXzgkqr8LNV5iYadMKLurMAgulVie_OAWCX6iMLb99PGB7MnemDNu-CUDVKpUG7ZyXVeeOl4O1Ur4Tw6jJ-9uOaOvDn1QBCMB-G2uzyUypii_/s600/sch%C3%A9matique.2.png"/></a></div>
</p><p>L'image suivante représente une capture des signaux au points <b>TP1</b> en jaune et <b>TP2</b> en bleu.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigG6C2DJ5_dQ3Y5mPWt1rltbLRpWjVt9aTXkw2zERrmxnm397xmfDlnUywUyB_ZZXxEtXWxNv7jnPnX8AjAEG3VbGG3ok9Wgux8adkeFHnjA3r0Kqfr76Pkgut0VcZ14mbEbCMHwv1IXzGwn5yyRuGz5-qaCwhGrqEy3qwUm50e_8Q4x-rGKv-HCSs/s391/signaux-tp1-tp2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="234" data-original-width="391" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigG6C2DJ5_dQ3Y5mPWt1rltbLRpWjVt9aTXkw2zERrmxnm397xmfDlnUywUyB_ZZXxEtXWxNv7jnPnX8AjAEG3VbGG3ok9Wgux8adkeFHnjA3r0Kqfr76Pkgut0VcZ14mbEbCMHwv1IXzGwn5yyRuGz5-qaCwhGrqEy3qwUm50e_8Q4x-rGKv-HCSs/s600/signaux-tp1-tp2.png"/></a></div>
</p><p>Commençons du côté gauche du schéma électronique.
On a la pile <b>BT1</b> évidemment avec le commutateur de mise sous tension <b>SW1</b>. Les étiquettes <b>probe+</b> et <b>probe-</b> indique les points de branchement des fils qui servent à sonder le circuit ou composant à vérifier. La résistance <b>R1</b> en série avec la diode électroluminescente, i.e. DEL rouge <b>D1</b> donne une indication visuelle de la continuité du circuit sous vérification. En effet lorsqu'on touche ensemble <b>probe+</b> et <b>probe-</b> la <b>D1</b> s'allume et une tonalité se fait entendre si la résistance entre <b>probe+</b> et <b>probe-</b> n'est pas trop élevée, je vais revenir sur ce point.
</p>
<p>
Cependant <b>D1</b> ne sert pas seulement d'indicateur visuel, elle sert aussi comme voltage de référence pour le circuit de polarisation de la base de <b>Q1</b>. En effet la tension aux bornes de cette DEL demeure constante à environ 2 volts même si la pile faiblie. Les valeurs de <b>R2</b> et <b>R3</b> forment le diviseur de tension qui polarise la base de <b>Q1</b>. Si la DEL rouge est remplacée par une DEL bleu ou blanche le circuit ne fonctionnera pas car ces diodes fonctionnent à une tension supérieure à 3 volts, alors <b>Q1</b> et <b>Q2</b> entreront en saturation et le multivibrateur ne fonctionnera pas.
</p>
<p>
Avec les valeurs utilisées pour <b>R2</b> et <b>R3</b> lorsqu'on mets en contact les 2 fils de sonde, le voltage à la base de <b>Q1</b> est juste suffisant pour que le transistor commence à conduire.<br>
<ol><li>
Au point <b>A</b> sur les courbes, lorsque <b>Q1</b> commence à conduire, il injecte du courant dans la base de <b>Q2</b> via son collecteur. Donc <b>Q2</b> commence à conduire lui aussi. Le voltage aux bornes de <b>R6</b> commence donc à monté. À travers <b>R5</b> et <b>C1</b> cette élévation de tension est transférée à la base de <b>Q1</b>. En conséquence <b>Q1</b> conduit encore plus et <b>Q2</b> de même. Cette boucle de renforcement s'appelle une rétro-action positive, On voit que ce phénomène est très rapide puisque le voltage au point <b>TP1</b> monte à la verticale sur le tracé jaune au point <b>A</b>.</li>
<li>Dans la partie <b>B</b> de la courbe jaune les 2 transistors sont en saturation, c'est à dire qu'ils conduisent le maximum de courant qu'ils peuvent. Pendant cette phase <b>C1</b> continue à se charger et maintient ainsi les 2 transistors en saturation par le courant qui passe à travers lui. Cette rétro-action va cessée lorsque le condensateur aura atteint sa pleine charge et qu'il ne pourra plus contribuer au courant dans la base de <b>Q1</b>.</li>
<li>Au point <b>C</b>, au moment où <b>C1</b> ne passe plus aucun courant dans la base de <b>Q1</b>, la conduction de ce dernier diminue ainsi que celle de <b>Q2</b> et la tension sur <b>R6</b> commence à diminuer. Cette fois c'est la baisse de tension qui est transmise à la base de <b>Q1</b>. par le même phénomène de rétro-action positive la conduction des 2 transistors va diminuer rapidement jusqu'à couper complètement. Encore une fois le phénomène est très rapide donc la tension tombe à la verticale en <b>C</b>. À ce moment puisque <b>C1</b> a accumulée une charge électrique pendant la phase précédente, le voltage aux bornes de <b>C1</b> est positif au point <b>TP1</b> par rapport à l'autre côté du condensateur. Puisque cette extrémitée est maintenant au niveau de tension 0 volt, ça implique que l'autre extrémitée est à une tension négative à par rapport à <b>V-</b> de la pile. C'est bien ce qu'on observe sur la courbe bleu en point <b>C</b></li>
<li>durant la phase <b>D</b> le condensateur commence à se décharger à travers <b>R2</b>,<b>R5</b>,<b>R6</b> et le haut-parleur <b>LS1</b>. Jusqu'au point ou le voltage à ses bornes va s'inverser pour devenir légèrement positif, à environ +0,6 volt en <B>TP2</B> <b>Q1</b> va recommencer à conduire. Alors le cycle recommence.</li>
</p>
<p>
Comme on le voit sur la courbe jaune, la durée de la partie <b>B</B> est plus courte que la partie <b>D</b>. C'est du au fait que les constantes de temps sont différentes pour ces 2 phases.
En effet lorsqu'on applique une tension aux bornes d'un circuit formé par une résistance en série avec un condensateur le condensateur se charge à une vitesse qui dépend du produit <b>R*C</b>. Ce produit s'appelle <b>constante de temps</b>.
Cette constante de temps détermine combien de temps il faut au condensateur pour se charger ou décharger.
En phase <b>B</b> on a <b>Tb=R5*C1</b><br>
En phase <b>D</b> on a <b>Td=(R2+R5+R6+LS1)*C1</b>. La valeur de la constante de temps est donc plus grande.<br>
La période de la fréquence audio est la somme des périodes <b>B</b>+<b>D</b>.
</p>
<h3>Autre source d'alimentation</h3>
<p>
Supposons que voulez alimenter ce circuit à 3 volts plutôt qu'à 9 volts. Il suffit alors de remplacer la résistance <b>R1</b> par une valeur de <b>120 ohm</b> alors le voltage sur l'anode de la DEL va demeuré à 2 volts et les résistances <b>R2</b>, <b>R3</b> n'auront pas besoin d'être modifiées. Le résultat sera une fréquence audio différente et un volume sonore plus faible. Je l'ai vérifié et ça fonctionne.
</p>
<h3>Pour ceux qui aiment le 555</h3>
<p>
Voici une autre version réalisée avec une minuterie <b>TLC555CP</b>. La particularité de ce circuit est qu'il accepte de fortes résistances en produisant une fréquence de plus en plus basse à mesure que la résistance entre les sondes augmente. Par exemple si on pince entre les doigts de chaque main les sondes ça produit une série de clics.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwdXEJMcZkWLolrKvkuN2NthXgYNzdHZgNweydYFsawqrVcfsyQTMDVYJPjxsq0iKvAuPyohUEnq5NoHicdCtezOvgmGB7lzLkkwqxS4YsIwpRG5BD-l67sd0GV570lrit2L5DUG99wmIcXK4rFTbCAWgmPr4NJCoCC4sTGkoRwLkB1uOI-JFIfoOz/s1377/555-v%C3%A9rificateur-continuit%C3%A9.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="870" data-original-width="1377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwdXEJMcZkWLolrKvkuN2NthXgYNzdHZgNweydYFsawqrVcfsyQTMDVYJPjxsq0iKvAuPyohUEnq5NoHicdCtezOvgmGB7lzLkkwqxS4YsIwpRG5BD-l67sd0GV570lrit2L5DUG99wmIcXK4rFTbCAWgmPr4NJCoCC4sTGkoRwLkB1uOI-JFIfoOz/s600/555-v%C3%A9rificateur-continuit%C3%A9.png"/></a></div>
</p>
<p>
Voici une variante utilisant encore le <b>TLC555CP</b>. Cette version ne produit qu'une seule tonalité et l'alarme ne déclenche que pour les faibles résistances. Elle utilise la broche <b>~reset</b> qui est maintenue à 0 volt à travers <b>R4</b>. Lorsque l'anode de <b>D1</b> est mise à +9V le voltage sur la broche <b>~reset</b> monte à environ 7 volt ce qui est suffisant pour activer la minuterie. <b>D1</b> doit-être une DEL rouge.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB2MT_eU79WjfFiHeSD6_hv12VehyzktT454_5srzmb90GMSrSkZ1OHt2UAAqgJO6A0M6ZLmtp1iRHSOTnfytCAYl-sfYHKt9exHi_BbdjOnmKlhmUg-b5mw4eDbQQ0tDrYFQ1Wb9HX3c2OeCAdMuNudGRCl0yBfmIq0NFQRvuIPcFIhCoN8LclS_z/s1366/555-v%C3%A9rificateur-continuit%C3%A9%28v2%29.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="600" data-original-height="865" data-original-width="1366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB2MT_eU79WjfFiHeSD6_hv12VehyzktT454_5srzmb90GMSrSkZ1OHt2UAAqgJO6A0M6ZLmtp1iRHSOTnfytCAYl-sfYHKt9exHi_BbdjOnmKlhmUg-b5mw4eDbQQ0tDrYFQ1Wb9HX3c2OeCAdMuNudGRCl0yBfmIq0NFQRvuIPcFIhCoN8LclS_z/s600/555-v%C3%A9rificateur-continuit%C3%A9%28v2%29.png"/></a></div>
</p>
<h3>Conclusion</h3>
<p>
Cet appareil simple et économique à fabriquer est utile pour vérifier s'il y a une coupure dans un circuit mais aussi pour vérifier des diodes et même des transistors à jonctions.
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-10967409548948761642023-04-18T15:07:00.004-04:002023-04-18T15:18:29.562-04:00STM8 Tiny BASIC V3.2R0<p>
J'ai repris le travail sur mon projet <a href="https://github.com/Picatout/stm8_tbi/tree/V3.2R0">STM8_Tiny BASIC</a>. J'en suis rendu maintenant à la version 3.2R0. Cette version consiste pour l'essentiel à un travail d'optimisation de la machine virtuelle qui exécute le bytecode, pour la rendre plus rapide. J'ai obtenu une amélioration intéressante comme le montre les résultats suivants.</p>
<h3>Programme de test</h3>
<p>
<pre><code>
10 ' for next speed test
12 LET T = TICKS
14 FOR I = 1 TO 10000
16 NEXT I
18 ? TICKS - T ; " MSEC"
20 ' DO UNTIL TEST
22 LET I = 1 , T = TICKS
24 DO LET I = I + 1 : UNTIL I > 10000
26 ? TICKS - T ; " MSEC"
28 ' GOTO LOOP
30 LET I = 1 , T = TICKS
32 LET I = I + 1 : IF I <= 10000 GOTO 32
34 ? TICKS - T ; " MSEC"
program address: $91, program size: 241 bytes in RAM memory
</code></pre></p>
<h3>Résultats de la version antérieure V3.1R13</h3>
<p><pre><code>
>RUN
115 MSEC
771 MSEC
846 MSEC
</code></pre>
</p>
<h3>Résultats obtenus avec cette version V3.2R0</h3>
<p><pre><code>
>run
84 MSEC
451 MSEC
513 MSEC
</code></pre>
</p>
<h3>Autre test</h3>
<p>
Un autre bon test est l'exécution du programme <a href="https://github.com/Picatout/stm8_tbi/blob/V3.2R0/BASIC/pwm-soft.bas">pwm-soft.bas</a>. En mesurant la fréquence PWM avec un oscilloscope
j'Obtient 95 Hertz pour la version antérieure et 144 Hertz pour cette version. Cet un bon test car la vitesse PWM est directement lié à la vitesse d'exécution de la boucle <b>LOOP</b>.
Donc en général la machine virtuelle exécute le code 144/95=1.5 fois plus rapidement.
</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-19956161480405623182023-04-05T12:30:00.003-04:002023-04-05T12:41:59.891-04:00détecteur de clou<p>
Mes expérimentations avec les pointeurs de métal ont abouties à ce détecteur de clou qui permet de détecter des clous ou vis masqués dans une planche ou un mur.
Ce détecteur contrairement au premier prototype est programmé entièrement en assembleur sur un MCU STM8S103F3M.
</p>
<p align="center">
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil2Ol_NfZ0vkQDw4R6m6YVgNTvgZNd1mbEoUrqsq-USsa-1k7-OiJAFkZIJfbLmfeyqd24bGOBXHjNh3Wja9EA9giaTj1GzWO2Qys0QUkd27CPcxYsJYVSFA3qsnN9p5v0DhdZ9GQaxHpoJWL1UrwuYbf_gbBnC2DoEG7VQxulQnA1x8HX2Z468VpY/s3450/nail-finder-box.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="3450" data-original-width="2530" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil2Ol_NfZ0vkQDw4R6m6YVgNTvgZNd1mbEoUrqsq-USsa-1k7-OiJAFkZIJfbLmfeyqd24bGOBXHjNh3Wja9EA9giaTj1GzWO2Qys0QUkd27CPcxYsJYVSFA3qsnN9p5v0DhdZ9GQaxHpoJWL1UrwuYbf_gbBnC2DoEG7VQxulQnA1x8HX2Z468VpY/s400/nail-finder-box.jpg"/></a></div>
<br><center><b>projet finalisé</b></center>
</p>
<p>
Finalement pour l'inductance j'ai utilisée une ferrite semi-cylindrique pour le bobinage de l'inductance. Deux rangs de fil 30 AWG sur cette ferrite donne une inductance de 644µH. La ferrite provient d'une coquille de ferrite conçue pour les cables d'alimentation.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlzxM7-vWV8qkx3_yBwAQeEBoCziLs92YHwaeREmLKtL9Vq5tmldT8QsGjDxTwXndBnxpsyPKTXjDIaZ0QelhA0Sgt6_ejH4-2AI9qy__q9tlbEIj_nr5VS2vp-P_4vRLzvc1FTDiCcHs8DlMH-l9Qt8DgdjYfKMciZJ4R3No9Ml0ySsDPsIpVcbp-/s2130/cable-ferrite.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="2130" data-original-width="2130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlzxM7-vWV8qkx3_yBwAQeEBoCziLs92YHwaeREmLKtL9Vq5tmldT8QsGjDxTwXndBnxpsyPKTXjDIaZ0QelhA0Sgt6_ejH4-2AI9qy__q9tlbEIj_nr5VS2vp-P_4vRLzvc1FTDiCcHs8DlMH-l9Qt8DgdjYfKMciZJ4R3No9Ml0ySsDPsIpVcbp-/s400/cable-ferrite.jpg"/></a><center><b>coquille de ferrite pour cable d'alimentation</b></center></div></p>
<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFLWHEr3zJgm_nutOXZlsiB7hMqPGVLUNqJLPvAv4o3V5uyxZxMRTghUsdgPtKfNdX_B2kIiH6XYtuiy6jjCrU6KiTWjFeHwQ6ZwcfDcmz6A5ZdlEhQ6RcywlAkKqnNN19w76Mx2yN-0t7m60QtFheQqrgMJoIkG1-JSAx7VElsxxZ_YCbElWGbs4B/s1890/half-cylinder-coil%282%29.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="1890" data-original-width="1550" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFLWHEr3zJgm_nutOXZlsiB7hMqPGVLUNqJLPvAv4o3V5uyxZxMRTghUsdgPtKfNdX_B2kIiH6XYtuiy6jjCrU6KiTWjFeHwQ6ZwcfDcmz6A5ZdlEhQ6RcywlAkKqnNN19w76Mx2yN-0t7m60QtFheQqrgMJoIkG1-JSAx7VElsxxZ_YCbElWGbs4B/s400/half-cylinder-coil%282%29.jpg"/></a><center><b>Cette inductance permet d'augmenter la surface de détection par rapport à la tige de ferrite utilisée auparavant.</b></center></div>
</p>
<p><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWuc6PyevkckcYZ2n8pxIymkar9PLOUNPdHAHanT7nH-cQLETOd45s44KPyMcQOI9nx0rIHZ6g17Ob_P2kiwzes-U5ibQjBw2-McRXGvUFsO81gYMJKqN8h10jtnh539a8eVY5nMiOawDUwx9H5sxzOySw3-c3Fw-KMeVseYI4-jzrqWMyUiE5sI9Q/s2640/coil-inside-box.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="2640" data-original-width="2310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWuc6PyevkckcYZ2n8pxIymkar9PLOUNPdHAHanT7nH-cQLETOd45s44KPyMcQOI9nx0rIHZ6g17Ob_P2kiwzes-U5ibQjBw2-McRXGvUFsO81gYMJKqN8h10jtnh539a8eVY5nMiOawDUwx9H5sxzOySw3-c3Fw-KMeVseYI4-jzrqWMyUiE5sI9Q/s400/coil-inside-box.jpg"/></a><center><b>ferrite collée dans le fond du boitier avec de l'époxy.</b></center></div></p>
<p><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAjBgu2V0PZIHhuVdP6oWnI0U5w3M2X3qJYvTk82MzjtHcNYFqUaxAV0GR5COyB140nsP7V7o8AyTDlax1HE3aWzhKXVpqxbju32eGFQHJjnwBWtshcmdQgA2aNS7azXk2tMylnCF_NO2sibkL7KZYhgWxXEjM-zZy9ROezY5e2Ax7MNf-TiRWV35O/s2590/box-underneath.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1790" data-original-width="2590" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAjBgu2V0PZIHhuVdP6oWnI0U5w3M2X3qJYvTk82MzjtHcNYFqUaxAV0GR5COyB140nsP7V7o8AyTDlax1HE3aWzhKXVpqxbju32eGFQHJjnwBWtshcmdQgA2aNS7azXk2tMylnCF_NO2sibkL7KZYhgWxXEjM-zZy9ROezY5e2Ax7MNf-TiRWV35O/s400/box-underneath.jpg"/></a><center><b>J'ai découpé 2 fentes dans le fond pour que les extrémités affleurent à l'extérieur du boitier.</b></center></div></p>
<p>
</p>
<p align="center">
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2lUR-6LNHAEPQmCnhFyx-VVI_PUa4lHsenMdalzxfYMfh6w5QhFRTeIXoLkDUcvUalZo4bBTCYjMugR2WLpTUrQI26l3vNtST-QjzSjHELytrQmCgKZGBx0vU3Dfk912G3PiPpti7LJL0Jl6XW240f0w5Q5pP4Xj7pLUmdMIdveaoWfcP-XSHbxXf/s4000/circuit-in-box.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="4000" data-original-width="3110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2lUR-6LNHAEPQmCnhFyx-VVI_PUa4lHsenMdalzxfYMfh6w5QhFRTeIXoLkDUcvUalZo4bBTCYjMugR2WLpTUrQI26l3vNtST-QjzSjHELytrQmCgKZGBx0vU3Dfk912G3PiPpti7LJL0Jl6XW240f0w5Q5pP4Xj7pLUmdMIdveaoWfcP-XSHbxXf/s400/circuit-in-box.jpg"/></a></div>
<center><b>circuit dans la boite</b></center>
</p>
<h3>démonstration</h3>
<p align="center">
<iframe width="560" height="315" src="https://www.youtube.com/embed/4CtvlJR9XQg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
</p>
<p>
source du projet: <a href="https://github.com/Picatout/metal-pointer/tree/main/bare-metal">https://github.com/Picatout/metal-pointer/tree/main/bare-metal</a>
</p>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6513487509010684836.post-44596181176720715332023-04-03T09:23:00.008-04:002023-08-03T20:03:29.723-04:00À l'antipode<p>
De nos jours, à l'aire du numérique, tous les récepteurs radio (ou presque) sont entièrement basés sur la technologie numérique. Autrefois, à l'aire de l'analogique, la sélection des postes de radio se faisait par un circuit accordé à fréquence ajustable. En fait les récepteurs superhétérodyne utilisaient 2 circuits accordés variables, un pour l'oscillateur local et l'autre pour la sélection de la station. Les 2 circuits devaient être adjusés en accord car dans le superhétérodyne la fréquence intermédiaire est obtenu par produit de la fréquence de l'oscillateur local avec la fréquence du signal reçu pour obtenir une fréquence intermédiaire fixe. Donc la différence entre les deux fréquences doit-être constante quel que soit la station sélectionnée.
</p>,
<p>
Dans tous les récepteurs radios de ma jeunesse cet accord se faisait avec un condensateur variable à 2 sections d'axe commun. Donc en tournant le bouton de sélection des stations les plaques mobiles des deux sections tournaient ensemble assurant la synchronisation entre l'oscillateur local et la fréquence de réception.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioWmC0FMJ7-Q5KYDlMs7XQW22DMFPcZTUHX2aCbAF-SRJBFEKLINPkphO1lHvbqE6wDq3FQRWido8d6LoNbw6s03Ui_rSee88ZB4AGvNxItX9M_QqgMGfinQ4irWNmm24PTnEAnc0FjbNvrG8mBNMlAiYMHptmv86byDBRODSNY4liuyfzFVvlBldt/s1600/condensateur-variable.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="225" data-original-width="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioWmC0FMJ7-Q5KYDlMs7XQW22DMFPcZTUHX2aCbAF-SRJBFEKLINPkphO1lHvbqE6wDq3FQRWido8d6LoNbw6s03Ui_rSee88ZB4AGvNxItX9M_QqgMGfinQ4irWNmm24PTnEAnc0FjbNvrG8mBNMlAiYMHptmv86byDBRODSNY4liuyfzFVvlBldt/s1600/condensateur-variable.jpg"/></a><center>condensateur variable pour récepteur superhétérodyne</center></div>
</p>
<p>
Pour voir un <a href="https://youtu.be/HxdXt1LbN0w">condensateur variable en action</a> allez à 3:30 minutes.
</p>
<h3>En Australie il faisait autrement</h3>
<p>
Cependant il semble qu'à l'antipode, c'est à dire en Australie, il faisait autrement. Au lieu d'utiliser un condensateur variable ils utilsaient des inductances variables. En effet la fréquence d'un circuit accordée dépend du produit de la capacitance par l'inductance. la formule:<br>
<b>Fa=1/2π√(LC)</b><br>
Donc pour varier la fréquence de l'accord on a le choix, modifier la valeur de <b>L</b> ou celle de <b>C</b>.
</p>
<p>
Alors que dans l'hémisphère nord on utilisait un condensateur variable il semble qu'à l'antipode ils utilisaient des inductances variables mécaniquement reliées ensemble comme on le voit dans la photo suivante d'un récepteur Astor datant de 1955.
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmJNBlB5YlfBoI7MD0WT8tsLFY76Tb-4jx6c1GSqdJaSPeqTHGazIFljKjWImPHx6QdLptvoCztoTGlgQEUFZ1W1sgMgNBZtnksmE6k9KQmA9wxlfsFjxwoEJJOYQRbYsa89G7fw-CqUTM0ALjGJ30MTldVNtzSSRpiQdjUmdvbtaJ4kAcvT6AzjHk/s1600/Astor-radio.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="460" data-original-width="862" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmJNBlB5YlfBoI7MD0WT8tsLFY76Tb-4jx6c1GSqdJaSPeqTHGazIFljKjWImPHx6QdLptvoCztoTGlgQEUFZ1W1sgMgNBZtnksmE6k9KQmA9wxlfsFjxwoEJJOYQRbYsa89G7fw-CqUTM0ALjGJ30MTldVNtzSSRpiQdjUmdvbtaJ4kAcvT6AzjHk/s1600/Astor-radio.png"/></a><center>récepteur superhétérodyne avec accord par inductance variable</center></div></p><p>
Ce récepteur utilise des inductances à coeur de ferrite. En retirant ou enfoncant les ferrites la valeur des inductances varie ce qui permet la sélection des stations. j'ai annoté la photo extraite d'un vidéo Youtube. Si vous voulez voir le fonctionnement de ce circuit d'accord en action vous pouvez <a href="https://youtu.be/KPv422midyY">visionnez la vidéo</a> en avançant le curseur à 5:30 minutes.
</p>Unknownnoreply@blogger.com0